1

ライブ ビデオをブロードキャストする一部の Web サイトは、HTTP ライブ ストリームを使用します。デフォルトでは、Content-Lengthヘッダーは に設定され2147483647ます。

コマンドラインスイッチでこのwget値を無視できます

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

Firefox は Content-Length ヘッダーを無視してファイルをダウンロードできますか?

4

2 に答える 2

2

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. Hello, Firefox!<p>書き込みの間に 1 秒スリープして 10 回書き込む
  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!行間に 1 秒の休止があり、コンテンツの受信が完了するまでに 10 秒かかります)。

質問への回答

私の Firefox は version17.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;DR

コンテンツの本文が小さい場合、Firefox (バージョン17.0.1) は TCP が閉じるのを待ってから何かをレンダリングしますが、コンテンツの本文が大きい場合、TCP 接続が閉じる前に既にレンダリングを開始します。これは HTML コンテンツのみをテストすることに注意してください。コンテンツ タイプが異なると、動作が大きく異なる可能性があります。

于 2012-12-28T10:47:48.430 に答える
2

これがあなたが探しているものだと思います: wget for firefox

于 2013-01-01T17:19:17.073 に答える