2017-09-03 175 views
0

我使用代理服务器发送https请求。我想仅通过代理服务器来传递某些信息(不传递到目标服务器)。在做HTTP请求时,这可以通过请求标头容易地完成,但对于HTTPS请求标头被加密,因此使用请求标头不是选项。Node.js - 通过HTTPS发送请求时与代理服务器进行通信

在该未加密的数据被发送到代理服务器 唯一点是与初始CONNECT方法:我的代理服务器使用HTTPS时提供以下选项。这是您必须插入 自定义标题的位置。同样,代理服务器也不能在最终响应中插入额外的 标头。相反,响应头是 连接响应,它看起来像 此之后立即注射:

HTTP/1.1 200建立的连接
X-访问代理服务器-IP:123.456.789.000
最终响应头&体

所以我需要通过CONNECT方法传递标题,并读取CONNECT响应。看起来https-proxy-agent模块将允许指定头文件通过CONNECT请求发送。但是,如何在完成预期请求(例如POST)的同时阅读CONNECT响应?

我不知道如何拦截与request模块或https模块的CONNECT响应。

回答

0

我已经测试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] ] } 

因此添加后如下:curl -X CONNECT localhost:3000

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: (52) Empty reply from server

...但@服务器:

CONNECT 
TLS:ERROR 

正如你可以看到它的拦截CONNECT(即使你有TLS错误,由于测试ENV),

所以,如果你这样做你的(工作)的设置,你将能够拦截它没有TLS:ERROR


对于任何想要使用http的人来说,活动是不同的:server.on('connect', ...

+0

感谢您的回复,但我认为您错误地理解了我的问题。我不控制代理服务器。我是客户端,正在尝试通过HTTPS(使用节点)发送请求,但在获取请求响应之前拦截CONNECT响应。 – Joel