Как я могу использовать прокси-сервер http с node.js http.Client?

Я хочу сделать исходящий HTTP-вызов из node.js, используя стандарт http.Client. Но я не могу подключиться к удаленному серверу напрямую из моей сети, и мне нужно пройти через прокси.

Как мне указать node.js использовать прокси?

117 голосов | спросил Christian Berg 5 +04002010-10-05T14:32:54+04:00312010bEurope/MoscowTue, 05 Oct 2010 14:32:54 +0400 2010, 14:32:54

12 ответов


0

Тим Макфарлейн ответ был близок к использованию HTTP-прокси.

Использовать HTTP-прокси (для незащищенных запросов) очень просто. Вы подключаетесь к прокси-серверу и делаете запрос в обычном режиме, за исключением того, что часть пути включает полный URL-адрес, а в заголовке хоста указан хост, к которому вы хотите подключиться.
Тим был очень близок со своим ответом, но он пропустил правильную настройку заголовка хоста.

var http = require("http");

var options = {
  host: "proxy",
  port: 8080,
  path: "http://www.google.com",
  headers: {
    Host: "www.google.com"
  }
};
http.get(options, function(res) {
  console.log(res);
  res.pipe(process.stdout);
});

Для протокола, его ответ работает с http://nodejs.org/, но это потому, что их сервер не ' все равно заголовок хоста неверный.

ответил Samuel 21 J000000Thursday11 2011, 23:26:36
0

Вы можете использовать запрос , я просто обнаружил, что невероятно легко использовать прокси на node.js, только с одним внешним "прокси "Параметр, тем более он поддерживает HTTPS через http-прокси.

var request = require('request');
request({'url':'https://anysite.you.want/sub/sub',
        'proxy':'http://yourproxy:8087'}, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
})
ответил Imskull 22 Jpm1000000pmWed, 22 Jan 2014 15:01:19 +040014 2014, 15:01:19
0

Я хотел бы добавить этот модуль, который нашел: https://www.npmjs.org/package /global-tunnel , который отлично сработал для меня (работал сразу со всем моим кодом и сторонними модулями только с кодом ниже).

require('global-tunnel').initialize({
  host: '10.0.0.10',
  port: 8080
});

Сделайте это один раз, и все http (и https) в вашем приложении будут проходить через прокси.

Поочередно звоню

require('global-tunnel').initialize();

будет использовать переменную среды http_proxy

ответил major-mann 4 PM00000070000001431 2014, 19:58:14
0

http-пакет 'request', кажется, имеет эту функцию:

https://github.com/mikeal/request

Например, объект запроса 'r' ниже использует localproxy для доступа к своим запросам:

var r = request.defaults({'proxy':'http://localproxy.com'})

http.createServer(function (req, resp) {
  if (req.url === '/doodle.png') {
    r.get('http://google.com/doodle.png').pipe(resp)
  }
})

К сожалению, нет никаких "глобальных" настроек по умолчанию, так что пользователи библиотек, которые используют это, не могут изменить прокси, пока библиотека не пройдет через http-параметры ...

HTH, Крис

ответил Chris Kimpton 14 +04002012-10-14T17:58:49+04:00312012bEurope/MoscowSun, 14 Oct 2012 17:58:49 +0400 2012, 17:58:49
0

Обычно вам не нужна явная поддержка прокси. Прокси-протокол довольно прост и основан на обычном протоколе HTTP. Вам просто нужно использовать прокси-хост и порт при соединении с HTTPClient. Пример (из документа node.js):

var http = require('http');
var google = http.createClient(3128, 'your.proxy.host');
var request = google.request('GET', '/',
  {'host': 'www.google.com'});
request.end();
...

Таким образом, вы в основном подключаетесь к своему прокси-серверу, но делаете запрос на "http://www.google.com".

ответил Renat 4 42010vEurope/Moscow11bEurope/MoscowThu, 04 Nov 2010 19:06:15 +0300 2010, 19:06:15
0

Если вам нужно использовать базовую авторизацию для вашего прокси-провайдера, просто используйте следующее:

var http = require("http");

var options = {
    host:       FarmerAdapter.PROXY_HOST,
    port:       FarmerAdapter.PROXY_PORT,
    path:       requestedUrl,
    headers:    {
        'Proxy-Authorization':  'Basic ' + new Buffer(FarmerAdapter.PROXY_USER + ':' + FarmerAdapter.PROXY_PASS).toString('base64')
    }
};

var request = http.request(options, function(response) {
    var chunks = [];
    response.on('data', function(chunk) {
        chunks.push(chunk);
    });
    response.on('end', function() {
        console.log('Response', Buffer.concat(chunks).toString());
    });
});

request.on('error', function(error) {
    console.log(error.message);
});

request.end();
ответил Vyacheslav Voronchuk 19 Jpm1000000pmTue, 19 Jan 2016 19:28:00 +030016 2016, 19:28:00
0

Узел должен поддерживать использование переменной среды http_proxy, поэтому он кроссплатформенный и работает с настройками системы, а не требует настройки для каждого приложения.

Используя предоставленные решения, я бы порекомендовал следующее:

CoffeeScript

get_url = (url, response) ->
  if process.env.http_proxy?
    match = process.env.http_proxy.match /^(http:\/\/)?([^:\/]+)(:([0-9]+))?/i
    if match
      http.get { host: match[2], port: (if match[4]? then match[4] else 80), path: url }, response
      return
  http.get url, response

