1

我正在使用代理服务器发送 https 请求。我想只通过代理服务器来回传递某些信息(不传递给目标服务器)。这可以在进行 HTTP 请求时使用请求标头轻松完成,但对于 HTTPS 请求,标头是加密的,因此不能使用请求标头。我的代理服务器在使用 HTTPS 时提供以下选项:

将未加密数据发送到代理服务器的唯一点是使用初始 CONNECT 方法。这是您必须插入自定义标题的地方。同样,代理服务器不能在最终响应中注入额外的标头。相反,响应标头在 Connection 响应之后立即注入,如下所示:

HTTP/1.1 200 连接已建立
X-ProxyServer-IP: 123.456.789.000
最终响应标头和正文

所以我需要使用 CONNECT 方法传递标头,并读取 CONNECT 响应。似乎该https-proxy-agent模块将允许指定要与 CONNECT 请求一起发送的标头。但是我怎样才能读取 CONNECT 响应,同时仍然完成预期的请求(例如 POST)?

我无法弄清楚如何使用request模块或https模块拦截 CONNECT 响应。

4

1 回答 1

1

我已经测试过了https

const https = require('https');
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
var server = https.createServer(function(req,res){res.end('test');}).listen(3000);

如果你console.log(server._events)

{ connection: [ [Function], [Function] ],
  secureConnection: [ [Function: connectionListener], [Function] ],
  request: [Function],
  tlsClientError: [ [Function: addListener], [Function] ] }

所以在添加以下内容后:

server.on('connection',function(req,socket,head){console.log('CONNECT')})
server.on('secureConnection',function(req,socket,head){console.log('CONNECT (secure)')})
server.on('tlsClientError',function(req,socket,head){console.log('TLS:ERROR')})

我测试过:curl -X CONNECT localhost:3000

在这个快速测试中,客户端输出 curl: (52) Empty reply from server:)

...但是@服务器:

CONNECT
TLS:ERROR

如您所见,它拦截了CONNECT(即使您由于测试环境而出现 tls 错误。),

因此,如果您使用(工作)设置执行此操作,您将能够在没有TLS:ERROR


对于任何想与之合作http的人,事件是不同的:server.on('connect', ...

于 2017-09-03T10:05:18.860 回答