Един 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 записи, за да ги предава. Неговата протоколна работа беше да установи и преведе двете тунелни преговори.

Подобни статии