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
модуль.
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 из-за тестирования env.),
Поэтому, если вы сделаете это с вашей (рабочей) настройкой, вы сможете перехватить ее без TLS:ERROR
Для тех, кто хочет сделать это с http
Событие отличается: server.on('connect', ...