как путь и хост могут быть совершенно разными в nodejs - PullRequest
0 голосов
/ 03 марта 2020

Я занимаюсь исследованием прокси в nodejs. Я столкнулся с чем-то, что взорвало мой разум. В одной из опций для соединения http.request исходный код показал это как объект опций

  const options = {
    port: 1337,
    host: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

. Это было частью гораздо большего кода, который представлял собой целую систему туннелирования. Но может кто-то просто объяснить, как работают варианты выше? Весь код ниже

const http = require('http');
const net = require('net');
const { URL } = require('url');

// Create an HTTP tunneling proxy
const proxy = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('okay');
});
proxy.on('connect', (req, clientSocket, head) => {
  // Connect to an origin server
  const { port, hostname } = new URL(`http://${req.url}`);
  const serverSocket = net.connect(port || 80, hostname, () => {
    clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    serverSocket.write(head);
    serverSocket.pipe(clientSocket);
    clientSocket.pipe(serverSocket);
  });
});

// Now that proxy is running
proxy.listen(1337, '127.0.0.1', () => {

  // Make a request to a tunneling proxy
  const options = {
    port: 1337,
    host: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  const req = http.request(options);
  req.end();

  req.on('connect', (res, socket, head) => {
    console.log('got connected!');

    // Make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    socket.on('end', () => {
      proxy.close();
    });
  });
});

Источник: https://nodejs.org/api/http.html#http_event_connect

1 Ответ

1 голос
/ 03 марта 2020

Вы, вероятно, никогда не использовали сеть, которая требует настройки прокси-сервера HTTP. Большинство сетей в наши дни настраивают свой брандмауэр, чтобы разрешить трафик HTTP c. Это означает, что в наши дни большинству людей никогда не приходилось использовать HTTP-прокси для доступа в Интернет.

Долгое время go, когда я впервые начал использовать inte rnet (около 1994 г.). сетей не разрешают прозрачный доступ inte rnet. Ваш P C не имеет никакого отношения к внешнему миру . Но системные администраторы установят HTTP-прокси, к которому вы можете подключиться. Ваш P C будет иметь доступ только к локальной сети (частью которой является прокси), а только HTTP-прокси будет иметь доступ к inte rnet.

Вот пример того, как вы настроите Windows для использования HTTP-прокси:

enter image description here

Если вы настроите свой P C, как указано выше, то когда вы подключаетесь к www.google.com, ваш браузер будет подключаться к хосту proxy.example.com через порт 8080, а затем запрашивать его для получения данных с www.google.com.

Что касается того, почему он вызывает запрашиваемый ресурс path это потому, что он отправляется в части пакета «путь».

Например, обычный запрос GET для получения этой страницы выглядит примерно так:

GET /questions/60498963 HTTP/1.1
Host: stackoverflow.com

И строка после GET и перед тем, как версия протокола обычно называется путем:

           .---------- this is normally called
           |           the "path"
           v
GET /questions/60498963 HTTP/1.1
Host: stackoverflow.com

При создании прокси-запроса HTTP-заголовок выглядит так:

CONNECT stackoverflow.com/questions/60498963 HTTP/1.1

Таким образом, URL, включая имя домена, отправляется к прокси в той части пакета, которая обычно используется для отправки пути к файлу.

Нет То есть все это не имеет ничего общего с Node.js. Это просто базовая c сеть (без языков программирования).

...