UNPKG

2.55 kBJavaScriptView Raw
1/*!
2 * apiai
3 * Copyright(c) 2015 http://api.ai/
4 * Apache 2.0 Licensed
5 */
6
7'use strict';
8
9var EventEmitter = require('events').EventEmitter;
10var util = require('util');
11var https = require('https');
12var http = require('http');
13
14var ServerError = require('./exceptions').ServerError;
15
16exports.Request = module.exports.Request = Request;
17
18util.inherits(Request, EventEmitter);
19
20function Request (application, options) {
21 var self = this;
22
23 self.clientAccessToken = application.clientAccessToken;
24
25 self.hostname = application.hostname;
26
27 self.endpoint = options.endpoint;
28 self.requestSource = application.requestSource;
29
30 var _http = application.secure ? https : http;
31
32 var requestOptions = self._requestOptions();
33
34 requestOptions.agent = application._agent;
35
36 var request = _http.request(requestOptions, function(response) {
37 var body = '';
38
39 response.on('data', function(chunk) {
40 body += chunk;
41 });
42
43 response.on('end', function() {
44 if (response.statusCode >= 200 && response.statusCode <= 299) {
45 try {
46 var json_body = JSON.parse(body);
47 self.emit('response', json_body);
48 } catch (error) {
49 // JSON.parse can throw only one exception, SyntaxError
50 // All another exceptions throwing from user function,
51 // because it just rethrowing for better error handling.
52
53 if (error instanceof SyntaxError) {
54 self.emit('error', error);
55 } else {
56 throw error;
57 }
58 }
59 } else {
60 var error = new ServerError(response.statusCode, body, 'Wrong response status code.');
61 self.emit('error', error);
62 }
63 });
64 });
65
66 request.on('error', function(error) {
67 self.emit('error', error);
68 });
69
70 self.request = request;
71}
72
73Request.prototype._headers = function() {
74 var self = this;
75
76 return {
77 'Accept': 'application/json',
78 'Authorization': 'Bearer ' + self.clientAccessToken,
79 'api-request-source': self.requestSource
80 };
81};
82
83Request.prototype._requestOptions = function() {
84 var self = this;
85
86 return {
87 hostname: self.hostname,
88 headers: self._headers()
89 };
90};
91
92Request.prototype.write = function(chunk) {
93 this.request.write(chunk);
94};
95
96Request.prototype.end = function() {
97 this.request.end();
98};