Невялікая проксі-абгортка можа працаваць з HTTPS, а потым завіснуць, калі яе паўторна выкарыстаць для пратаколу, дзе сервер гаворыць першым. Падазроны радок — гэта часта той, які чакае, каб буфер прыёму скончыўся на \r\n\r\n.

TCP дае кліенту паток. Адзін выклік прыёму можа вярнуць палову радка стану HTTP, поўны адказ CONNECT або гэты адказ з данымі тунеля адразу пасля яго. Няма ніякай гарантыі, што чытанне спыніцца на канцы загалоўкаў.

Знайдзіце мяжу ўнутры буфера

Для абмену HTTP/1.1 CONNECT назапашвайце байты, пакуль тэрмінатар загалоўкаў не з’явіцца дзе-небудзь у буферы. Падзяліце па першым упадзенні. Разбярыце радок стану і загалоўкі з першай часткі; усё пасля мяжы трымайце асобна. Ужывайце абмежаванне памеру загалоўкаў і тайм-аўт падчас чакання, а пустое чытанне сокета лічыце зачыненым злучэннем, а не чарговым запрашэннем да цыклу.

Канчатковы паспяховы адказ 2xx перамыкае злучэнне ў рэжым тунеля адразу пасля гэтых загалоўкаў. Яго наступныя байты ўжо з’яўляюцца байтамі тунеля. Не адкідайце іх, не чакайце цела адказу CONNECT і не тлумачце поле Content-Length як дазвол спажыць частку новага пратаколу. Інфармацыйныя адказы, калі яны ёсць, трэба апрацаваць да гэтага канчатковага адказу.

Абгортка павінна перадаваць свае рэшткі

Вяртанне толькі базавага сокета губляе ўсе байты, якія парсер рукапаціскання ўжо выцягнуў з яго. Наступнаму чытачу патрэбны буфераваны паток, які спачатку аддае захаваны хвост, а потым аднаўляе чытанне сокета. У пратаколе, дзе сервер гаворыць першым, страта гэтага першага прывітання можа пакінуць абодва бакі ў бясконцым чаканні.

Наадварот, байты з няўдалага адказу CONNECT не з’яўляюцца прывітаннем тунеля. 407 усё яшчэ належыць абмену з проксі і патрабуе апрацоўкі аўтэнтыфікацыі; іншы няўдалы статус патрабуе адпаведнага шляху памылкі.

Гэта асабліва важна пры адаптацыі кліента FTP або SSH праз HTTP-проксі. Проксі таксама павінен дазваляць запытаны порт прызначэння, а FTP можа патрабаваць дадатковых злучэнняў для даных. Правільны разбор загалоўкаў вырашае перадачу патоку; ён не можа даць дазвол CONNECT або забяспечыць другі канал FTP.

Падобныя артыкулы