0

チャンク エンコーディングを使用して転送されたデータをブラウザがレンダリングする場合、ブラウザは、データをエンコードするためにチャンク サイズと CRLF を追加せずに元のデータをレンダリングする必要があります。正しいですか?

このコードを例として使用します。

https://gist.github.com/josiahcarlson/3250376

私のブラウザ (Chrome と FF) のレンダリング

12
this is chunk: 0

12
this is chunk: 1

12
this is chunk: 2

12
this is chunk: 3

12
this is chunk: 4

12
this is chunk: 5

12
this is chunk: 6

12
this is chunk: 7

12
this is chunk: 8

12
this is chunk: 9

0

チャンクサイズが表示されるとは思っていませんでした。

ブラウザでエンコーディング情報なしでデータをレンダリングする必要がありますか?

4

3 に答える 3

1

HTTP 1.0クライアントは、チャンク化されたデータをデコードする必要はありません。PythonのBaseHTTPServerクラスによって送信されるデフォルトのhttpバージョンはHTTP1.0です。1.1のバージョンを送信すると、ブラウザは期待どおりにデータをレンダリングします。サーバーが間違ったプロトコルバージョンを送信している場合でも、curlは正しいことを実行することで賢くしようとしているだけだと思います。

応答を送信する前に、コードにパッチを適用してBaseHTTPServerインスタンスのprotocol_version属性を設定します。例の73行目にこれを追加します。

self.protocol_version ='HTTP / 1.1'

HTTP1.0とHTTP1.1の違いの詳細については、このhttp://www8.org/w8-papers/5c-protocols/key/key.htmlを参照してください。

于 2013-02-06T11:15:58.037 に答える
0

コードはそのメッセージを明示的に送信します。ジェネレーターは次のチャンクを作成します。

yield "this is chunk: %s\r\n"%i

そして、それらをソケットに書き込みます

def write_chunk():
    tosend = '%X\r\n%s\r\n'%(len(chunk), chunk)
    self.wfile.write(tosend)

適応すれば、何でも送信できます。

したがって、生成されるチャンクが"this is chunk: 0\r\n"次の場合、 write_chunk メソッドは実際に送信します"18\r\nthis is chunk: 0\r\n\r\n"

"\r\n"キャリッジリターン、改行を意味するエスケープシーケンスです。またはWindowsの改行バージョン。Linuxでは、そのまま使用できます\n

于 2013-02-06T08:37:43.410 に答える
0

ヘッダーでコンテンツのエンコーディングを指定しましたか?

于 2013-02-06T08:42:44.833 に答える