|
|
'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) { |
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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 { |
|
|
|
|
|
|
|
|
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 |
|
|
}; |
|
|
|