3 let assert = require('assert');
4 let http = require('http');
5 let https = require('https');
6 let querystring = require('querystring');
12 this._cookies = new Map;
14 this.configure(server);
19 let scheme = this._server.scheme;
20 let port = this._server.port;
21 let portSuffix = this._server.port == this._server.defaultPort ? '' : `:${port}`;
22 if (path.charAt(0) != '/')
24 return `${scheme}://${this._server.host}${portSuffix}${path}`;
29 assert(server.scheme === 'http' || server.scheme === 'https');
30 assert.equal(typeof(server.host), 'string', 'host should be a string');
31 assert(!server.port || typeof(server.port) == 'number', 'port should be a number');
35 assert.equal(typeof(server.auth), 'object', 'auth should be a dictionary with username and password as keys');
36 assert.equal(typeof(server.auth.username), 'string', 'auth should contain a string username');
37 assert.equal(typeof(server.auth.password), 'string', 'auth should contain a string password');
39 username: server.auth.username,
40 password: server.auth.password,
44 const defaultPort = server.scheme == 'http' ? 80 : 443;
46 scheme: server.scheme,
48 port: server.port || defaultPort,
49 defaultPort: defaultPort,
54 clearCookies() { this._cookies = new Map; }
58 return this.sendHttpRequest(path, 'GET', null, null).then(function (result) {
59 return JSON.parse(result.responseText);
63 getJSONWithStatus(path)
65 return this.getJSON(path).then(function (result) {
66 if (result['status'] != 'OK')
67 return Promise.reject(result);
74 const contentType = 'application/json';
75 const payload = JSON.stringify(data || {});
76 return this.sendHttpRequest(path, 'POST', 'application/json', payload).then(function (result) {
78 return JSON.parse(result.responseText);
80 console.error(result.responseText);
86 postJSONWithStatus(path, data)
88 return this.postJSON(path, data).then(function (result) {
89 if (result['status'] != 'OK')
90 return Promise.reject(result);
95 postFormUrlencodedData(path, data)
97 const contentType = 'application/x-www-form-urlencoded';
98 const payload = querystring.stringify(data);
99 return this.sendHttpRequest(path, 'POST', contentType, payload).then(function (result) {
100 return result.responseText;
104 sendHttpRequest(path, method, contentType, content)
106 let server = this._server;
108 return new Promise(function (resolve, reject) {
110 hostname: server.host,
112 auth: server.auth ? server.auth.username + ':' + server.auth.password : null,
117 let request = (server.scheme == 'http' ? http : https).request(options, function (response) {
118 let responseText = '';
119 response.setEncoding('utf8');
120 response.on('data', function (chunk) { responseText += chunk; });
121 response.on('end', function () {
122 if (response.statusCode != 200) {
123 reject(response.statusCode);
127 if ('set-cookie' in response.headers) {
128 for (const cookie of response.headers['set-cookie']) {
129 var nameValue = cookie.split('=')
130 self._cookies.set(nameValue[0], nameValue[1]);
133 resolve({statusCode: response.statusCode, responseText: responseText});
137 request.on('error', reject);
140 request.setHeader('Content-Type', contentType);
142 if (self._cookies.size) {
143 request.setHeader('Cookie', Array.from(self._cookies.keys()).map(function (key) {
144 return `${key}=${self._cookies.get(key)}`;
149 request.write(content);
156 if (typeof module != 'undefined')
157 module.exports.RemoteAPI = RemoteAPI;