忽略内容长度标题?

时间:2012-10-16 18:50:01

标签: firefox http-headers wget

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

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

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

Firefox可以在忽略Content-Length标题时下载文件吗?

2 个答案:

答案 0 :(得分:1)

我认为Web服务器行为不正确。如果内容长度未知,则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. 写入10次Hello, Firefox!<p>在写入之间休息1秒
  5. 关闭连接(通过从handle()方法返回。
  6. <强>插图

    以下是响应的示意图:

    $ 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,并且(使用例如网址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

    对于小内容体,Firefox(版本17.0.1)在渲染任何内容之前等待TCP关闭,但如果内容体较大,则在TCP连接关闭之前它将开始渲染。请注意,这只测试HTML内容,并且使用不同的内容类型行为可能会有所不同。

答案 1 :(得分:1)

我认为这正是您所寻找的:wget for firefox