Python HTTP proksisinin POST gövdələri rfile-da buferləşdirilə bilər
Python HTTP proksi sorğusunu soket buferindən artıq çıxmış baytları gözləmək əvəzinə handler-in buferləşdirilmiş girişi vasitəsilə oxuyun.
İrəli proksi sorğu sətrini və başlıqları oxuyur, onları ötürür, sonra select-də POST gövdəsini gözləyir. Müştəri onu artıq göndərib. Hər iki tərəf bir-birini gözləyir kimi görünür.
Python-un BaseHTTPRequestHandler ilə başlıqların oxunması rfile vasitəsilə gedir; bu, buferləşdirilmiş giriş axınıdır. Bu axın irəliyə oxuya və gövdəyə aid baytları saxlaya bilər. Altda olan soketi gözləmək yalnız fayl deskriptorunun hazır olub-olmadığını soruşur; Python axınının artıq istifadə oluna bilən məlumat saxlayıb-saxlamadığını soruşmur.
Başlıqları oxuyan buferi izləyin
Gövdəni də self.rfile vasitəsilə oxuyun. Başlıqları buferləşdirilmiş axınla təhlil etdikdən sonra self.connection.recv-ə keçməyin. Əks halda kod həmin axında saxlanan baytları keçə və bir daha göndərilməyəcək məlumatı gözləyə bilər.
rfile-in özünü select-ə vermək select-in onun Python buferini yoxlamasına səbəb olmur. Hazırlıq API-si obyektin fayl deskriptoru vasitəsilə işləyir.
Bir etibarlı Content-Length olan və Transfer-Encoding olmayan sorğu üçün elan edilmiş bayt sayını dəqiq istehlak edin, girişin vaxtından əvvəl bitməsini və öz ölçü və vaxt məhdudiyyətlərinizi idarə edin. EOF-a qədər oxumayın: davamlı bağlantı istifadə edən müştəri sorğunu bitirdikdən sonra bağlantını açıq saxlaya bilər.
Çərçivələməni proksinin açıq hissəsinə çevirin
Çunklu sorğu gövdələri çunklu çərçivələmə dəstəyi tələb edir. Onları olmayan Content-Length-i axtarmaqla oxumaq mümkün deyil. Qeyri-müəyyən uzunluq metadatası əlverişli görünən başlığı seçmək əvəzinə müəyyən edilmiş rədd yolu tələb edir.
Bloklayan handler məhdud oxumalarla axın interfeysindən istifadə etməyə davam edə bilər. Hadisə əsaslı proksi parserin irəliyə oxumasını hazırlıq idarəetməsi ilə birləşdirən bufer modeli tələb edir. Taym-autu dəyişmək eyni soketin iki müstəqil istehlakçısını uzlaşdırmayacaq.
Bu diaqnoz gələn baytların harada saxlanmasına aiddir. Proksi düzgün gövdəni istehlak etdikdən sonra həmin gövdəni ardıcıl HTTP çərçivələməsi ilə ötürməlidir. Standart http.server handleri mexanizmi anlamaq üçün faydalı yerdir, lakin istehsal üçün irəli proksi tətbiqi deyil.