Node.js - Комуникация само с прокси сървър, докато правите заявка през HTTPS

Изпращам https заявки с помощта на прокси сървър. Искам да предавам определена информация напред и назад само с прокси сървъра (не се предава на целевия сървър). Това може да се направи лесно със заглавки на заявки, когато правите HTTP заявки, но за HTTPS заявки заглавките са криптирани, така че използването на заглавки на заявки не е опция. Моят прокси сървър предоставя следната опция при използване на HTTPS:

Единствената точка, в която некриптирани данни се изпращат към прокси сървъра, е с първоначалния метод CONNECT. Това е мястото, където трябва да вмъкнете персонализираните заглавки. По същия начин прокси сървърът не може да инжектира допълнителен хедър в крайния отговор. Вместо това, заглавката на отговора се инжектира веднага след отговора на връзката, който изглежда така:

HTTP/1.1 200 Установена връзка
X-ProxyServer-IP: 123.456.789.000
заглавки и тяло на крайния отговор

Така че трябва да предам заглавки с метода CONNECT и да прочета отговора CONNECT. Изглежда, че модулът https-proxy-agent ще позволи указване на заглавки, които да бъдат изпратени специално със заявката CONNECT. Но как мога да прочета отговора на CONNECT, докато все още изпълнявам желаната заявка (напр. POST)?

Не мога да разбера как да прихвана отговора CONNECT нито с модула request, нито с модула https.


person Joel    schedule 03.09.2017    source източник


Отговори (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', ...

person EMX    schedule 03.09.2017
comment
Благодаря за отговора, но мисля, че не сте разбрали въпроса ми. Не контролирам прокси сървъра. Аз съм клиентът и се опитвам да изпратя заявка чрез HTTPS (използвайки възел), но прихващам отговора CONNECT, преди да получа отговора на заявката. - person Joel; 03.09.2017