
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
'use strict';
var http = require('http');
var https = require('https');
var url = require('url');
var getRawBody = require('raw-body');
var isUnset = require('./isUnset');
function extend(obj, source, skips) {
if (!source) {
return obj;
}
for (var prop in source) {
if (!skips || skips.indexOf(prop) === -1) {
obj[prop] = source[prop];
}
}
return obj;
}
function parseHost(Container) {
var host = Container.params.host;
var req = Container.user.req;
var options = Container.options;
host = (typeof host === 'function') ? host(req) : host.toString();
if (!host) {
return new Error('Empty host parameter');
}
if (!/http(s)?:\/\//.test(host)) {
host = 'http://' + host;
}
var parsed = url.parse(host);
if (!parsed.hostname) {
return new Error('Unable to parse hostname, possibly missing protocol://?');
}
var ishttps = options.https || parsed.protocol === 'https:';
return {
host: parsed.hostname,
port: parsed.port || (ishttps ? 443 : 80),
module: ishttps ? https : http,
};
}
function reqHeaders(req, options) {
var headers = options.headers || {};
var skipHdrs = [ 'connection', 'content-length' ];
if (!options.preserveHostHdr) {
skipHdrs.push('host');
}
var hds = extend(headers, req.headers, skipHdrs);
hds.connection = 'close';
return hds;
}
function createRequestOptions(req, res, options) {
// prepare proxyRequest
var reqOpt = {
headers: reqHeaders(req, options),
method: req.method,
path: req.path,
params: req.params,
};
if (options.preserveReqSession) {
reqOpt.session = req.session;
}
return Promise.resolve(reqOpt);
}
// extract to bodyContent object
function bodyContent(req, res, options) {
var parseReqBody = isUnset(options.parseReqBody) ? true : options.parseReqBody;
function maybeParseBody(req, limit) {
if (req.body) {
return Promise.resolve(req.body);
} else {
// Returns a promise if no callback specified and global Promise exists.
return getRawBody(req, {
length: req.headers['content-length'],
limit: limit,
});
}
}
if (parseReqBody) {
return maybeParseBody(req, options.limit);
}
}
module.exports = {
create: createRequestOptions,
bodyContent: bodyContent,
parseHost: parseHost
};