mirror of
https://github.com/http-party/node-http-proxy.git
synced 2025-12-08 20:59:18 +00:00
Implement rewriting of the location header for responses with status code 201, according to RFC2616 section 10.2.2
108 lines
3.0 KiB
JavaScript
108 lines
3.0 KiB
JavaScript
var url = require('url'),
|
||
passes = exports;
|
||
|
||
var redirectRegex = /^201|30(1|2|7|8)$/;
|
||
|
||
/*!
|
||
* Array of passes.
|
||
*
|
||
* A `pass` is just a function that is executed on `req, res, options`
|
||
* so that you can easily add new checks while still keeping the base
|
||
* flexible.
|
||
*/
|
||
|
||
[ // <--
|
||
|
||
/**
|
||
* If is a HTTP 1.0 request, remove chunk headers
|
||
*
|
||
* @param {ClientRequest} Req Request object
|
||
* @param {IncomingMessage} Res Response object
|
||
* @param {proxyResponse} Res Response object from the proxy request
|
||
*
|
||
* @api private
|
||
*/
|
||
function removeChunked(req, res, proxyRes) {
|
||
if (req.httpVersion === '1.0') {
|
||
delete proxyRes.headers['transfer-encoding'];
|
||
}
|
||
},
|
||
|
||
/**
|
||
* If is a HTTP 1.0 request, set the correct connection header
|
||
* or if connection header not present, then use `keep-alive`
|
||
*
|
||
* @param {ClientRequest} Req Request object
|
||
* @param {IncomingMessage} Res Response object
|
||
* @param {proxyResponse} Res Response object from the proxy request
|
||
*
|
||
* @api private
|
||
*/
|
||
function setConnection(req, res, proxyRes) {
|
||
if (req.httpVersion === '1.0') {
|
||
proxyRes.headers.connection = req.headers.connection || 'close';
|
||
} else if (!proxyRes.headers.connection) {
|
||
proxyRes.headers.connection = req.headers.connection || 'keep-alive';
|
||
}
|
||
},
|
||
|
||
function setRedirectHostRewrite(req, res, proxyRes, options) {
|
||
if ((options.hostRewrite || options.autoRewrite || options.protocolRewrite)
|
||
&& proxyRes.headers['location']
|
||
&& redirectRegex.test(proxyRes.statusCode)) {
|
||
var target = url.parse(options.target);
|
||
var u = url.parse(proxyRes.headers['location']);
|
||
|
||
// make sure the redirected host matches the target host before rewriting
|
||
if (target.host != u.host) {
|
||
return;
|
||
}
|
||
|
||
if (options.hostRewrite) {
|
||
u.host = options.hostRewrite;
|
||
} else if (options.autoRewrite) {
|
||
u.host = req.headers['host'];
|
||
}
|
||
if (options.protocolRewrite) {
|
||
u.protocol = options.protocolRewrite;
|
||
}
|
||
|
||
proxyRes.headers['location'] = u.format();
|
||
}
|
||
},
|
||
/**
|
||
* Copy headers from proxyResponse to response
|
||
* set each header in response object.
|
||
*
|
||
* @param {ClientRequest} Req Request object
|
||
* @param {IncomingMessage} Res Response object
|
||
* @param {proxyResponse} Res Response object from the proxy request
|
||
*
|
||
* @api private
|
||
*/
|
||
function writeHeaders(req, res, proxyRes) {
|
||
Object.keys(proxyRes.headers).forEach(function(key) {
|
||
if(proxyRes.headers[key] != undefined){
|
||
res.setHeader(String(key).trim(), proxyRes.headers[key]);
|
||
}
|
||
});
|
||
},
|
||
|
||
/**
|
||
* Set the statusCode from the proxyResponse
|
||
*
|
||
* @param {ClientRequest} Req Request object
|
||
* @param {IncomingMessage} Res Response object
|
||
* @param {proxyResponse} Res Response object from the proxy request
|
||
*
|
||
* @api private
|
||
*/
|
||
function writeStatusCode(req, res, proxyRes) {
|
||
res.writeHead(proxyRes.statusCode);
|
||
}
|
||
|
||
] // <--
|
||
.forEach(function(func) {
|
||
passes[func.name] = func;
|
||
});
|