Клиентот го гледа 200 Connection Established, започнува TLS и веднаш пријавува бесмислици таму каде што треба да има TLS запис. Барајте недовршен HTTP одговор пред да ги обвините шифрите поставки на одредиштето.

Во HTTP/1 CONNECT размена статусната линија е само почеток на одговорот. По неа можат да следат полиња на заглавието. Празниот ред што го завршува делот на заглавието го означува преминот во тунелот по успешен CONNECT одговор.

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

Овие бајти можат да пристигнат во едно читање, во неколку читања или во читање што ги содржи и следните бајти. TCP не ги зачувува границите на пишување на серверот.

Направете го предавањето експлицитна состојба на парсерот

  1. Соберете и парсирајте ја статусната линија. Користете бројчен статус наместо точна англиска фраза за причина.
  2. Продолжете додека не пристигне целосниот терминатор на делот на заглавието. Успешна статусна линија не ги прави останатите полиња невидливи.
  3. Кај успешен CONNECT одговор, бајтот веднаш по тој терминатор сметајте го за почеток на тунелските податоци. Кај други одговори следете ја соодветната обработка на HTTP одговор и автентикација.
  4. Пренесете ја врската и сите неискористени бајти преку баферираниот I/O интерфејс што го поддржува следниот протокол.

Последниот чекор е важен дури и со добро барање разделувач. Бафериран читач може да потрошил повеќе од сокетот отколку што побарал парсерот. Започнувањето TLS на голиот сокет додека се напушта тој читач може да остави бајти во приватниот бафер на читачот.

Користете рок за поставување и ограничување на големината на заглавието. EOF пред терминаторот е нецелосен одговор на прокси, а не покана да чекате засекогаш или сепак да пробате TLS.

Размислете низ неколку граници

Замислете читање што завршува по Proxy-Agent:. На парсерот му требаат уште HTTP бајти од заглавието. Замислете друго што завршува на средина од последната CRLF секвенца. Тоа сè уште не е целосен дел на заглавие. Сега замислете целосен успешен дел на заглавие по кој во истиот бафер следат тунелски бајти: тие дополнителни бајти мора да го преживеат предавањето.

407 е различен исход. Тој бара обработка на автентикација; не дозволува TLS ClientHello во тунел што никогаш не бил отворен.

Претпочитајте одржуван конектор, освен ако имплементацијата на ракувањето е задача. Оваа граница е специфична за овде прикажаната HTTP/1 размена. HTTP/2 прокси носи CONNECT на поток со поинакво врамување.

Поврзани статии