Кардар 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ти башка фреймдөө менен агымда алып жүрөт.

Тектеш макалалар