Python HTTP проксиінің POST денелері rfile ішінде буферленуі мүмкін
Python HTTP прокси сұранысын сокет буферінен әлдеқашан шыққан байттарды күтудің орнына хендлердің буферленген кірісі арқылы оқыңыз.
Алға бағыттаушы прокси сұраныс жолы мен тақырыпшаларды оқып, оларды жібереді, содан кейін select ішінде POST денесін күтеді. Клиент оны әлдеқашан жіберген. Екі жақ бір-бірін күтіп тұрған сияқты.
Python-ның BaseHTTPRequestHandler-інде тақырыпшаларды оқу rfile арқылы өтеді, бұл буферленген кіріс ағыны. Ол ағын алға оқып, денеге тиесілі байттарды ұстай алады. Негізгі сокетті күту оның файл дескрипторы дайын ба, соны ғана сұрайды; Python ағынында қолдануға жарамды деректер бар ма, оны сұрамайды.
Тақырыпшаларды оқыған буферді ұстаныңыз
Денені де self.rfile арқылы оқыңыз. Тақырыпшаларды буферленген ағынмен талдағаннан кейін self.connection.recv-ге ауыспаңыз. Әйтпесе код сол ағын ұстап тұрған байттарды айналып өтіп, енді ешқашан жіберілмейтін деректерді күтуі мүмкін.
rfile-дің өзін select-ке беру select-тің оның Python буферін тексеруіне әкелмейді. Дайындық API-і нысанның файл дескрипторы арқылы жұмыс істейді.
Бір жарамды Content-Length бар және Transfer-Encoding жоқ сұраныс үшін жарияланған байт санын дәл тұтыныңыз, кірістің мерзімінен бұрын бітуін және өз өлшем мен уақыт шектеулеріңізді өңдеңіз. EOF-қа дейін оқымаңыз: тұрақты қосылымды пайдаланатын клиент сұраныс аяқталғаннан кейін қосылымды ашық қалдыруы мүмкін.
Жақтауды проксидің айқын бөлігі етіңіз
Бөлінген сұраныс денелеріне бөлінген жақтау қолдауы қажет. Оларды жоқ Content-Length-ті іздеу арқылы оқу мүмкін емес. Екіұшты ұзындық метадеректеріне ыңғайлы көрінген тақырыпшаны таңдаудың орнына анықталған бас тарту жолы қажет.
Блоктайтын хендлер шектеулі оқулармен ағын интерфейсін пайдалануды жалғастыра алады. Оқиғаға негізделген проксиге парсердің алдын ала оқуын дайындықты өңдеумен біріктіретін буфер моделі қажет. Таймаутты өзгерту бір сокеттің екі тәуелсіз тұтынушысын келістірмейді.
Бұл диагностика кіріс байттарының қайда ұсталатынына қатысты. Прокси дұрыс денені тұтынғаннан кейін де оны дәйекті HTTP жақтауымен жіберуі керек. Стандартты http.server хендлері механизмді түсіну үшін пайдалы орын, бірақ ол өндірістік алға бағыттаушы прокси іске асырылымы емес.