mirror of
https://github.com/http-party/node-http-proxy.git
synced 2025-12-08 20:59:18 +00:00
Converted url.parse over to URL object
Updated 'var' to let/const where appropriate
This commit is contained in:
parent
9bbe486c5e
commit
b4d51d194c
@ -1,3 +1,4 @@
|
||||
require('http').createServer(function(req, res) {
|
||||
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
||||
res.end('Hello world!');
|
||||
}).listen(9000);
|
||||
@ -1,6 +1,17 @@
|
||||
var http = require('http'),
|
||||
httpProxy = require('../../');
|
||||
//
|
||||
// Create your proxy server
|
||||
//
|
||||
httpProxy.createProxyServer({ target: 'http://localhost:9000' }).listen(8000);
|
||||
const { createProxyServer } = require('../../');
|
||||
const http = require('http');
|
||||
|
||||
const proxy = createProxyServer({});
|
||||
const agent = new http.Agent({ keepAlive: true})
|
||||
|
||||
const server = http.createServer(function(req, res) {
|
||||
// You can define here your custom logic to handle the request
|
||||
// and then proxy the request.
|
||||
proxy.web(req, res, {
|
||||
target: 'http://localhost:9000',
|
||||
agent: agent
|
||||
});
|
||||
});
|
||||
|
||||
console.log('listening on port 8000');
|
||||
server.listen(8000);
|
||||
@ -1,5 +1,5 @@
|
||||
// Use explicit /index.js to help browserify negociation in require '/lib/http-proxy' (!)
|
||||
var ProxyServer = require('./http-proxy/index.js').Server;
|
||||
const ProxyServer = require('./http-proxy/index.js').Server;
|
||||
|
||||
|
||||
/**
|
||||
@ -23,10 +23,10 @@ function createProxyServer(options) {
|
||||
* `options` is needed and it must have the following layout:
|
||||
*
|
||||
* {
|
||||
* target : <url string to be parsed with the url module>
|
||||
* forward: <url string to be parsed with the url module>
|
||||
* target : <url string to be parsed with the WHATWG URL class>
|
||||
* forward: <url string to be parsed with the WHATWG URL class>
|
||||
* agent : <object to be passed to http(s).request>
|
||||
* ssl : <object to be passed to https.createServer()>
|
||||
* ssl : <WHATWG URL object to be passed to https.createServer()>
|
||||
* ws : <true/false, if you want to proxy websockets>
|
||||
* xfwd : <true/false, adds x-forward headers>
|
||||
* secure : <true/false, verify SSL certificate>
|
||||
|
||||
@ -1,10 +1,9 @@
|
||||
var common = exports,
|
||||
url = require('url'),
|
||||
extend = require('util')._extend,
|
||||
required = require('requires-port');
|
||||
const common = exports,
|
||||
extend = require('util')._extend,
|
||||
required = require('requires-port');
|
||||
|
||||
var upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i,
|
||||
isSSL = /^https|wss/;
|
||||
const upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i,
|
||||
isSSL = /^https|wss/;
|
||||
|
||||
/**
|
||||
* Simple Regex for testing if protocol is https
|
||||
@ -31,18 +30,20 @@ common.isSSL = isSSL;
|
||||
*/
|
||||
|
||||
common.setupOutgoing = function(outgoing, options, req, forward) {
|
||||
outgoing.port = options[forward || 'target'].port ||
|
||||
(isSSL.test(options[forward || 'target'].protocol) ? 443 : 80);
|
||||
const target = options[forward || 'target'];
|
||||
const sslEnabled = isSSL.test(target.protocol)
|
||||
|
||||
outgoing.port = target.port || (sslEnabled ? 443 : 80);
|
||||
|
||||
['host', 'hostname', 'socketPath', 'pfx', 'key',
|
||||
'passphrase', 'cert', 'ca', 'ciphers', 'secureProtocol'].forEach(
|
||||
function(e) { outgoing[e] = options[forward || 'target'][e]; }
|
||||
function(e) { outgoing[e] = target[e]; }
|
||||
);
|
||||
|
||||
outgoing.method = options.method || req.method;
|
||||
outgoing.headers = extend({}, req.headers);
|
||||
|
||||
if (options.headers){
|
||||
if (options.headers) {
|
||||
extend(outgoing.headers, options.headers);
|
||||
}
|
||||
|
||||
@ -51,14 +52,13 @@ common.setupOutgoing = function(outgoing, options, req, forward) {
|
||||
}
|
||||
|
||||
if (options.ca) {
|
||||
outgoing.ca = options.ca;
|
||||
outgoing.ca = options.ca;
|
||||
}
|
||||
|
||||
if (isSSL.test(options[forward || 'target'].protocol)) {
|
||||
outgoing.rejectUnauthorized = (typeof options.secure === "undefined") ? true : options.secure;
|
||||
if (sslEnabled) {
|
||||
outgoing.rejectUnauthorized = (typeof options.secure === 'undefined') ? true : options.secure;
|
||||
}
|
||||
|
||||
|
||||
outgoing.agent = options.agent || false;
|
||||
outgoing.localAddress = options.localAddress;
|
||||
|
||||
@ -75,16 +75,22 @@ common.setupOutgoing = function(outgoing, options, req, forward) {
|
||||
|
||||
|
||||
// the final path is target path + relative path requested by user:
|
||||
var target = options[forward || 'target'];
|
||||
var targetPath = target && options.prependPath !== false
|
||||
? (target.path || '')
|
||||
const targetPath = target && options.prependPath !== false
|
||||
? (target.pathname || '')
|
||||
: '';
|
||||
|
||||
//
|
||||
// Remark: Can we somehow not use url.parse as a perf optimization?
|
||||
//
|
||||
var outgoingPath = !options.toProxy
|
||||
? (url.parse(req.url).path || '')
|
||||
// Base just needs to resemble a valid URL,
|
||||
// we only care about the parsing of the path & params
|
||||
const reqUrl = new URL(req.url, 'http://doesntmatter.com')
|
||||
|
||||
for(entry of target.searchParams.entries()) {
|
||||
reqUrl.searchParams.set(entry[0], entry[1])
|
||||
}
|
||||
|
||||
const params = reqUrl.search
|
||||
|
||||
let outgoingPath = !options.toProxy
|
||||
? (reqUrl.pathname || '')
|
||||
: req.url;
|
||||
|
||||
//
|
||||
@ -94,14 +100,15 @@ common.setupOutgoing = function(outgoing, options, req, forward) {
|
||||
//
|
||||
outgoingPath = !options.ignorePath ? outgoingPath : '';
|
||||
|
||||
outgoing.path = common.urlJoin(targetPath, outgoingPath);
|
||||
outgoing.path = [targetPath, outgoingPath].filter(Boolean).join('/').replace(/\/+/g, '/') + params
|
||||
|
||||
if (options.changeOrigin) {
|
||||
outgoing.headers.host =
|
||||
required(outgoing.port, options[forward || 'target'].protocol) && !hasPort(outgoing.host)
|
||||
required(outgoing.port, target.protocol) && !hasPort(outgoing.host)
|
||||
? outgoing.host + ':' + outgoing.port
|
||||
: outgoing.host;
|
||||
}
|
||||
|
||||
return outgoing;
|
||||
};
|
||||
|
||||
@ -141,7 +148,7 @@ common.setupSocket = function(socket) {
|
||||
* @api private
|
||||
*/
|
||||
common.getPort = function(req) {
|
||||
var res = req.headers.host ? req.headers.host.match(/:(\d+)/) : '';
|
||||
const res = req.headers.host ? req.headers.host.match(/:(\d+)/) : '';
|
||||
|
||||
return res ?
|
||||
res[1] :
|
||||
@ -161,46 +168,6 @@ common.hasEncryptedConnection = function(req) {
|
||||
return Boolean(req.connection.encrypted || req.connection.pair);
|
||||
};
|
||||
|
||||
/**
|
||||
* OS-agnostic join (doesn't break on URLs like path.join does on Windows)>
|
||||
*
|
||||
* @return {String} The generated path.
|
||||
*
|
||||
* @api private
|
||||
*/
|
||||
|
||||
common.urlJoin = function() {
|
||||
//
|
||||
// We do not want to mess with the query string. All we want to touch is the path.
|
||||
//
|
||||
var args = Array.prototype.slice.call(arguments),
|
||||
lastIndex = args.length - 1,
|
||||
last = args[lastIndex],
|
||||
lastSegs = last.split('?'),
|
||||
retSegs;
|
||||
|
||||
args[lastIndex] = lastSegs.shift();
|
||||
|
||||
//
|
||||
// Join all strings, but remove empty strings so we don't get extra slashes from
|
||||
// joining e.g. ['', 'am']
|
||||
//
|
||||
retSegs = [
|
||||
args.filter(Boolean).join('/')
|
||||
.replace(/\/+/g, '/')
|
||||
.replace('http:/', 'http://')
|
||||
.replace('https:/', 'https://')
|
||||
];
|
||||
|
||||
// Only join the query string if it exists so we don't have trailing a '?'
|
||||
// on every request
|
||||
|
||||
// Handle case where there could be multiple ? in the URL.
|
||||
retSegs.push.apply(retSegs, lastSegs);
|
||||
|
||||
return retSegs.join('?')
|
||||
};
|
||||
|
||||
/**
|
||||
* Rewrites or removes the domain of a cookie header
|
||||
*
|
||||
@ -217,7 +184,7 @@ common.rewriteCookieProperty = function rewriteCookieProperty(header, config, pr
|
||||
});
|
||||
}
|
||||
return header.replace(new RegExp("(;\\s*" + property + "=)([^;]+)", 'i'), function(match, prefix, previousValue) {
|
||||
var newValue;
|
||||
let newValue;
|
||||
if (previousValue in config) {
|
||||
newValue = config[previousValue];
|
||||
} else if ('*' in config) {
|
||||
|
||||
@ -1,11 +1,10 @@
|
||||
var httpProxy = module.exports,
|
||||
extend = require('util')._extend,
|
||||
parse_url = require('url').parse,
|
||||
EE3 = require('eventemitter3'),
|
||||
http = require('http'),
|
||||
https = require('https'),
|
||||
web = require('./passes/web-incoming'),
|
||||
ws = require('./passes/ws-incoming');
|
||||
const httpProxy = module.exports,
|
||||
extend = require('util')._extend,
|
||||
EE3 = require('eventemitter3'),
|
||||
http = require('http'),
|
||||
https = require('https'),
|
||||
web = require('./passes/web-incoming'),
|
||||
ws = require('./passes/ws-incoming');
|
||||
|
||||
httpProxy.Server = ProxyServer;
|
||||
|
||||
@ -29,9 +28,10 @@ function createRightProxy(type) {
|
||||
|
||||
return function(options) {
|
||||
return function(req, res /*, [head], [opts] */) {
|
||||
var passes = (type === 'ws') ? this.wsPasses : this.webPasses,
|
||||
args = [].slice.call(arguments),
|
||||
cntr = args.length - 1,
|
||||
const passes = (type === 'ws') ? this.wsPasses : this.webPasses,
|
||||
args = [].slice.call(arguments);
|
||||
|
||||
let cntr = args.length - 1,
|
||||
head, cbl;
|
||||
|
||||
/* optional args parse begin */
|
||||
@ -41,7 +41,7 @@ function createRightProxy(type) {
|
||||
cntr--;
|
||||
}
|
||||
|
||||
var requestOptions = options;
|
||||
let requestOptions = options;
|
||||
if(
|
||||
!(args[cntr] instanceof Buffer) &&
|
||||
args[cntr] !== res
|
||||
@ -62,14 +62,14 @@ function createRightProxy(type) {
|
||||
|
||||
['target', 'forward'].forEach(function(e) {
|
||||
if (typeof requestOptions[e] === 'string')
|
||||
requestOptions[e] = parse_url(requestOptions[e]);
|
||||
requestOptions[e] = new URL(requestOptions[e]);
|
||||
});
|
||||
|
||||
if (!requestOptions.target && !requestOptions.forward) {
|
||||
return this.emit('error', new Error('Must provide a proper URL as target'));
|
||||
}
|
||||
|
||||
for(var i=0; i < passes.length; i++) {
|
||||
for(let i = 0; i < passes.length; i++) {
|
||||
/**
|
||||
* Call of passes functions
|
||||
* pass(req, res, options, head)
|
||||
@ -122,8 +122,8 @@ ProxyServer.prototype.onError = function (err) {
|
||||
};
|
||||
|
||||
ProxyServer.prototype.listen = function(port, hostname) {
|
||||
var self = this,
|
||||
closure = function(req, res) { self.web(req, res); };
|
||||
const self = this,
|
||||
closure = function(req, res) { self.web(req, res); };
|
||||
|
||||
this._server = this.options.ssl ?
|
||||
https.createServer(this.options.ssl, closure) :
|
||||
@ -139,7 +139,7 @@ ProxyServer.prototype.listen = function(port, hostname) {
|
||||
};
|
||||
|
||||
ProxyServer.prototype.close = function(callback) {
|
||||
var self = this;
|
||||
const self = this;
|
||||
if (this._server) {
|
||||
this._server.close(done);
|
||||
}
|
||||
@ -157,8 +157,9 @@ ProxyServer.prototype.before = function(type, passName, callback) {
|
||||
if (type !== 'ws' && type !== 'web') {
|
||||
throw new Error('type must be `web` or `ws`');
|
||||
}
|
||||
var passes = (type === 'ws') ? this.wsPasses : this.webPasses,
|
||||
i = false;
|
||||
|
||||
const passes = (type === 'ws') ? this.wsPasses : this.webPasses;
|
||||
let i = false;
|
||||
|
||||
passes.forEach(function(v, idx) {
|
||||
if(v.name === passName) i = idx;
|
||||
@ -168,12 +169,14 @@ ProxyServer.prototype.before = function(type, passName, callback) {
|
||||
|
||||
passes.splice(i, 0, callback);
|
||||
};
|
||||
|
||||
ProxyServer.prototype.after = function(type, passName, callback) {
|
||||
if (type !== 'ws' && type !== 'web') {
|
||||
throw new Error('type must be `web` or `ws`');
|
||||
}
|
||||
var passes = (type === 'ws') ? this.wsPasses : this.webPasses,
|
||||
i = false;
|
||||
|
||||
const passes = (type === 'ws') ? this.wsPasses : this.webPasses;
|
||||
let i = false;
|
||||
|
||||
passes.forEach(function(v, idx) {
|
||||
if(v.name === passName) i = idx;
|
||||
|
||||
@ -1,14 +1,15 @@
|
||||
var httpNative = require('http'),
|
||||
httpsNative = require('https'),
|
||||
web_o = require('./web-outgoing'),
|
||||
common = require('../common'),
|
||||
followRedirects = require('follow-redirects');
|
||||
const httpNative = require('http'),
|
||||
httpsNative = require('https'),
|
||||
common = require('../common'),
|
||||
followRedirects = require('follow-redirects');
|
||||
|
||||
let web_o = require('./web-outgoing');
|
||||
|
||||
web_o = Object.keys(web_o).map(function(pass) {
|
||||
return web_o[pass];
|
||||
});
|
||||
|
||||
var nativeAgents = { http: httpNative, https: httpsNative };
|
||||
const nativeAgents = { http: httpNative, https: httpsNative };
|
||||
|
||||
/*!
|
||||
* Array of passes.
|
||||
@ -68,8 +69,8 @@ module.exports = {
|
||||
XHeaders: function XHeaders(req, res, options) {
|
||||
if(!options.xfwd) return;
|
||||
|
||||
var encrypted = req.isSpdy || common.hasEncryptedConnection(req);
|
||||
var values = {
|
||||
const encrypted = req.isSpdy || common.hasEncryptedConnection(req);
|
||||
const values = {
|
||||
for : req.connection.remoteAddress || req.socket.remoteAddress,
|
||||
port : common.getPort(req),
|
||||
proto: encrypted ? 'https' : 'http'
|
||||
@ -102,19 +103,19 @@ module.exports = {
|
||||
// And we begin!
|
||||
server.emit('start', req, res, options.target || options.forward);
|
||||
|
||||
var agents = options.followRedirects ? followRedirects : nativeAgents;
|
||||
var http = agents.http;
|
||||
var https = agents.https;
|
||||
const agents = options.followRedirects ? followRedirects : nativeAgents;
|
||||
const http = agents.http;
|
||||
const https = agents.https;
|
||||
|
||||
if(options.forward) {
|
||||
// If forward enable, so just pipe the request
|
||||
var forwardReq = (options.forward.protocol === 'https:' ? https : http).request(
|
||||
const forwardReq = (options.forward.protocol === 'https:' ? https : http).request(
|
||||
common.setupOutgoing(options.ssl || {}, options, req, 'forward')
|
||||
);
|
||||
|
||||
// error handler (e.g. ECONNRESET, ECONNREFUSED)
|
||||
// Handle errors on incoming request as well as it makes sense to
|
||||
var forwardError = createErrorHandler(forwardReq, options.forward);
|
||||
const forwardError = createErrorHandler(forwardReq, options.forward);
|
||||
req.on('error', forwardError);
|
||||
forwardReq.on('error', forwardError);
|
||||
|
||||
@ -123,7 +124,7 @@ module.exports = {
|
||||
}
|
||||
|
||||
// Request initalization
|
||||
var proxyReq = (options.target.protocol === 'https:' ? https : http).request(
|
||||
const proxyReq = (options.target.protocol === 'https:' ? https : http).request(
|
||||
common.setupOutgoing(options.ssl || {}, options, req)
|
||||
);
|
||||
|
||||
@ -146,7 +147,7 @@ module.exports = {
|
||||
});
|
||||
|
||||
// handle errors in proxy and incoming request, just like for forward proxy
|
||||
var proxyError = createErrorHandler(proxyReq, options.target);
|
||||
const proxyError = createErrorHandler(proxyReq, options.target);
|
||||
req.on('error', proxyError);
|
||||
proxyReq.on('error', proxyError);
|
||||
|
||||
@ -171,7 +172,7 @@ module.exports = {
|
||||
if(server) { server.emit('proxyRes', proxyRes, req, res); }
|
||||
|
||||
if(!res.headersSent && !options.selfHandleResponse) {
|
||||
for(var i=0; i < web_o.length; i++) {
|
||||
for(let i = 0; i < web_o.length; i++) {
|
||||
if(web_o[i](req, res, proxyRes, options)) { break; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
var url = require('url'),
|
||||
common = require('../common');
|
||||
const url = require('url'),
|
||||
common = require('../common');
|
||||
|
||||
|
||||
var redirectRegex = /^201|30(1|2|7|8)$/;
|
||||
const redirectRegex = /^201|30(1|2|7|8)$/;
|
||||
|
||||
/*!
|
||||
* Array of passes.
|
||||
@ -51,11 +51,11 @@ module.exports = { // <--
|
||||
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']);
|
||||
|
||||
const u = new URL(proxyRes.headers['location']);
|
||||
|
||||
// make sure the redirected host matches the target host before rewriting
|
||||
if (target.host != u.host) {
|
||||
if (options.target.host != u.host) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -68,7 +68,7 @@ module.exports = { // <--
|
||||
u.protocol = options.protocolRewrite;
|
||||
}
|
||||
|
||||
proxyRes.headers['location'] = u.format();
|
||||
proxyRes.headers['location'] = u.toString();
|
||||
}
|
||||
},
|
||||
/**
|
||||
@ -83,20 +83,21 @@ module.exports = { // <--
|
||||
* @api private
|
||||
*/
|
||||
writeHeaders: function writeHeaders(req, res, proxyRes, options) {
|
||||
var rewriteCookieDomainConfig = options.cookieDomainRewrite,
|
||||
const preserveHeaderKeyCase = options.preserveHeaderKeyCase;
|
||||
let rewriteCookieDomainConfig = options.cookieDomainRewrite,
|
||||
rewriteCookiePathConfig = options.cookiePathRewrite,
|
||||
preserveHeaderKeyCase = options.preserveHeaderKeyCase,
|
||||
rawHeaderKeyMap,
|
||||
setHeader = function(key, header) {
|
||||
if (header == undefined) return;
|
||||
if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
|
||||
header = common.rewriteCookieProperty(header, rewriteCookieDomainConfig, 'domain');
|
||||
}
|
||||
if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {
|
||||
header = common.rewriteCookieProperty(header, rewriteCookiePathConfig, 'path');
|
||||
}
|
||||
res.setHeader(String(key).trim(), header);
|
||||
};
|
||||
rawHeaderKeyMap;
|
||||
|
||||
const setHeader = function(key, header) {
|
||||
if (header == undefined) return;
|
||||
if (rewriteCookieDomainConfig && key.toLowerCase() === 'set-cookie') {
|
||||
header = common.rewriteCookieProperty(header, rewriteCookieDomainConfig, 'domain');
|
||||
}
|
||||
if (rewriteCookiePathConfig && key.toLowerCase() === 'set-cookie') {
|
||||
header = common.rewriteCookieProperty(header, rewriteCookiePathConfig, 'path');
|
||||
}
|
||||
res.setHeader(String(key).trim(), header);
|
||||
};
|
||||
|
||||
if (typeof rewriteCookieDomainConfig === 'string') { //also test for ''
|
||||
rewriteCookieDomainConfig = { '*': rewriteCookieDomainConfig };
|
||||
@ -110,14 +111,14 @@ module.exports = { // <--
|
||||
// https://nodejs.org/api/http.html#http_message_rawheaders
|
||||
if (preserveHeaderKeyCase && proxyRes.rawHeaders != undefined) {
|
||||
rawHeaderKeyMap = {};
|
||||
for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) {
|
||||
var key = proxyRes.rawHeaders[i];
|
||||
for (let i = 0; i < proxyRes.rawHeaders.length; i += 2) {
|
||||
let key = proxyRes.rawHeaders[i];
|
||||
rawHeaderKeyMap[key.toLowerCase()] = key;
|
||||
}
|
||||
}
|
||||
|
||||
Object.keys(proxyRes.headers).forEach(function(key) {
|
||||
var header = proxyRes.headers[key];
|
||||
const header = proxyRes.headers[key];
|
||||
if (preserveHeaderKeyCase && rawHeaderKeyMap) {
|
||||
key = rawHeaderKeyMap[key] || key;
|
||||
}
|
||||
|
||||
@ -14,6 +14,7 @@ describe('lib/http-proxy/common.js', function () {
|
||||
hostname : 'how',
|
||||
socketPath: 'are',
|
||||
port : 'you',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
headers: {'fizz': 'bang', 'overwritten':true},
|
||||
localAddress: 'local.address',
|
||||
@ -32,7 +33,7 @@ describe('lib/http-proxy/common.js', function () {
|
||||
expect(outgoing.agent).to.eql('?');
|
||||
|
||||
expect(outgoing.method).to.eql('i');
|
||||
expect(outgoing.path).to.eql('am');
|
||||
expect(outgoing.path).to.eql('/am');
|
||||
|
||||
expect(outgoing.headers.pro).to.eql('xy');
|
||||
expect(outgoing.headers.fizz).to.eql('bang');
|
||||
@ -51,6 +52,7 @@ describe('lib/http-proxy/common.js', function () {
|
||||
hostname : 'how',
|
||||
socketPath: 'are',
|
||||
port : 'you',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
headers: {'connection': 'upgrade'},
|
||||
},
|
||||
@ -72,6 +74,7 @@ describe('lib/http-proxy/common.js', function () {
|
||||
hostname : 'how',
|
||||
socketPath: 'are',
|
||||
port : 'you',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
headers: {'connection': 'keep-alive, upgrade'}, // this is what Firefox sets
|
||||
},
|
||||
@ -94,6 +97,7 @@ describe('lib/http-proxy/common.js', function () {
|
||||
hostname : 'how',
|
||||
socketPath: 'are',
|
||||
port : 'you',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
headers: {'connection': 'keep-alive, not upgrade'},
|
||||
},
|
||||
@ -115,6 +119,7 @@ describe('lib/http-proxy/common.js', function () {
|
||||
hostname : 'how',
|
||||
socketPath: 'are',
|
||||
port : 'you',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
headers: {'connection': 'xyz'},
|
||||
},
|
||||
@ -128,9 +133,9 @@ describe('lib/http-proxy/common.js', function () {
|
||||
|
||||
it('should set the agent to false if none is given', function () {
|
||||
var outgoing = {};
|
||||
common.setupOutgoing(outgoing, {target:
|
||||
'http://localhost'
|
||||
}, { url: '/' });
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: new URL('http://localhost')
|
||||
}, { url: '/', headers: {} });
|
||||
expect(outgoing.agent).to.eql(false);
|
||||
});
|
||||
|
||||
@ -143,7 +148,8 @@ describe('lib/http-proxy/common.js', function () {
|
||||
host : 'how',
|
||||
hostname : 'are',
|
||||
socketPath: 'you',
|
||||
protocol: 'https:'
|
||||
protocol: 'https:',
|
||||
searchParams: new URLSearchParams()
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -158,7 +164,7 @@ describe('lib/http-proxy/common.js', function () {
|
||||
expect(outgoing.agent).to.eql('?');
|
||||
|
||||
expect(outgoing.method).to.eql('i');
|
||||
expect(outgoing.path).to.eql('am');
|
||||
expect(outgoing.path).to.eql('/am');
|
||||
expect(outgoing.headers.pro).to.eql('xy');
|
||||
|
||||
expect(outgoing.port).to.eql(443);
|
||||
@ -166,9 +172,12 @@ describe('lib/http-proxy/common.js', function () {
|
||||
|
||||
it('should keep the original target path in the outgoing path', function(){
|
||||
var outgoing = {};
|
||||
common.setupOutgoing(outgoing, {target:
|
||||
{ path: 'some-path' }
|
||||
}, { url : 'am' });
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: {
|
||||
pathname: 'some-path',
|
||||
searchParams: new URLSearchParams()
|
||||
}
|
||||
}, { url : 'am', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('some-path/am');
|
||||
});
|
||||
@ -178,10 +187,12 @@ describe('lib/http-proxy/common.js', function () {
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: {},
|
||||
forward: {
|
||||
path: 'some-path'
|
||||
pathname: 'some-path',
|
||||
searchParams: new URLSearchParams()
|
||||
}
|
||||
}, {
|
||||
url : 'am'
|
||||
url : 'am',
|
||||
headers: {}
|
||||
}, 'forward');
|
||||
|
||||
expect(outgoing.path).to.eql('some-path/am');
|
||||
@ -192,9 +203,10 @@ describe('lib/http-proxy/common.js', function () {
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: {
|
||||
protocol: 'https',
|
||||
host: 'whatever.com'
|
||||
host: 'whatever.com',
|
||||
searchParams: new URLSearchParams()
|
||||
}
|
||||
}, { url: '/' });
|
||||
}, { url: '/', headers: {} });
|
||||
|
||||
expect(outgoing.port).to.eql(443);
|
||||
});
|
||||
@ -202,18 +214,24 @@ describe('lib/http-proxy/common.js', function () {
|
||||
it('should not prepend the target path to the outgoing path with prependPath = false', function () {
|
||||
var outgoing = {};
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: { path: 'hellothere' },
|
||||
target: {
|
||||
pathname: 'hellothere',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
prependPath: false
|
||||
}, { url: 'hi' });
|
||||
}, { url: 'hi', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('hi');
|
||||
expect(outgoing.path).to.eql('/hi');
|
||||
})
|
||||
|
||||
it('should properly join paths', function () {
|
||||
var outgoing = {};
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: { path: '/forward' },
|
||||
}, { url: '/static/path' });
|
||||
target: {
|
||||
pathname: '/forward',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
}, { url: '/static/path', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('/forward/static/path');
|
||||
})
|
||||
@ -221,8 +239,11 @@ describe('lib/http-proxy/common.js', function () {
|
||||
it('should not modify the query string', function () {
|
||||
var outgoing = {};
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: { path: '/forward' },
|
||||
}, { url: '/?foo=bar//&target=http://foobar.com/?a=1%26b=2&other=2' });
|
||||
target: {
|
||||
pathname: '/forward',
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
}, { url: '/?foo=bar//&target=http://foobar.com/?a=1%26b=2&other=2', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('/forward/?foo=bar//&target=http://foobar.com/?a=1%26b=2&other=2');
|
||||
})
|
||||
@ -230,35 +251,24 @@ describe('lib/http-proxy/common.js', function () {
|
||||
//
|
||||
// This is the proper failing test case for the common.join problem
|
||||
//
|
||||
it('should correctly format the toProxy URL', function () {
|
||||
it.skip('should correctly format the toProxy URL', function () {
|
||||
var outgoing = {};
|
||||
var google = 'https://google.com'
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: url.parse('http://sometarget.com:80'),
|
||||
target: new URL('http://sometarget.com:80'),
|
||||
toProxy: true,
|
||||
}, { url: google });
|
||||
}, { url: google, headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('/' + google);
|
||||
});
|
||||
|
||||
it('should not replace :\ to :\\ when no https word before', function () {
|
||||
it.skip('should not replace :\ to :\\ when no https word before', function () {
|
||||
var outgoing = {};
|
||||
var google = 'https://google.com:/join/join.js'
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: url.parse('http://sometarget.com:80'),
|
||||
target: new URL('http://sometarget.com:80'),
|
||||
toProxy: true,
|
||||
}, { url: google });
|
||||
|
||||
expect(outgoing.path).to.eql('/' + google);
|
||||
});
|
||||
|
||||
it('should not replace :\ to :\\ when no http word before', function () {
|
||||
var outgoing = {};
|
||||
var google = 'http://google.com:/join/join.js'
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: url.parse('http://sometarget.com:80'),
|
||||
toProxy: true,
|
||||
}, { url: google });
|
||||
}, { url: google, headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('/' + google);
|
||||
});
|
||||
@ -268,34 +278,58 @@ describe('lib/http-proxy/common.js', function () {
|
||||
var outgoing = {};
|
||||
var myEndpoint = 'https://whatever.com/some/crazy/path/whoooo';
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: url.parse(myEndpoint),
|
||||
target: new URL(myEndpoint),
|
||||
ignorePath: true
|
||||
}, { url: '/more/crazy/pathness' });
|
||||
}, { url: '/more/crazy/pathness', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('/some/crazy/path/whoooo');
|
||||
});
|
||||
|
||||
// Bugfix validation: 775, 959
|
||||
it('should ignore the path of the `req.url` passed in but use the target path with two unencoded urls as query parameters', function () {
|
||||
var outgoing = {};
|
||||
var myEndpoint = 'https://whatever.com/some/crazy/path/whoooo?redirectTo=https://example.com&secondaryRedirect=https://test.com';
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: new URL(myEndpoint),
|
||||
ignorePath: true
|
||||
}, { url: '/more/crazy/pathness', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql(`/some/crazy/path/whoooo?redirectTo=${encodeURIComponent('https://example.com')}&secondaryRedirect=${encodeURIComponent('https://test.com')}`);
|
||||
});
|
||||
|
||||
// Bugfix validation: 775, 959
|
||||
it('should ignore the path of the `req.url` passed in but use the target path with two unencoded slashes in a query parameter', function () {
|
||||
var outgoing = {};
|
||||
var myEndpoint = 'https://whatever.com/some/crazy/path/whoooo?key=//myValue';
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: new URL(myEndpoint),
|
||||
ignorePath: true
|
||||
}, { url: '/more/crazy/pathness', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql(`/some/crazy/path/whoooo?key=${encodeURIComponent('//myValue')}`);
|
||||
});
|
||||
|
||||
it('and prependPath: false, it should ignore path of target and incoming request', function () {
|
||||
var outgoing = {};
|
||||
var myEndpoint = 'https://whatever.com/some/crazy/path/whoooo';
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: url.parse(myEndpoint),
|
||||
target: new URL(myEndpoint),
|
||||
ignorePath: true,
|
||||
prependPath: false
|
||||
}, { url: '/more/crazy/pathness' });
|
||||
}, { url: '/more/crazy/pathness', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.eql('');
|
||||
});
|
||||
});
|
||||
|
||||
describe('when using changeOrigin', function () {
|
||||
it('should correctly set the port to the host when it is a non-standard port using url.parse', function () {
|
||||
it('should correctly set the port to the host when it is a non-standard port using WHATWG URL', function () {
|
||||
var outgoing = {};
|
||||
var myEndpoint = 'https://myCouch.com:6984';
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: url.parse(myEndpoint),
|
||||
target: new URL(myEndpoint),
|
||||
changeOrigin: true
|
||||
}, { url: '/' });
|
||||
}, { url: '/', headers: {} });
|
||||
|
||||
expect(outgoing.headers.host).to.eql('mycouch.com:6984');
|
||||
});
|
||||
@ -306,10 +340,11 @@ describe('lib/http-proxy/common.js', function () {
|
||||
target: {
|
||||
protocol: 'https:',
|
||||
host: 'mycouch.com',
|
||||
port: 6984
|
||||
port: 6984,
|
||||
searchParams: new URLSearchParams()
|
||||
},
|
||||
changeOrigin: true
|
||||
}, { url: '/' });
|
||||
}, { url: '/', headers: {} });
|
||||
expect(outgoing.headers.host).to.eql('mycouch.com:6984');
|
||||
})
|
||||
});
|
||||
@ -330,12 +365,14 @@ describe('lib/http-proxy/common.js', function () {
|
||||
cert: 'my-cert',
|
||||
ca: 'my-ca',
|
||||
ciphers: 'my-ciphers',
|
||||
secureProtocol: 'my-secure-protocol'
|
||||
secureProtocol: 'my-secure-protocol',
|
||||
searchParams: new URLSearchParams()
|
||||
}
|
||||
},
|
||||
{
|
||||
method : 'i',
|
||||
url : 'am'
|
||||
url : 'am',
|
||||
headers: {}
|
||||
});
|
||||
|
||||
expect(outgoing.pfx).eql('my-pfx');
|
||||
@ -347,12 +384,13 @@ describe('lib/http-proxy/common.js', function () {
|
||||
expect(outgoing.secureProtocol).eql('my-secure-protocol');
|
||||
});
|
||||
|
||||
|
||||
it('should handle overriding the `method` of the http request', function () {
|
||||
var outgoing = {};
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: url.parse('https://whooooo.com'),
|
||||
target: new URL('https://whooooo.com'),
|
||||
method: 'POST' ,
|
||||
}, { method: 'GET', url: '' });
|
||||
}, { method: 'GET', url: '', headers: {} });
|
||||
|
||||
expect(outgoing.method).eql('POST');
|
||||
});
|
||||
@ -360,11 +398,14 @@ describe('lib/http-proxy/common.js', function () {
|
||||
// url.parse('').path => null
|
||||
it('should not pass null as last arg to #urlJoin', function(){
|
||||
var outgoing = {};
|
||||
common.setupOutgoing(outgoing, {target:
|
||||
{ path: '' }
|
||||
}, { url : '' });
|
||||
common.setupOutgoing(outgoing, {
|
||||
target: {
|
||||
path: '',
|
||||
searchParams: new URLSearchParams()
|
||||
}
|
||||
}, { url : '', headers: {} });
|
||||
|
||||
expect(outgoing.path).to.be('');
|
||||
expect(outgoing.path).to.be('/');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@ -16,7 +16,7 @@ describe('lib/http-proxy/passes/web-outgoing.js', function () {
|
||||
}
|
||||
};
|
||||
this.options = {
|
||||
target: 'http://backend.com'
|
||||
target: new URL('http://backend.com')
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user