Я создаю HTTPS через HTTP-прокси. Я пытаюсь выяснить, как мне получить заголовки, которые были отправлены с исходным сообщением CONNECT
на моем внутреннем HTTPS-сервере.
Ниже приведена самая минимальная настройка, которую я мог придумать:
const http = require('http');
const https = require('https');
const pem = require('pem');
const net = require('net');
const createHttpsServer = (callback) => {
pem.createCertificate({
days: 365,
selfSigned: true
}, (error, {serviceKey, certificate, csr}) => {
const httpsOptions = {
ca: csr,
cert: certificate,
key: serviceKey
};
const server = https.createServer(httpsOptions, (req, res) => {
// How do I get 'proxy-authorization' header here?
console.log('>>>2', req.headers);
res.writeHead(200, {
connection: 'close'
});
res.end('OK');
});
server.listen((error) => {
if (error) {
console.error(error);
} else {
callback(null, server.address().port);
}
});
});
};
const createProxy = (httpsServerPort) => {
const proxy = http.createServer();
proxy.on('connect', (request, requestSocket, head) => {
console.log('>>>1', request.headers);
const serverSocket = net.connect({
allowHalfOpen: true,
port: httpsServerPort,
}, () => {
requestSocket.write(
'HTTP/1.1 200 Connection established\r\n\r\n'
);
serverSocket.write(head);
serverSocket.pipe(requestSocket);
requestSocket.pipe(serverSocket);
});
});
proxy.listen(9000);
};
const main = () => {
createHttpsServer((error, httpsServerPort) => {
if (error) {
console.error(error);
} else {
createProxy(httpsServerPort);
}
});
};
main();
Последнее можно протестировать с помощью:
curl --proxy http://foo@127.0.0.1:9000 https://reddit.com -k
Я также создал пример, который вы можете запустить в своем браузере: https://repl.it/@gajus/FrigidComfortableFields