aboutsummaryrefslogtreecommitdiffstats
path: root/lib/promise_request.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/promise_request.js')
-rw-r--r--lib/promise_request.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/promise_request.js b/lib/promise_request.js
new file mode 100644
index 0000000..906c16c
--- /dev/null
+++ b/lib/promise_request.js
@@ -0,0 +1,102 @@
+/*
+Copyright(c) 2017 AT&T Intellectual Property. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and limitations under the License.
+*/
+
+ /* Promise-based HTTP request client */
+
+ "use strict";
+
+/*
+ * Make an HTTP request using a string or a readable stream for the body
+ * of the request.
+ * Return a promise for result in the form
+ * {status: <http status code>, body: <response body>}
+ */
+
+const stream = require('stream');
+const request = require('request');
+
+let logger = null;
+
+exports.doRequest = function(options, body) {
+ return new Promise(function(resolve, reject) {
+
+ logger.debug("doRequest: " + JSON.stringify(options));
+ if (body && !(body instanceof stream.Readable)) {
+ // Body is a string, just include it in the request
+ options.body = body;
+ }
+ var req = request(options);
+
+ // Reject promise if there's an error
+ req.on('error', function(error) {
+ logger.debug('Error in on error handler for request: ' + error);
+ reject(error);
+ });
+
+ // Capture the response
+ req.on('response', function(resp) {
+
+ // Collect the body of the response
+ var rbody = '';
+ resp.on('data', function(d) {
+ rbody += d;
+ });
+
+ // resolve or reject when finished
+ resp.on('end', function() {
+
+ var result = {
+ status : resp.statusCode,
+ body : rbody
+ };
+
+ // Add a JSON version of the body if appropriate
+ if (rbody.length > 0) {
+ try {
+ var jbody = JSON.parse(rbody);
+ result.json = jbody;
+ }
+ catch (pe) {
+ // Do nothing, no json property added to the result object
+ }
+ }
+
+ logger.debug(JSON.stringify(result));
+
+ if (resp.statusCode > 199 && resp.statusCode < 300) {
+ // HTTP status code indicates success - resolve the promise
+ logger.debug("do request resolve: " + JSON.stringify(result));
+ resolve(result);
+ }
+ else {
+ // Reject the promise
+ logger.debug("do request reject: " + JSON.stringify(result));
+ reject(result);
+ }
+ });
+ });
+
+ // If there's a readable stream for a body, pipe it to the request
+ if (body && (body instanceof stream.Readable)) {
+ // Pipe the body readable stream into the request
+ body.pipe(req);
+ }
+ });
+};
+
+exports.setLogger = function(logsource) {
+ logger = logsource.getLogger('httprequest');
+};