Как получить заголовки CONNECT на сервере HTTPS? - PullRequest
0 голосов
/ 18 октября 2019

Я создаю 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...