EPIPE у Node.js після підключення до SOCKS-проксі
Поясніть помилку EPIPE у Node після підключення до кінцевої точки SOCKS і перевірте, чи завершилося потрібне рукостискання.
Подія connect сокета Node повідомляє, що TCP дістався проксі. Вона не каже, що проксі відкрив з’єднання з пунктом призначення.
Сервер SOCKS5 очікує узгодження методу, обрану автентифікацію та запит пункту призначення перед трафіком застосунку. Якщо одразу надіслати HTTP-запит, сервер може закрити з’єднання. Подальший запис тоді може спричинити EPIPE.
Сам EPIPE не доводить відсутність рукостискання. Він повідомляє про запис у з’єднання, чия інша сторона вже не приймає цю комунікацію. Прочитайте попередні події та відповіді протоколу, щоб зрозуміти, чому сторона закрила з’єднання.
Використовуйте конектор, який реалізує повний обмін SOCKS. Для основного HTTPS-клієнта Node агент із підтримкою SOCKS може виконати це узгодження до TLS пункту призначення. Якщо ви реалізуєте обмін самостійно, накопичуйте дані відповідно до довжин полів протоколу. Не гарантовано, що одна подія data містить одну повну відповідь, а повернута зв’язана адреса не обов’язково має збігатися з одним жорстко закодованим рядком байтів.
Зареєструйте обробку помилок до того, як операція може зазнати невдачі, зберегти етап з’єднання у звіті про помилку й надсилайте протокол пункту призначення лише після успішного узгодження. Перехоплення помилки запобігає необробленій події; воно не виправляє недійсний обмін.