具有自定义Http代理和Connect.js中间件的Node.js代理

我已经在Node中放置了一个代理服务器,它需要能够通过tls传输https请求,而且所有的工作。 使用以下两个包,这是非常容易设置: 代理 , HTTPS代理代理 。 我的问题是,我试图捕获HAR文件使用连接作为中间件层,我得到以下错误:

_http_outgoing.js:357 throw new Error('Can\'t set headers after they are sent.'); ^ Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11) at ServerResponse.writeHead (_http_server.js:180:21) at ClientRequest.<anonymous> (/.../node_modules/proxy/proxy.js:233:11) at emitOne (events.js:96:13) at ClientRequest.emit (events.js:188:7) at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:473:21) at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23) at Socket.socketOnData (_http_client.js:362:20) at emitOne (events.js:96:13) at Socket.emit (events.js:188:7) 

就像下面这样简单,只有当我通过本地浏览器使用连接和代理(这个代理实际上正在和BrowserStackLocal一起使用 )时才会发生。 当我从本地机器浏览器以外的任何地方通过代理时,就像它甚至不知道中间件的存在。

所以基本上,我只需要在这种情况下连接工作,我不知道如果我需要暂停和恢复,或者什么…任何想法将不胜感激。 基本代码如下:

 const path = require('path'); const http = require('http'); const proxy = require('proxy'); const Agent = require('https-proxy-agent'); const connect = require('connect'); const har = require('./har'); const middleware = connect(); middleware.use(har({ harOutputDir: path.resolve(process.cwd(), 'har/') })); const server = proxy(http.createServer(middleware)); server.agent = new Agent('http://localhost:8081'); server.listen(8081) 

谢谢!

编辑:只是一个说明:har中间件根本不修改标题。

proxy一直没有维护。 构build不通过,最后提交不通过testing。 你所build立的堆栈跟踪的来源是233行 – 来自这里的车库代码。

写一个类似的代理是微不足道的。 以下代码说明如何创build一个。

 const http = require('http'); const urlP = require('url'); const proxiedServer = 'http://localhost:8888'; // Proxy server http.createServer((req, res) => { console.log(`Proxy: Got ${req.url}`); const _r = http.request( Object.assign( {}, urlP.parse(proxiedServer), { method: req.method, path: req.url } ), _res => { res.writeHead(_res.statusCode, _res.headers); _res.pipe(res); } ); req.pipe(_r); }).listen(3124, () => { console.log("Listening on 3124"); }); // Regular server. Could be Express http.createServer((req, res) => { console.log('Proxied server: ', req.url); let b = ''; req.on('data', c => { b += c; }); req.on('end', () => { console.log('Proxied server: ', b); }); res.writeHead(200); res.end('ok'); }).listen(8888, () => { console.log('proxied server listening on 8888'); }); 

您使用自己的自定义代理的代码如下所示:

 const urlP = require('url'); const path = require('path'); const http = require('http'); const connect = require('connect'); const har = require('./har'); const proxiedServer = 'http://localhost:8888'; // Proxy server http.createServer((req, res) => { console.log(`Proxy: Got ${req.url}`); const _r = http.request( Object.assign( {}, urlP.parse(proxiedServer), { method: req.method, path: req.url } ), _res => { res.writeHead(_res.statusCode, _res.headers); _res.pipe(res); } ); req.pipe(_r); }).listen(3124, () => { console.log("Listening on 3124"); }); const middleware = connect(); middleware.use(har({ harOutputDir: path.resolve(process.cwd(), 'har/') })); middleware.use((req, res) => { console.log('Proxied server: ', req.url); let b = ''; req.on('data', c => { b += c; }); req.on('end', () => { console.log('Proxied server: ', b); }); res.writeHead(200); res.end('ok'); }); http.createServer(middleware).listen(8888, () => { console.log('proxied server listening on 8888'); });