Yönlendirici proxy istek satırını ve başlıkları okur, iletir, ardından select içinde bir POST gövdesi bekler. İstemci onu zaten göndermiştir. İki taraf da birbirini bekliyor gibi görünür.

Python'un BaseHTTPRequestHandler'ında başlıkların okunması rfile üzerinden geçer; bu, tamponlanmış bir girdi akışıdır. Bu akış ileriye okuyabilir ve gövdeye ait baytları tutabilir. Alttaki soket üzerinde beklemek yalnızca dosya tanıtıcısının hazır olup olmadığını sorar; Python akışının zaten kullanılabilir veri içerip içermediğini sormaz.

Başlıkları okuyan tamponu izleyin

Gövdeyi de self.rfile üzerinden okuyun. Başlıkları tamponlanmış akışla ayrıştırdıktan sonra self.connection.recv'ye geçmeyin. Aksi halde kod, o akışın zaten tuttuğu baytları atlayabilir ve bir daha asla gönderilmeyecek verileri bekleyebilir.

rfile'ın kendisini select'e vermek, select'in onun Python tamponunu incelemesini sağlamaz. Hazırlık API'si nesnenin dosya tanıtıcısı üzerinden çalışır.

Tek geçerli Content-Length'i olan ve Transfer-Encoding'i olmayan bir istek için bildirilen bayt sayısını tam olarak tüketin; girdinin erken sonlanmasını ve kendi boyut ile süre sınırlarınızı ele alın. EOF'a kadar okumayın: kalıcı bağlantı kullanan bir istemci, isteği bitirdikten sonra bağlantıyı açık tutabilir.

Çerçevelemeyi proxy'nin açık bir parçası yapın

Parçalı istek gövdeleri parçalı çerçeveleme desteği gerektirir. Var olmayan bir Content-Length arayarak okunamazlar. Belirsiz uzunluk üstverisi, uygun görünen başlığı seçmek yerine tanımlı bir ret yolu gerektirir.

Bloklayan bir işleyici, sınırlı okumalarla akış arayüzünü kullanmaya devam edebilir. Olay güdümlü bir proxy, ayrıştırıcının ileriye okumasını hazırlık işlemesiyle bütünleştiren bir tampon modeli gerektirir. Bir zaman aşımını değiştirmek, aynı soketin iki bağımsız tüketicisini uzlaştırmaz.

Bu tanı, gelen baytların nerede tutulduğuna özgüdür. Proxy doğru gövdeyi tükettikten sonra bile o gövdeyi tutarlı HTTP çerçevelemesiyle iletmesi gerekir. Standart http.server işleyicisi mekanizmayı anlamak için yararlı bir yerdir, ancak üretim için bir yönlendirici proxy uygulaması değildir.

İlgili makaleler