2週間のchunked符号化の問題に悩まされる

1838 ワード

最近2週間BIとフロントエンドのデータを通じる問題の開発を試みたが、会社のサーバーchuncked符号化の問題が解決できず、心が困っていた.最后に私の兄の大神を探して解决して、成分を変えて次の1つの塊の要求と受け入れを変えて解决することができます
シナリオ:requestsの代わりにpycurlを使用しますが、HTTPプロトコルのバージョンを1.0に設定する必要があります.そうしないと、Transfer-Encoding:chunked、Connection:keep-aliveはHTTP 1.1の新しい特性です.自分のHTTPプロトコルのバージョンを1.0に設定すると、サービス側はchunkedを返すのではなく、TCPセグメントで直接ファイル全体の内容を返し、最後に完全なHTTPパッケージを再構成します.
URL:
REFERER:
COOKIE:

    :
post_data = urllib.parse.urlencode({
'down':'0',
})


  :
headers = [
'Host:xxxxx',
'User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0',
'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Content-Type:application/x-www-form-urlencoded',
'Accept-Encoding:gzip,deflate',
'Upgrade-Insecure-Requests:1',
'Connection:close'
]

    :
try:
    c = pycurl.Curl()
    c.setopt(pycurl.URL, URL)
    c.setopt(pycurl.REFERER, REFERER)
    c.setopt(pycurl.FOLLOWLOCATION, True)
    c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0)
    c.setopt(pycurl.CONNECTTIMEOUT, 300)
    c.setopt(pycurl.TIMEOUT, 300)
    c.setopt(pycurl.ENCODING, 'gzip, deflate')
    c.setopt(pycurl.HTTPHEADER, headers)
    c.setopt(pycurl.POST, 1)
    c.setopt(pycurl.COOKIE,COOKIE)
    c.setopt(pycurl.POSTFIELDS, post_data)
    b = BytesIO()
    c.setopt(c.WRITEFUNCTION, b.write)
    c.perform()
except:
            raise("post error")
else:
        html = b.getvalue().decode("utf-8")



HTTP 1.0については、一度にHTTPの応答内容が多く、かつ内容の多少を事前に予知できない場合は、content-lengthを使用せず、出力が完了した後、直接接続をオフにすればよい.ある程度、content-lengthはHTTP 1.0にとって、有無を問わないことができる.wiresharkでバッグをつかんで見てもTransfer-Encoding:chunkedとContent-Longthの頭部はありません