某些播放實況視頻的網站將使用HTTP實時流。默認情況下,Content-Length
標題將被設置爲2147483647
。忽略內容長度標題?
隨着wget
可以忽略使用命令行開關
--ignore-length ignore `Content-Length' header field.
的Firefox可以下載一個文件,而忽略了Content-Length頭這個值?
某些播放實況視頻的網站將使用HTTP實時流。默認情況下,Content-Length
標題將被設置爲2147483647
。忽略內容長度標題?
隨着wget
可以忽略使用命令行開關
--ignore-length ignore `Content-Length' header field.
的Firefox可以下載一個文件,而忽略了Content-Length頭這個值?
我認爲這是你在找什麼:wget for firefox
我認爲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)。
說明
這是示例程序的作用:
self.request.recv(4096)
)Content-Length: 2147483647
)Hello, Firefox!<p>
睡覺1秒b在寫入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內容,而不同的內容類型行爲可能會有所不同。
我認爲這將有助於對你的問題有點背景。在我看來,HTTP服務器應該真的使用分塊編碼(如果你可以假設爲HTTP/1.1),而不是將Content-Length設置爲半任意數字。所描述的行爲似乎打破了我。 – FooF