一些直播视频的网站将使用 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 标头的情况下下载文件吗?
我认为网络服务器的行为不正确。如果内容长度未知,HTTP 服务器应该使用分块编码。话虽如此,很容易测试浏览器如何处理不符合标准的 HTTP 服务器。
测试设置
创建具有所描述行为的虚拟 HTTP 服务器(我们使用 Python):
#!/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 秒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 是 version 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)
用更大的内容测试浏览器的行为。(i,j) = (6,10)
在 TCP 关闭之前,我已经看到了内容
。
TL;博士
对于较小的内容主体,Firefox(版本17.0.1
)在渲染任何内容之前等待 TCP 关闭,但如果内容主体较大,它将在 TCP 连接关闭之前开始渲染。请注意,这仅测试 HTML 内容,并且对于不同的内容类型,行为很可能会有所不同。
我认为这就是您要寻找的:wget for firefox