Եթե 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 սխալների հետ պրոքսի պայմանագրի համաձայն. այս օրինակը դրանք նետում է փոխանցելու փոխարեն։

Առնչվող հոդվածներ