Javascript

get_url = function(url, response) {
  var match;
  if (process.env.http_proxy != null) {
    match = process.env.http_proxy.match(/^(http:\/\/)?([^:\/]+)(:([0-9]+))?/i);
    if (match) {
      http.get({
        host: match[2],
        port: (match[4] != null ? match[4] : 80),
        path: url
      }, response);
      return;
    }
  }
  return http.get(url, response);
};

Использование Чтобы использовать этот метод, просто замените http.get, например, следующий пример записывает страницу индекса google в файл с именем test.htm:

file = fs.createWriteStream path.resolve(__dirname, "test.htm")
get_url "http://www.google.com.au/", (response) ->
  response.pipe file
  response.on "end", ->
    console.log "complete"
ответил Luke 13 AM00000040000002631 2013, 04:32:26
0

Я купил частный прокси-сервер, после покупки я получил:

255.255.255.255 // IP address of proxy server
99999 // port of proxy server
username // authentication username of proxy server
password // authentication password of proxy server

И я хотел использовать это. Первый ответ и второй ответ работал только для http (прокси) -> http (назначение), однако я хотел http (proxy) -> HTTPS (назначения).

А для пункта назначения https лучше использовать HTTP-туннель . Я нашел решение здесь . Окончательный код:

const http = require('http')
const https = require('https')
const username = 'username'
const password = 'password'
const auth = 'Basic ' + Buffer.from(username + ':' + password).toString('base64')

http.request({
  host: '255.255.255.255', // IP address of proxy server
  port: 99999, // port of proxy server
  method: 'CONNECT',
  path: 'kinopoisk.ru:443', // some destination, add 443 port for https!
  headers: {
    'Proxy-Authorization': auth
  },
}).on('connect', (res, socket) => {
  if (res.statusCode === 200) { // connected to proxy server
    https.get({
      host: 'www.kinopoisk.ru',
      socket: socket, // using a tunnel
      agent: false    // cannot use a default agent
    }, (res) => {
      let chunks = []
      res.on('data', chunk => chunks.push(chunk))
      res.on('end', () => {
        console.log('DONE', Buffer.concat(chunks).toString('utf8'))
      })
    })
  }
}).on('error', (err) => {
  console.error('error', err)
}).end()
ответил Алексей Володько 2 PMpMon, 02 Apr 2018 15:57:28 +030057Monday 2018, 15:57:28
0

Возможно, это не та единственная строка, на которую вы рассчитывали, но вы можете посмотреть на http : //github.com/nodejitsu/node-http-proxy , поскольку это может пролить некоторый свет на то, как вы можете использовать свое приложение с http.Client.

ответил fullstacklife 11 +04002010-10-11T02:23:53+04:00312010bEurope/MoscowMon, 11 Oct 2010 02:23:53 +0400 2010, 02:23:53
0

proxychains запустить node.js через прокси-сервер:
$ proxychains /path/to/node application.js

Лично мне не удалось установить ни одну из версий proxychains в среде Cygwin /Windows , поэтому я не смог ее протестировать.

Кроме того, они также говорили об использовании connect-proxy , но я не смог найти никакой документации о том, как это сделать.

Короче говоря, я все еще застрял, но, возможно, кто-то может использовать эту информацию, чтобы найти подходящий обходной путь.

ответил ddallala 29 WedEurope/Moscow2010-12-29T00:15:28+03:00Europe/Moscow12bEurope/MoscowWed, 29 Dec 2010 00:15:28 +0300 2010, 00:15:28
0

Для использования прокси с https я попробовал совет на этом сайте (используя зависимость https-proxy-agent ), и он мне помог:

http://codingmiles.com/node-js- решения по протоколу HTTPS-запрос через прокси /

ответил Jonathan Benn 6 PMpThu, 06 Apr 2017 23:13:36 +030013Thursday 2017, 23:13:36
0

Если у вас есть базовый http-схема аутентификации вам нужно сделать строку base64 из myuser:mypassword, а затем добавить «Basic» в начале , В этом ценность заголовка прокси-авторизации Вот пример:

var Http = require('http');

var req = Http.request({
    host: 'myproxy.com.zx',
    port: 8080,
    headers:{"Proxy-Authorization": "Basic bXl1c2VyOm15cGFzc3dvcmQ="},
    method: 'GET',
    path: 'http://www.google.com/'
    }, function (res) {
        res.on('data', function (data) {
        console.log(data.toString());
    });
});

req.end();

В nodejs вы можете использовать буфер для кодирования

var encodedData = Buffer.from('myuser:mypassword').toString('base64');

console.log(encodedData);

Как пример, в браузерах вы можете кодировать в base64, используя btoa () , полезно в запросах ajax в браузере без настроек прокси, выполняющих запрос через прокси.

 var encodedData = btoa('myuser:mypassword')

console.log(encodedData);

Как узнать, какая схема принимает прокси-сервер?

Если у нас не настроен пользовательский DNS (который выдает что-то вроде ERR_NAME_NOT_RESOLVED), когда мы выполняем запрос, ответ (код 407) должен сообщать в заголовках ответа, какую схему аутентификации http использует прокси-сервер.

ответил Emeeus 3 Maypm18 2018, 21:02:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132