gzip బైట్లను వాటిని వివరించే హెడర్లతో పంపండి
Requests ఆధారిత ప్రాక్సీలో ఎన్కోడ్ చేసిన లేదా డీకోడ్ చేసిన పేలోడ్ను ఎంచుకోండి, ఆపై డౌన్స్ట్రీమ్ ప్రతిస్పందనకు సరిపోయే content హెడర్లు మరియు దాని స్వంత ఫ్రేమింగ్ను ఇవ్వండి.
Requests ఇప్పటికే బాడీని డీకంప్రెస్ చేసి ఉంటే, Content-Encoding: gzip తో దాన్ని పంపడం తదుపరి క్లయింట్ను మళ్లీ డీకంప్రెస్ చేయమని కోరుతుంది. హెడర్లను కాపీ చేయడానికి ముందు ప్రాక్సీ ఏ పేలోడ్ ప్రాతినిధ్యాన్ని పంపుతుందో నిర్ణయించండి.
| పంపిన పేలోడ్ | content హెడర్లు |
|---|---|
| అసలు ఎన్కోడ్ చేసిన బైట్లు | వర్తించే ఎన్కోడింగ్ మరియు పేలోడ్ యొక్క ఖచ్చితమైన పొడవును ఉంచండి |
| డీకోడ్ చేసిన బైట్లు | డీకోడ్ చేసిన ఎన్కోడింగ్ను తీసివేయండి; సంబంధిత పొడవును తీసివేయండి లేదా మళ్లీ లెక్కించండి |
ఎన్కోడ్ చేసిన పేలోడ్ బైట్ల కోసం, ఈ భాగం content డీకోడింగ్ లేకుండా urllib3 యొక్క ముడి స్ట్రీమ్ను చదువుతుంది:
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 లోపాలను నిర్వహించండి: ఈ ఉదాహరణ వాటిని పంపడం బదులు విసిరివేస్తుంది.