mirror of
https://gitee.com/java110/MicroCommunityWeb.git
synced 2026-02-24 21:59:12 +08:00
114 lines
2.3 KiB
JavaScript
Executable File
114 lines
2.3 KiB
JavaScript
Executable File
'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
|
|
};
|