Модуль http Node.js не получает WS-запрос (используя https-proxy-agent)
Концепция проста: создание http-сервера, который перенаправляет запрос websocket на другой порт.
Вот код на моей стороне сервера:
http.createServer(onRequest).listen(9999);
function onRequest(request, response) {
console.log(request);
...
}
Поэтому, если http-сервер вообще получает какой-либо запрос, он должен распечатать запрос в консоли.
Затем на стороне клиента (также приложение node.js) код выглядит так:
var HttpsProxyAgent = require('https-proxy-agent');
var WebSocket = require('ws');
...
var proxy = `http://${config.proxy.host}:${config.proxy.port}`;
var options = url.parse(proxy);
agent = new HttpsProxyAgent(options);
ws = new WebSocket(target, {
protocol: 'binary',
agent: agent
});
Теперь, когда я использую Charles для перехвата запроса, клиент действительно отправил запрос, вот форма завитка, захваченная Charles:
curl -H 'Хост: target.host.com:8080' -X CONNECT ' https://target.host.com:8080/'
проблема в том, что
function onRequest(request, response) {
console.log(request);
...
}
на самом деле не получил -X CONNECT 'https://proxy.host.com:9999'
запрос, или, по крайней мере, он не распечатал его (очевидно, он тоже не работал).
1 ответ
Решение
var server = http.createServer(onRequest).listen(9999);
server.on('connect', (req, cltSocket, head) => {
const srvSocket = net.connect('8080', '127.0.0.1', () => {
cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
'Proxy-agent: Node.js-Proxy\r\n' +
'\r\n');
srvSocket.write(head);
srvSocket.pipe(cltSocket);
cltSocket.pipe(srvSocket);
});
});