Перетворення запиту SOCKS5 на тунель HTTP
Завершіть обмін CONNECT з батьківським вузлом, поверніть клієнтові відповідь SOCKS і лише після цього передавайте байти застосунку.
Фронтенд SOCKS5 може використовувати HTTP-проксі як свій подальший транспорт. Він діє як сервер SOCKS щодо клієнта і як клієнт HTTP CONNECT щодо батьківського вузла. Обидва обміни керування завершуються до початку потоку застосунку.
Запит SOCKS CONNECT уже містить хост або адресу призначення та порт. Для ілюстративного обміну HTTP/1.1 з батьківським вузлом:
client → adapter: SOCKS5 CONNECT service.example.net:443
adapter → parent:
CONNECT service.example.net:443 HTTP/1.1
Host: service.example.net:443
parent → adapter: HTTP/1.1 200 Connection Established
[end of headers]
adapter → client: SOCKS5 success reply
client ↔ adapter ↔ parent ↔ service: application bytes
Перекладіть результат на межі
Адаптер виконує будь-яку потрібну автентифікацію на боці батьківського вузла і чекає на результат CONNECT. Успішна відповідь 2xx встановлює батьківський тунель. Лише після цього він має повернути відповідну відповідь про успіх SOCKS нижчому клієнтові.
Якщо батьківський вузол відхиляє операцію, надішліть визначену відповідь про збій SOCKS, а потім негайно закрийте з'єднання з клієнтом. SOCKS5 вимагає такого закриття протягом десяти секунд після виявлення збою. Зберігайте HTTP-статус батьківського вузла як діагностичну інформацію для адаптера. Передавання цього рядка стану як даних застосунку вставило б керівне повідомлення HTTP у потік, клієнт якого очікує кадрування SOCKS.
До успішного результату CONNECT батьківський вузол усе ще говорить HTTP, включно з кадруванням будь-якої відповіді із запитом автентифікації або помилкою. Після роздільника заголовків успішного результату з'єднання стає тунелем; спершу немає тіла відповіді HTTP, яке треба було б спожити.
Збережіть байти після заголовків
Одне читання може містити кінець заголовків батьківського вузла і байти від призначення разом. Збережіть ці додаткові байти для нижчого застосунку. Протоколи, у яких сервер говорить першим, можуть привітатися одразу після відкриття з'єднання.
Після надсилання відповіді про успіх SOCKS передавайте потік застосунку в обох напрямках. Адаптеру не потрібно чергувати одне повідомлення клієнта з одним повідомленням сервера, і йому не потрібно розуміти записи TLS, щоб їх передавати. Його протокольна робота полягала у встановленні та перетворенні двох тунельних узгоджень.