2017-09-03 179 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