2012-10-16 66 views
0

某些播放實況視頻的網站將使用HTTP實時流。默認情況下,Content-Length標題將被設置爲2147483647忽略內容長度標題?

隨着wget可以忽略使用命令行開關

--ignore-length   ignore `Content-Length' header field. 

的Firefox可以下載一個文件,而忽略了Content-Length頭這個值?

+2

我認爲這將有助於對你的問題有點背景。在我看來,HTTP服務器應該真的使用分塊編碼(如果你可以假設爲HTTP/1.1),而不是將Content-Length設置爲半任意數字。所描述的行爲似乎打破了我。 – FooF

回答

1

我認爲Web服務器行爲不正確。如果內容長度未知,則HTTP服務器應使用分塊編碼。話雖如此,測試瀏覽器如何處理標準不兼容HTTP服務器很容易。

試驗設置

與所描述的行爲(我們使用Python)創建虛擬HTTP服務器:

#!/usr/bin/python 

import SocketServer 
import time 

class MyHttpHandler(SocketServer.BaseRequestHandler): 
    def send_stuff(self, msg): 
     print msg 
     self.request.send(msg) 

    def handle(self): 
     print("REQUEST: <<<" + self.request.recv(4096) + ">>>") 
     headers = """HTTP/1.1 200 OK\r 
Content-Length: 2147483647\r 
Content-Type: text/html\r 
rn""" 
     self.send_stuff(headers) 
     self.send_stuff("<html><body>n") 
     for count in range(1,10): 
      self.send_stuff("Hello, firefox!<p>n") 
      time.sleep(1) 
     self.send_stuff("</body></html>n") 

if __name__ == "__main__": 
    HOST, PORT = "0.0.0.0", 8888 
    server = SocketServer.TCPServer((HOST, PORT), MyHttpHandler) 
    server.serve_forever() 

(改編自http://docs.python.org/3.3/library/socketserver.html)。

說明

這是示例程序的作用:

  1. 等待傳入TCP連接
  2. 讀取請求(self.request.recv(4096)
  3. 寫入響應標頭(使用Content-Length: 2147483647
  4. 寫十次Hello, Firefox!<p>睡覺1秒b在寫入
  5. 關閉連接(通過從handle()方法返回。

插圖

這裏的說明的響應看起來像:

$ curl -i 10.20.32.85:8888/ 
HTTP/1.1 200 OK 
Content-Length: 2147483647 
Content-Type: text/html 

<html><body> 
Hello, firefox!<p> 
Hello, firefox!<p> 
Hello, firefox!<p> 
Hello, firefox!<p> 
Hello, firefox!<p> 
Hello, firefox!<p> 
Hello, firefox!<p> 
Hello, firefox!<p> 
Hello, firefox!<p> 
</body></html> 

Hello, firefox!線之間有一個一週秒鐘的暫停,用10秒鐘將完成接收內容)。

問題的答案

我的Firefox是17.0.1版本,(例如使用URL http://localhost:8888/這個例子似乎等待TCP關閉。 (相比之下,Chromium瀏覽器不會顯示任何內容。)由於在瀏覽器中實現了緩存語義和動態渲染,這種行爲似乎與較大內容不同。

測試 - 變化

我修改了handler()

def handle(self): 
     print("REQUEST: <<<" + self.request.recv(4096) + ">>>") 
     headers = """HTTP/1.1 200 OK\r 
Content-Length: 2147483647\r 
Content-Type: text/html\r 
\r\n""" 
     self.send_stuff(headers) 
     self.send_stuff("<html><body>\n") 
     for i in range(1,11): 
      for j in range(1,11): 
       self.request.send("%d:%d: Hello, firefox!<p>\n" % (i, j)) 
       #self.send_stuff("Hello, firefox!<p>\n") 
      print "i=%d" % i 
      time.sleep(3) 
     self.send_stuff("</body></html>\n") 
     time.sleep(10) 

具有較大的內容來測試瀏覽器的行爲。在TCP關閉之前,我看到的內容已經是 (i,j) = (6,10)

TL; DR

隨着小內容主體,火狐(17.0.1版)等待TCP關閉渲染任何東西之前,但如果內容主體是較大的,將開始渲染之前已經TCP連接關閉。請注意,這隻能測試HTML內容,而不同的內容類型行爲可能會有所不同。