如何判斷一個(gè)HTTP連接的結(jié)束?
case 1:有Content-Length
依據(jù)Content-Length判斷接收數(shù)據(jù)完成,來(lái)結(jié)束連接。
case2: 請(qǐng)求頭帶Connection字段
2.1?close
表明客戶端或服務(wù)器想要關(guān)閉該網(wǎng)絡(luò)連接,這是 HTTP/1.0 請(qǐng)求的默認(rèn)值。
由server負(fù)責(zé)主動(dòng)關(guān)閉。
2.2 keep-alive
表明客戶端想要保持該網(wǎng)絡(luò)連接打開(kāi),HTTP/1.1 的請(qǐng)求默認(rèn)使用一個(gè)持久連接。
由server負(fù)責(zé)主動(dòng)關(guān)閉。
case3:chunked響應(yīng)
3.1 終止塊
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n
\r\n
終止塊是一個(gè)長(zhǎng)度為0的分塊,即其是0后面跟著兩個(gè)CRLF。沒(méi)有Trailer,則可以認(rèn)為結(jié)束。(但chunk內(nèi)容可能是二進(jìn)制,所以不能直接匹配最后的兩個(gè)CRLF,需要先匹配每個(gè)chunk的長(zhǎng)度,然后再偏移,逐步找到最后結(jié)束。)
3.2 有trailer
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Trailer: Expires
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n
Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n
\r\n
如果攜帶了trailer(消息頭中可以搜索到Trailer字段),則在終止塊(此時(shí)是單個(gè)CRLF)后,還需要再尋找一個(gè)結(jié)束符(兩個(gè)CRLF)。處理完Trailer之后,可以認(rèn)為結(jié)束。
Trailer頭中絕不能有以下三個(gè)字段:
? ? ? .?Transfer-Encoding
? ? ? . Content-Length
? ? ? . Trailer
case4:? range請(qǐng)求
4.1 206 Partial Content響應(yīng)
4.1.1 包含一個(gè)區(qū)間
有Content-Range,但Content-Type中沒(méi)有multipart。有Content-Length且是resp的完整長(zhǎng)度。可以依據(jù)content-length來(lái)判斷結(jié)束并做close。
HTTP/1.1 206 Partial Content
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif
4.1.2包含多個(gè)區(qū)間
Content-Type中指明了multipart/byteranges
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270
eta http-equiv="Content-type" content="text/html; charset=utf-8" />
? ? <meta name="vieport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270
-color: #f0f0f2;
? ? ? ? margin: 0;
? ? ? ? padding: 0;
? ? ? ? font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--
如何判斷結(jié)束?
1. 要判斷是multipart/byteranges,然后獲取到boundary
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
2. 利用“--boundary”分割每個(gè)部分(每個(gè)部分內(nèi)容還有content-range字段標(biāo)識(shí)長(zhǎng)度)
最后一個(gè)boundary之后,如何判斷結(jié)束???
在協(xié)議層無(wú)法判斷結(jié)束,只能在業(yè)務(wù)層(比如數(shù)據(jù)本身是結(jié)構(gòu)化的,可判斷結(jié)束的)判斷。
問(wèn)題
1、Transfer-Length和Content-Length不能同時(shí)出現(xiàn)?
Transfer-Length不是HTTP頭字段?是表達(dá)動(dòng)態(tài)長(zhǎng)度的?
2、Transfer-Length和Transfer-Encoding一定同時(shí)出現(xiàn)?
總結(jié)
1、有Transfer-Encoding字段(其值不是identity),則Content-Length字段被忽略。
2、一個(gè)HTTP請(qǐng)求,如果有消息體,但沒(méi)有Content-Length,那么server就應(yīng)該回復(fù)400。
If a request contains a message-body and a Content-Length is not given, the server SHOULD respond with 400 (bad request).
3、Transfer-Encoding vs Content-Encoding文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-524917.html
Transfer-Encoding 是一個(gè)逐跳傳輸消息首部,即僅應(yīng)用于兩個(gè)節(jié)點(diǎn)之間的消息傳遞,而不是所請(qǐng)求的資源本身。要將壓縮后的數(shù)據(jù)應(yīng)用于整個(gè)連接,要使用端到端傳輸消息首部 Content-Encoding 。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-524917.html
到了這里,關(guān)于如何判斷HTTP響應(yīng)結(jié)束(何時(shí)可關(guān)閉HTTP連接)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!