Kiçik bir proxy sarğısı HTTPS ilə işləyib, sonra serverin birinci danışdığı protokolda yenidən istifadə edildikdə ilişib qala bilər. Şübhəli sətir çox vaxt qəbul buferinin \r\n\r\n ilə bitməsini gözləyən sətirdir.

TCP müştəriyə axın verir. Bir qəbul çağırışı HTTP status sətrinin yarısını, tam CONNECT cavabını, ya da həmin cavabı dərhal ardınca tunel məlumatı ilə qaytara bilər. Oxumanın başlıqların sonunda dayanacağına dair heç bir vəd yoxdur.

Sərhədi buferin içində tapın

HTTP/1.1 CONNECT mübadiləsi üçün başlıq terminatoru buferin hər hansı yerində görünənə qədər baytları yığın. İlk rast gəlinən yerdə bölün. Status sətrini və başlıqları birinci hissədən təhlil edin; sərhəddən sonrakı hər şeyi ayrıca saxlayın. Gözləyərkən başlıq ölçüsü limiti və vaxt limiti tətbiq edin, boş soket oxumasını isə dövrəyə yeni dəvət deyil, bağlanmış bağlantı kimi qəbul edin.

Yekun uğurlu 2xx cavabı bağlantını həmin başlıqlardan dərhal sonra tunel rejiminə keçirir. Onun ardınca gələn baytlar artıq tunel baytlarıdır. Onları atmayın, CONNECT cavabının gövdəsini gözləməyin və Content-Length sahəsini yeni protokolun bir hissəsini istehlak etmək icazəsi kimi şərh etməyin. İnformasiya cavabları varsa, yekun cavabdan əvvəl onlarla işlənməlidir.

Sarğı qalıqlarını ötürməlidir

Yalnız əsas soketi qaytarmaq əl sıxışması analizatorunun ondan artıq çıxardığı baytları itirir. Növbəti oxuyucuya əvvəlcə saxlanmış quyruğu verən, sonra soket oxumasını davam etdirən buferlənmiş axın lazımdır. Serverin birinci danışdığı protokolda o ilk salamı itirmək hər iki tərəfi qeyri-müəyyən müddət gözləməyə qoya bilər.

Əksinə, uğursuz CONNECT cavabından gələn baytlar tunel salamı deyil. 407 hələ də proxy mübadiləsinə aiddir və autentifikasiya emalı tələb edir; başqa uğursuz status isə uyğun xəta yoluna ehtiyac duyur.

Bu, xüsusilə FTP və ya SSH müştərisi HTTP proxy vasitəsilə uyğunlaşdırılarkən vacibdir. Proxy həm də tələb olunan təyinat portuna icazə verməlidir, FTP isə əlavə məlumat bağlantılarına ehtiyac duya bilər. Düzgün başlıq təhlili axının ötürülməsini həll edir; CONNECT icazəsi verə və ya FTP-nin ikinci kanalını təmin edə bilməz.

Əlaqəli məqalələr