Ошибки https-proxy-agent и socks-proxy-agent

Оба агента берут прокси одной строкой-адресом. Большинство ошибок возникает именно здесь: строка не разбирается, пароль ломает адрес или схема не та.

Обновлено · Редакция Prokso

Коротко
  • Оба агента разбирают строку прокси как URL, поэтому нужен полный адрес со схемой
  • Спецсимволы в логине и пароле кодируйте через encodeURIComponent, иначе адрес ломается или меняется хост
  • Для SOCKS5 пишите socks5h://, чтобы название сайта превращал в IP прокси

Что означает ошибка

Пакеты https-proxy-agent и socks-proxy-agent разбирают строку прокси стандартным классом URL. Если строка не является корректным адресом, Node.js бросает TypeError: Invalid URL с кодом ERR_INVALID_URL. Так бывает, например, когда в пароле есть символ / или порт больше 65535.

Опаснее, когда ошибки нет. Символы @ и # в пароле не ломают разбор, но меняют адрес: в нашей проверке строка с паролем p@ss#1 превратилась в хост ss. Программа идёт на несуществующий хост и падает уже с ENOTFOUND.

Оба агента декодируют логин и пароль функцией decodeURIComponent. Поэтому спецсимволы нужно закодировать перед вставкой в строку, и агент сам вернёт их в исходный вид. В socks-proxy-agent схема ещё и определяет, кто превращает название сайта в IP: при socks5 это делает ваш компьютер, при socks5h — прокси.

Причины

  • Строка без схемы. Формат хост:порт:логин:пароль не является URL. socks-proxy-agent тогда отвечает TypeError «A "socks" protocol must be specified!».
  • Спецсимволы в пароле без кодирования. Символы / ? # @ : % и пробел ломают адрес или тихо меняют хост.
  • Неверный логин или пароль. HTTP-шлюз отвечает «HTTP/1.1 407 NO_USER», а библиотека socks на порту 824 — «Socks5 Authentication failed».
  • Схема не соответствует порту. http:// нужен для порта 823, socks5h:// — для порта 824; порты 10000–20000 принимают оба протокола.
  • socks5 вместо socks5h. Адрес сайта определяет ваш DNS, а не прокси, поэтому сайт может открыться с IP, подобранного под вашу сеть, а не под страну прокси.

Как исправить

  1. Пишите строку полностью со схемой: http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823 для https-proxy-agent и socks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824 для socks-proxy-agent.
  2. Собирайте строку с кодированием: `http://${encodeURIComponent(login)}:${encodeURIComponent(password)}@gw.prokso.com:823`. Тогда ни один символ пароля не сломает адрес.
  3. При 407 скопируйте логин и пароль из личного кабинета заново, без пробелов. Параметры в логине (страна, город, сессия) проверьте по странице логин, порты и параметры. Подробнее о коде — на странице ошибки 407.
  4. Если пароль не хочется вставлять в строку, включите доступ по IP в кабинете (до 5 адресов на план) и подключайтесь без логина.
  5. Для SOCKS5 всегда берите socks5h://. Что делать, когда SOCKS-сервер отвечает общей ошибкой, — на странице SOCKS5 general failure.

Как проверить, что всё заработало

Перед запуском выведите new URL(строка).hostname: там должен быть gw.prokso.com. Затем проверьте строку в проверке прокси и сделайте запрос через агент на https://prokso.com/ip.

Диагностика за 2 минуты

Сначала вставьте строку в проверку прокси. Если там прокси работает, причина в программе или её настройках. Если нет — проверьте строку из терминала:

curl -v -x "http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823" https://api.ipify.org
  • Строка < HTTP/1.1 407 сразу после CONNECT — отвечает прокси. Название после кода, например NO_USER, подсказывает причину.
  • Прокси ответил на CONNECT кодом 200, а дальше пришёл другой код — прокси работает, этот ответ дал сайт.
  • Никакого ответа, только тайм-аут — соединение не дошло до прокси: проверьте хост, порт и сеть.

Инструкции, где встречается эта ошибка

Вопросы и ответы

Чем socks5 отличается от socks5h в socks-proxy-agent?

В исходном коде пакета для socks5 название сайта превращает в IP ваш компьютер, для socks5h и просто socks — прокси. О самом протоколе — в глоссарии: <a href="/ru/glossary/socks5">SOCKS5</a>.

Нужно ли кодировать логин, а не только пароль?

Да, если в логине есть спецсимволы. Агенты декодируют обе части, так что encodeURIComponent для логина ничего не испортит.

Как подключить агент в своём коде?

Передайте агент в опцию agent модулей http и https или в httpsAgent для axios. Примеры — в инструкции <a href="/ru/guide/nodejs">Node.js</a>.

Резидентские $1.59, мобильные $2.50, серверные $0.65 за 1 ГБ

Регистрация за минуту, доступы сразу после оплаты.

Создать аккаунт