日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

http响应头里没有或者有content-length的几种可能性

發(fā)布時(shí)間:2025/5/22 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 http响应头里没有或者有content-length的几种可能性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)于http的請(qǐng)求返回結(jié)果要進(jìn)行內(nèi)容的長度校驗(yàn)主要有兩種方式,二者互斥使用1.客戶端在http頭(head)加Connection:keep-alive時(shí),服務(wù)器的response是Transfer-Encoding:chunked的形式,通知頁面數(shù)據(jù)是否接收完畢,例如長連接或者程序運(yùn)行中可以動(dòng)態(tài)的輸出內(nèi)容,例如一些運(yùn)算比較復(fù)雜且需要用戶及時(shí)的得到最新結(jié)果,那就采用chunked編碼將內(nèi)容分塊輸出。2.除了如1所述之外的情況一般都是可以獲取到Content-Length的。
在HTTP協(xié)議中,Content-Length用于描述HTTP消息實(shí)體的傳輸長度the transfer-length of the message-body。在HTTP協(xié)議中,消息實(shí)體長度和消息實(shí)體的傳輸長度是有區(qū)別,比如說gzip壓縮下,消息實(shí)體長度是壓縮前的長度,消息實(shí)體的傳輸長度是gzip壓縮后的長度。在具體的HTTP交互中,客戶端是如何獲取消息長度的呢,主要基于以下幾個(gè)規(guī)則:響應(yīng)為1xx,204,304相應(yīng)或者h(yuǎn)ead請(qǐng)求,則直接忽視掉消息實(shí)體內(nèi)容。如果有Transfer-Encoding,則優(yōu)先采用Transfer-Encoding里面的方法來找到對(duì)應(yīng)的長度。比如說Chunked模式。“如果head中有Content-Length,那么這個(gè)Content-Length既表示實(shí)體長度,又表示傳輸長度。如果實(shí)體長度和傳輸長度不相等(比如說設(shè)置了Transfer-Encoding),那么則不能設(shè)置Content-Length。如果設(shè)置了Transfer-Encoding,那么Content-Length將被忽視”。這句話翻譯的優(yōu)點(diǎn)饒,其實(shí)關(guān)鍵就一點(diǎn):有了Transfer-Encoding,則不能有Content-Length。Range傳輸。不關(guān)注,沒詳細(xì)看了:)
通過服務(wù)器關(guān)閉連接能確定消息的傳輸長度。(請(qǐng)求端不能通過關(guān)閉連接來指明請(qǐng)求消息體的結(jié)束,因?yàn)檫@樣可以讓服務(wù)器沒有機(jī)會(huì)繼續(xù)給予響應(yīng))。這種情況主要對(duì)應(yīng)為短連接,即非keep-alive模式。HTTP1.1必須支持chunk模式。因?yàn)楫?dāng)不確定消息長度的時(shí)候,可以通過chunk機(jī)制來處理這種情況。在包含消息內(nèi)容的header中,如果有content-length字段,那么該字段對(duì)應(yīng)的值必須完全和消息主題里面的長度匹配。“The entity-length of a message is the length of the message-body before any transfer-codings have been applied”也就是有chunk就不能有content-length 。其實(shí)后面幾條幾乎可以忽視,簡(jiǎn)單總結(jié)后如下:1、Content-Length如果存在并且有效的話,則必須和消息內(nèi)容的傳輸長度完全一致。(經(jīng)過測(cè)試,如果過短則會(huì)截?cái)?#xff0c;過長則會(huì)導(dǎo)致超時(shí)。)2、如果存在Transfer-Encoding(重點(diǎn)是chunked),則在header中不能有Content-Length,有也會(huì)被忽視。3、如果采用短連接,則直接可以通過服務(wù)器關(guān)閉連接來確定消息的傳輸長度。(這個(gè)很容易懂)結(jié)合HTTP協(xié)議其他的特點(diǎn),比如說Http1.1之前的不支持keep alive。那么可以得出以下結(jié)論:1、在Http 1.0及之前版本中,content-length字段可有可無。因?yàn)檫@之前都不支持長連接.2、在http1.1及之后版本。如果是keep alive,則content-length和chunk必然是二選一。若是非keep alive,則和http1.0一樣。content-length可有可無.
綜合之上總結(jié), 我們的問題: tinyproxy HTTP服務(wù)器返回是以HTTP/1.0返回的, 而且標(biāo)識(shí)了Connection: Close頭. 而瀏覽器請(qǐng)求是以HTTP/1.1請(qǐng)求, 并標(biāo)識(shí)了Connection: Keep-Alive請(qǐng)求的, 所以瀏覽器期望收到至少帶有Transfer-Encoding(重點(diǎn)是chunked)或者Content-Length其中一種方式的頭. 而我們的代理直接發(fā)送HTTP響應(yīng)應(yīng)該就有問題:?嘗試解決辦法:1. hmconfig解析HTTP, 收到的HTTP響應(yīng)如果帶有Connection: Close的數(shù)據(jù)發(fā)送完成后, 關(guān)閉對(duì)瀏覽器的連接.2. 設(shè)備端解析HTTP, 對(duì)沒有content-length的HTTP響應(yīng)補(bǔ)充頭.

來自為知筆記(Wiz)

轉(zhuǎn)載于:https://www.cnblogs.com/lovelacelee/p/5385683.html

總結(jié)

以上是生活随笔為你收集整理的http响应头里没有或者有content-length的几种可能性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。