mirror of
https://github.com/http-party/node-http-proxy.git
synced 2025-12-08 20:59:18 +00:00
169 lines
4.7 KiB
JavaScript
169 lines
4.7 KiB
JavaScript
/*
|
|
* http.js: Top level include for node-http-proxy http helpers
|
|
*
|
|
* (C) 2010 Nodejitsu Inc.
|
|
* MIT LICENCE
|
|
*
|
|
*/
|
|
|
|
var assert = require('assert'),
|
|
http = require('http'),
|
|
https = require('https'),
|
|
url = require('url'),
|
|
async = require('async'),
|
|
helpers = require('./index'),
|
|
protocols = helpers.protocols,
|
|
httpProxy = require('../../lib/node-http-proxy');
|
|
|
|
//
|
|
// ### function createServerPair (options, callback)
|
|
// #### @options {Object} Options to create target and proxy server.
|
|
// #### @callback {function} Continuation to respond to when complete.
|
|
//
|
|
// Creates http target and proxy servers
|
|
//
|
|
exports.createServerPair = function (options, callback) {
|
|
async.series([
|
|
//
|
|
// 1. Create the target server
|
|
//
|
|
function createTarget(next) {
|
|
exports.createServer(options.target, next);
|
|
},
|
|
//
|
|
// 2. Create the proxy server
|
|
//
|
|
function createTarget(next) {
|
|
exports.createProxyServer(options.proxy, next);
|
|
}
|
|
], callback);
|
|
};
|
|
|
|
//
|
|
// ### function createServer (options, callback)
|
|
// #### @options {Object} Options for creatig an http server.
|
|
// #### @port {number} Port to listen on
|
|
// #### @output {string} String to write to each HTTP response
|
|
// #### @headers {Object} Headers to assert are sent by `node-http-proxy`.
|
|
// #### @callback {function} Continuation to respond to when complete.
|
|
//
|
|
// Creates a target server that the tests will proxy to.
|
|
//
|
|
exports.createServer = function (options, callback) {
|
|
//
|
|
// Request handler to use in either `http`
|
|
// or `https` server.
|
|
//
|
|
function requestHandler(req, res) {
|
|
if (options.headers) {
|
|
Object.keys(options.headers).forEach(function (key) {
|
|
assert.equal(req.headers[key], options.headers[key]);
|
|
});
|
|
}
|
|
|
|
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
res.write(options.output || 'hello proxy');
|
|
res.end();
|
|
}
|
|
|
|
var server = protocols.target === 'https'
|
|
? https.createServer(helpers.https, requestHandler)
|
|
: http.createServer(requestHandler);
|
|
|
|
server.listen(options.port, function () {
|
|
callback(null, this);
|
|
});
|
|
};
|
|
|
|
//
|
|
// ### function createProxyServer (options, callback)
|
|
// #### @options {Object} Options for creatig an http server.
|
|
// #### @port {number} Port to listen on
|
|
// #### @latency {number} Latency of this server in milliseconds
|
|
// #### @proxy {Object} Options to pass to the HttpProxy.
|
|
// #### @routing {boolean} Enables `httpProxy.RoutingProxy`
|
|
// #### @callback {function} Continuation to respond to when complete.
|
|
//
|
|
// Creates a proxy server that the tests will request against.
|
|
//
|
|
exports.createProxyServer = function (options, callback) {
|
|
if (!options.latency) {
|
|
if (protocols.proxy === 'https') {
|
|
options.proxy.https = helpers.https;
|
|
}
|
|
|
|
return httpProxy
|
|
.createServer(options.proxy)
|
|
.listen(options.port, function () {
|
|
callback(null, this);
|
|
});
|
|
}
|
|
|
|
var server,
|
|
proxy;
|
|
|
|
proxy = options.routing
|
|
? new httpProxy.RoutingProxy(options.proxy)
|
|
: new httpProxy.HttpProxy(options.proxy);
|
|
|
|
//
|
|
// Request handler to use in either `http`
|
|
// or `https` server.
|
|
//
|
|
function requestHandler(req, res) {
|
|
var buffer = httpProxy.buffer(req);
|
|
|
|
setTimeout(function () {
|
|
//
|
|
// Setup options dynamically for `RoutingProxy.prototype.proxyRequest`
|
|
// or `HttpProxy.prototype.proxyRequest`.
|
|
//
|
|
buffer = options.routing ? { buffer: buffer } : buffer;
|
|
proxy.proxyRequest(req, res, buffer);
|
|
}, options.latency);
|
|
}
|
|
|
|
server = protocols.proxy === 'https'
|
|
? https.createServer(helpers.https, requestHandler)
|
|
: http.createServer(requestHandler);
|
|
|
|
server.listen(options.port, function () {
|
|
callback(null, this);
|
|
});
|
|
};
|
|
|
|
//
|
|
// ### function assignPortsToRoutes (routes)
|
|
// #### @routes {Object} Routing table to assign ports to
|
|
//
|
|
// Assigns dynamic ports to the `routes` for runtime testing.
|
|
//
|
|
exports.assignPortsToRoutes = function (routes) {
|
|
Object.keys(routes).forEach(function (source) {
|
|
routes[source] = routes[source].replace('{PORT}', helpers.nextPort);
|
|
});
|
|
|
|
return routes;
|
|
};
|
|
|
|
//
|
|
// ### function parseRoutes (options)
|
|
// #### @options {Object} Options to use when parsing routes
|
|
// #### @protocol {string} Protocol to use in the routes
|
|
// #### @routes {Object} Routes to parse.
|
|
//
|
|
// Returns an Array of fully-parsed URLs for the source and
|
|
// target of `options.routes`.
|
|
//
|
|
exports.parseRoutes = function (options) {
|
|
var protocol = options.protocol || 'http',
|
|
routes = options.routes;
|
|
|
|
return Object.keys(routes).map(function (source) {
|
|
return {
|
|
source: url.parse(protocol + '://' + source),
|
|
target: url.parse(protocol + '://' + routes[source])
|
|
};
|
|
});
|
|
};
|