SOCKS5 užklausos vertimas į HTTP tunelį
Užbaikite CONNECT mainus su tėvu, grąžinkite klientui SOCKS atsakymą ir tik tada perduokite programos baitus.
SOCKS5 sąsaja gali naudoti HTTP tarpinį serverį kaip tolesnį perdavimo kelią. Ji veikia kaip SOCKS serveris kliento atžvilgiu ir kaip HTTP CONNECT klientas tėvo atžvilgiu. Abu valdymo mainai pasibaigia prieš prasidedant programos srautui.
SOCKS CONNECT užklausa jau pateikia paskirties hostą arba adresą ir prievadą. Iliustraciniam HTTP/1.1 mainui su tėvu:
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
Išverskite rezultatą ties riba
Adapteris atlieka bet kokią tėvo reikalaujamą autentifikaciją ir laukia CONNECT rezultato. Sėkmingas 2xx atsakymas nustato tėvo tunelį. Tik tada jis turėtų grąžinti atitinkamą SOCKS sėkmės atsakymą žemesniam klientui.
Jei tėvas atmeta operaciją, siųskite apibrėžtą SOCKS nesėkmės atsakymą, tada nedelsdami nutraukite kliento ryšį. SOCKS5 reikalauja šio uždarymo per dešimt sekundžių nuo gedimo aptikimo. Išsaugokite tėvo HTTP būseną kaip diagnostinę informaciją adapteriui. Tos būsenos eilutės perdavimas kaip programos duomenų įterptų HTTP valdymo pranešimą į srautą, kurio klientas tikisi SOCKS rėminimo.
Prieš sėkmingą CONNECT rezultatą tėvas vis dar kalba HTTP, įskaitant bet kokio iššūkio ar klaidos atsakymo rėminimą. Po sėkmingo rezultato antraščių skyriklio ryšys tampa tuneliu; iš pradžių nėra jokio HTTP atsakymo turinio, kurį reikėtų suvartoti.
Išsaugokite baitus po antraščių
Vienas skaitymas gali turėti tėvo antraščių pabaigą ir baitus iš paskirties vietos kartu. Išsaugokite tuos papildomus baitus žemesnei programai. Protokolai, kuriuose serveris kalba pirmas, gali pasisveikinti iškart po ryšio atidarymo.
Kai SOCKS sėkmės atsakymas išsiųstas, perduokite programos srautą abiem kryptimis. Adapteriui nereikia kaitalioti vieno kliento pranešimo su vienu serverio pranešimu, ir jam nereikia suprasti TLS įrašų, kad juos perduotų. Jo protokolo darbas buvo nustatyti ir išversti dvi tunelio derybas.