mirror of
https://gitee.com/java110/MicroCommunityWeb.git
synced 2026-02-25 06:09:11 +08:00
62 lines
2.5 KiB
JavaScript
Executable File
62 lines
2.5 KiB
JavaScript
Executable File
'use strict';
|
|
|
|
// * Breaks proxying into a series of discrete steps, many of which can be swapped out by authors.
|
|
// * Uses Promises to support async.
|
|
// * Uses a quasi-Global called Container to tidy up the argument passing between the major work-flow steps.
|
|
|
|
var ScopeContainer = require('./lib/scopeContainer');
|
|
var assert = require('assert');
|
|
var debug = require('debug')('express-http-proxy');
|
|
|
|
var buildProxyReq = require('./app/steps/buildProxyReq');
|
|
var copyProxyResHeadersToUserRes = require('./app/steps/copyProxyResHeadersToUserRes');
|
|
var decorateProxyReqBody = require('./app/steps/decorateProxyReqBody');
|
|
var decorateProxyReqOpts = require('./app/steps/decorateProxyReqOpts');
|
|
var decorateUserRes = require('./app/steps/decorateUserRes');
|
|
var decorateUserResHeaders = require('./app/steps/decorateUserResHeaders');
|
|
var filterUserRequest = require('./app/steps/filterUserRequest');
|
|
var handleProxyErrors = require('./app/steps/handleProxyErrors');
|
|
var maybeSkipToNextHandler = require('./app/steps/maybeSkipToNextHandler');
|
|
var prepareProxyReq = require('./app/steps/prepareProxyReq');
|
|
var resolveProxyHost = require('./app/steps/resolveProxyHost');
|
|
var resolveProxyReqPath = require('./app/steps/resolveProxyReqPath');
|
|
var sendProxyRequest = require('./app/steps/sendProxyRequest');
|
|
var sendUserRes = require('./app/steps/sendUserRes');
|
|
|
|
module.exports = function proxy(host, userOptions) {
|
|
assert(host, 'Host should not be empty');
|
|
|
|
return function handleProxy(req, res, next) {
|
|
debug('[start proxy] ' + req.path);
|
|
var container = new ScopeContainer(req, res, next, host, userOptions);
|
|
|
|
filterUserRequest(container)
|
|
.then(buildProxyReq)
|
|
.then(resolveProxyHost)
|
|
.then(decorateProxyReqOpts)
|
|
.then(resolveProxyReqPath)
|
|
.then(decorateProxyReqBody)
|
|
.then(prepareProxyReq)
|
|
.then(sendProxyRequest)
|
|
.then(maybeSkipToNextHandler)
|
|
.then(copyProxyResHeadersToUserRes)
|
|
.then(decorateUserResHeaders)
|
|
.then(decorateUserRes)
|
|
.then(sendUserRes)
|
|
.catch(function (err) {
|
|
// I sometimes reject without an error to shortcircuit the remaining
|
|
// steps and return control to the host application.
|
|
|
|
if (err) {
|
|
var resolver = (container.options.proxyErrorHandler) ?
|
|
container.options.proxyErrorHandler :
|
|
handleProxyErrors;
|
|
resolver(err, res, next);
|
|
} else {
|
|
next();
|
|
}
|
|
});
|
|
};
|
|
};
|
|
|