1

一些直播视频的网站将使用 HTTP 直播流。默认情况下,Content-Length标题将设置为2147483647.

您可以使用wget命令行开关忽略此值

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

Firefox 可以在忽略 Content-Length 标头的情况下下载文件吗?

4

2 回答 2

2

我认为网络服务器的行为不正确。如果内容长度未知,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)。

解释

这就是示例程序的作用:

  1. 等待传入的 TCP 连接
  2. 阅读请求 ( self.request.recv(4096))
  3. 写响应头(使用Content-Length: 2147483647
  4. 写十次,两次Hello, Firefox!<p>之间睡眠 1 秒
  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 是 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 内容,并且对于不同的内容类型,行为很可能会有所不同。

于 2012-12-28T10:47:48.430 回答
2

我认为这就是您要寻找的:wget for firefox

于 2013-01-01T17:19:17.073 回答