httpism
Version:
HTTP client with middleware and good defaults
83 lines (69 loc) • 2.35 kB
JavaScript
var merge = require("./merge");
var qs = require('qs');
module.exports.setHeaderTo = function (request, header, value) {
if (!request.headers[header]) {
return request.headers[header] = value;
}
};
var responseBodyTypes = {
json: function(response) {
return contentTypeIs(response, "application/json");
},
text: function(response) {
return contentTypeIsText(response) || contentTypeIs(response, "application/javascript");
},
form: function(response) {
return contentTypeIs(response, "application/x-www-form-urlencoded");
},
stream: function(response) {
return false;
}
};
function contentTypeIs(response, expectedContentType) {
var re = new RegExp("^\\s*" + expectedContentType + "\\s*($|;)");
return re.test(response.headers["content-type"]);
}
function contentTypeIsText(response) {
return contentTypeIs(response, "text/.*");
}
module.exports.shouldParseAs = function(response, type, request, options) {
var contentType = options !== undefined && options.hasOwnProperty(options, "contentType") && options.contentType !== undefined ? options.contentType : undefined;
if (request.options.responseBody) {
return type === request.options.responseBody;
} else {
var bodyType = responseBodyTypes[type];
if (bodyType) {
return bodyType(response);
}
}
};
function extend(object, extension) {
var keys = Object.keys(extension);
for (var n = 0; n < keys.length; n++) {
var key = keys[n];
object[key] = extension[key];
}
return object;
}
exports.extend = extend;
exports.exception = function(request, next) {
return next().then(function(response) {
if (response.statusCode >= 400 && request.options.exceptions !== false) {
var msg = request.method.toUpperCase() + " " + request.url + " => " + response.statusCode + " " + response.statusText;
var error = extend(new Error(msg), response);
throw error;
} else {
return response;
}
});
};
exports.querystring = function(request, next) {
if (request.options.querystring instanceof Object) {
var split = request.url.split("?");
var path = split[0];
var querystring = qs.parse(split[1]);
var mergedQueryString = merge(request.options.querystring, querystring);
request.url = path + "?" + qs.stringify(mergedQueryString);
}
return next();
};