UNPKG

bm-scaffold-test

Version:

本木前端脚手架

123 lines (113 loc) 4.17 kB
/** * @Author: songqi * @Date: 2016-07-15 * @Email: songqi@benmu-health.com * @Last modified by: songqi * @Last modified time: 2016-11-10 */ var fs = require('fs'), url = require('url'), _ = require('lodash'), path = require('path'), http = require('http'), https = require('https'), readConfig = require('../../utils/readConfig'); function proxyRequest(request, response, next) { var target = request.target ? request.target + '/' : ''; if (request.client.ssl) { var options = url.parse('https://' + target + request.url.slice(1)); options['rejectUnauthorized'] = false; https.request(options, function(remoteRequest) { if (remoteRequest.statusCode === 200) { response.setHeader('Content-Type', remoteRequest.headers['content-type']); remoteRequest.pipe(response); } else { response.writeHead(remoteRequest.statusCode); response.end(); } }).on('error', function(e) { next(); }).end(); } else { var options = url.parse('http://' + target + request.url.slice(1)); http.request(options, function(remoteRequest) { if (remoteRequest.statusCode === 200) { response.setHeader('Content-Type', remoteRequest.headers['content-type']); remoteRequest.pipe(response); } else { response.writeHead(remoteRequest.statusCode); response.end(); } }).on('error', function(e) { next(); }).end(); } }; function testProxy(request, proxyConfig) { if (request.url.slice(0, proxyConfig.route.length) === proxyConfig.route) { request.url = request.url.slice(proxyConfig.route.length); proxyConfig.target && (request.target = proxyConfig.target); return request; } else { return false; } } function Proxy(options) { var config = _.assign({ root: path.join(process.cwd(), '../'), proxy: '' }, { proxy: readConfig.get('proxy') }); return function(request, response, next) { if (!config.proxy || _.isArray(config.proxy) && !config.proxy.length) { next(); return; } if (typeof config.root === 'string') { config.root = [config.root] } else if (!_.isArray(config.root)) { throw new Error('No root specified') } var pathChecks = []; config.root.forEach(function(root, i) { var _isProxy = false, _proxy = false, p = path.resolve(root) + request.url; fs.access(p, function(err) { pathChecks.push(err ? false : true); if (config.root.length == ++i) { var pathExists = pathChecks.some(function(p) { return p; }); if (pathExists) { next(); } else { if (_.isArray(config.proxy)) { _isProxy = config.proxy.some(function(item) { _proxy = testProxy(request, item); if (_proxy) { proxyRequest(_proxy, response, next); return true } }) if (!_isProxy) { next(); } } else if (config.proxy && config.proxy.route) { _proxy = testProxy(request, config.proxy); if (_proxy) { proxyRequest(_proxy, response, next); } else { next(); } } else { next(); } } } }); }) } } module.exports = Proxy