გადაუგზავნეთ gzip ბაიტები მათ აღწერილ სათაურებთან ერთად
აირჩიეთ კოდირებული ან დეკოდირებული დატვირთვა Requests-ზე დაფუძნებულ პროქსიში, შემდეგ მიეცით ქვედა დინების პასუხს შესაბამისი content სათაურები და საკუთარი ჩარჩო.
თუ Requests-მა უკვე დაშალა სხეული, მისი გადაცემა Content-Encoding: gzip-ით მომდევნო კლიენტს სთხოვს ხელახლა დაშლას. გადაწყვიტეთ, რომელი დატვირთვის წარმოდგენა აგზავნის პროქსი, სანამ სათაურებს დააკოპირებთ.
| გაგზავნილი დატვირთვა | content სათაურები |
|---|---|
| ორიგინალური კოდირებული ბაიტები | შეინარჩუნეთ მოქმედი კოდირება და დატვირთვის ზუსტი სიგრძე |
| დეკოდირებული ბაიტები | ამოიღეთ დეკოდირებული კოდირება; ამოიღეთ ან გადათვალეთ შესაბამისი სიგრძე |
კოდირებული დატვირთვის ბაიტებისთვის ეს ფრაგმენტი კითხულობს urllib3-ის ნედლ ნაკადს content დეკოდირების გარეშე:
with requests.get(url, stream=True, timeout=(5, 30)) as upstream:
upstream.raise_for_status()
for block in upstream.raw.stream(65536, decode_content=False):
downstream.write(block)downstream არის არსებული პასუხის გამომავალი. მისი სტატუსი და სათაურები უკვე უნდა მიჰყვებოდეს არჩეულ პოლიტიკას; ეს ფრაგმენტი არ ახორციელებს სრულ პროქსი სერვერს.
გადაცემის ჩარჩო დამოუკიდებელია gzip content კოდირებისგან. ზედა დინების HTTP ბიბლიოთეკამ უკვე დაამუშავა ჩარჩო, ნაწილების მოცილების ჩათვლით, ამიტომ Transfer-Encoding ბრმად ნუ დააკოპირებთ. ქვედა დინების სერვერი თავის პასუხს თავად აჩარჩოებს მაშინაც, როცა დატვირთვა gzip-კოდირებული რჩება.
response.text და მის შემდეგ UTF-8 კოდირება ასევე ცვლის წარმოდგენას და ვერ შეინარჩუნებს თვითნებურ ორობით მონაცემებს. დახურეთ ან მოიხმარეთ ზედა დინების პასუხი ყოველ გზაზე და დაამუშავეთ HTTP შეცდომები პროქსის ხელშეკრულების მიხედვით: ეს მაგალითი მათ ისვრის გადაცემის ნაცვლად.