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 хендлери механизмди түшүнүү үчүн пайдалуу жер, бирок ал өндүрүштүк алдыга багыттоочу прокси ишке ашырылышы эмес.