CONNECT-dən sonra boş sətri gözləyin
Status sətri birinci gəlsə belə, soketi TLS-ə verməzdən əvvəl tam HTTP/1 CONNECT cavabını oxuyun.
Müştəri 200 Connection Established görür, TLS-ə başlayır və TLS qeydi olmalı yerdə dərhal mənasız məlumat bildirir. Hədəfin şifrə parametrlərini günahlandırmadan əvvəl yarımçıq HTTP cavabı axtarın.
HTTP/1 CONNECT mübadiləsində status sətri cavabın yalnız başlanğıcıdır. Ondan sonra başlıq sahələri gələ bilər. Uğurlu CONNECT cavabından sonra başlıq bölməsini bitirən boş sətir tunelə keçidi işarələyir.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Bu baytlar bir oxumada, bir neçə oxumada və ya sonrakı baytları da ehtiva edən bir oxumada gələ bilər. TCP serverin yazma sərhədlərini qorumur.
Ötürməni açıq parser vəziyyətinə çevirin
- Status sətrini toplayın və təhlil edin. Dəqiq ingilis reason phrase əvəzinə rəqəmsal statusdan istifadə edin.
- Başlıq bölməsinin tam bitiricisi gələnə qədər davam edin. Uğurlu status sətri qalan sahələri yox etmir.
- Uğurlu CONNECT cavabında bitiricidən dərhal sonrakı baytı tunel məlumatının başlanğıcı hesab edin. Digər cavablarda uyğun HTTP cavabı və autentifikasiya emalını izləyin.
- Bağlantını və istifadə olunmamış baytları növbəti protokolun dəstəklədiyi buferli I/O interfeysi ilə ötürün.
Son addım yaxşı ayırıcı axtarışı olsa belə vacibdir. Buferli oxuyucu parserin istədiyindən çox soket istehlak etmiş ola bilər. TLS-i çılpaq soketdə başladıb o oxuyucunu tərk etmək baytları oxuyucunun şəxsi buferində saxlayar.
Qurulum üçün son tarix və başlıq ölçüsü həddi təyin edin. Bitiricidən əvvəl EOF natamam proxy cavabıdır, əbədi gözləməyə və ya hər halda TLS sınamağa dəvət deyil.
Bir neçə sərhədi düşünün
Proxy-Agent:-dən sonra bitən oxuma təsəvvür edin. Parserin hələ də əlavə HTTP başlıq baytlarına ehtiyacı var. Son CRLF ardıcıllığının ortasında bitən başqa bir oxuma təsəvvür edin. Bu hələ tam başlıq bölməsi deyil. İndi eyni buferdə tam uğurlu başlıq bölməsindən sonra tunel baytları gəldiyini təsəvvür edin: o əlavə baytlar ötürmədən sağ çıxmalıdır.
407 fərqli nəticədir. Autentifikasiya emalı tələb edir; heç vaxt açılmamış tunelə TLS ClientHello göndərməyə icazə vermir.
Əl sıxışmasını tətbiq etmək vəzifə deyilsə, saxlanılan konnektor seçin. Bu sərhəd burada göstərilən HTTP/1 mübadiləsinə aiddir. HTTP/2 proksisi CONNECT-i fərqli çərçivələmə ilə axın üzərində daşıyır.