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 ભૂલો સંભાળો: આ ઉદાહરણ તેમને ફોરવર્ડ કરવાને બદલે ફેંકે છે.