Помилки 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="/glossary/socks5">SOCKS5</a>.

Чи треба кодувати логін, а не лише пароль?

Так, якщо в логіні є спецсимволи. Агенти декодують обидві частини, тож encodeURIComponent для логіна нічого не зіпсує.

Як підключити агент у своєму коді?

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

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

Реєстрація за хвилину, доступи одразу після оплати.

Створити акаунт