Прамы проксі чытае радок запыту і загалоўкі, перасылае іх, а затым чакае ў select цела POST. Кліент ужо адправіў яго. Абодва бакі выглядаюць так, быццам чакаюць адзін аднаго.

У BaseHTTPRequestHandler Python чытанне загалоўкаў ідзе праз rfile — буфераваны ўваходны паток. Гэты паток можа чытаць наперад і ўтрымліваць байты, якія належаць целу. Чаканне на ніжнім сокеце пытаецца толькі, ці гатовы яго файлавы дэскрыптар; яно не пытаецца, ці ў патоку Python ужо ёсць прыдатныя даныя.

Ідзіце за буферам, які чытаў загалоўкі

Чытайце цела таксама праз self.rfile. Не пераключайцеся на self.connection.recv пасля разбору загалоўкаў буфераваным патокам. Інакш код можа абысці байты, якія ўжо ўтрымлівае гэты паток, і чакаць даных, якія больш ніколі не будуць адпраўлены.

Перадача самога rfile у select не прымушае select правяраць яго буфер Python. API гатоўнасці працуе праз файлавы дэскрыптар аб'екта.

Для запыту з адным сапраўдным Content-Length і без Transfer-Encoding спажывайце роўна аб'яўленую колькасць байтаў, апрацоўваючы заўчаснае заканчэнне ўводу і свае абмежаванні па памеры і часе. Не чытайце да EOF: кліент з пастаянным злучэннем можа пакінуць злучэнне адкрытым пасля завяршэння запыту.

Зрабіце фарміраванне яўнай часткай проксі

Целы запытаў з chunked патрабуюць падтрымкі chunked-фарміравання. Іх нельга прачытаць, шукаючы адсутны Content-Length. Неадназначныя метаданыя даўжыні патрабуюць вызначанага шляху адхілення, а не выбару загалоўка, які здаецца зручным.

Блакуючы апрацоўшчык можа працягваць выкарыстоўваць свой інтэрфейс патоку з абмежаванымі чытаннямі. Проксі, кіраваны падзеямі, патрабуе мадэлі буфера, якая інтэгруе апярэджвальнае чытанне парсера з кіраваннем гатоўнасцю. Змена тайм-аўту не ўзгодніць двух незалежных спажыўцоў аднаго сокета.

Гэты дыягназ датычыцца таго, дзе ўтрымліваюцца ўваходныя байты. Пасля таго як проксі спажыў правільнае цела, ён усё яшчэ павінен пераслаць гэтае цела з узгодненым фарміраваннем HTTP. Стандартны апрацоўшчык http.server — карыснае месца, каб зразумець механізм, але гэта не прамысловая рэалізацыя прамога проксі.

Падобныя артыкулы