14

問題

Node.JS を介して不明な長さのリソースを提供しています。このため、Content-Lengthヘッダーを設定できません。HTTP 1.1 の場合、この性質のリソースにはチャンク エンコーディングを使用する必要があります。Node.JS はこれを認識しており、次のヘッダーを使用して、独自のチャンク転送エンコーディングでデータを送信します。

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: close
...

これはすべて問題なく、行儀の良いクライアントに適しています。 ただし、動作があまり良くないクライアント (つまり、Android 2.2 以前) をサポートする必要があります。 これらのクライアントは、チャンク転送エンコーディングを適切にサポートしていません。

修正試行 #1

私の最初の考えは、エンコーディングをnone次のように設定することでした:

response.writeHead(200, {'Transfer-Encoding': 'none'});

これにより、Node.JS の自動チャンク エンコーディングが無効になり、ほとんどのクライアントとの互換性が維持されます。しかし、Android 2.3 以降のクライアントは、このような偽の転送エンコード ヘッダーが表示されると咳をして窒息するだけなので、壊れてしまいました。

試行番号 2 を修正 (助けが必要な場合)

でリクエストを行うとHTTP/1.0、サーバーはチャンクエンコーディングなしで適切にレスポンスを返します:

HTTP/1.1 200 OK
Connection: close
...

これで問題は解決し、面倒なすべてのクライアントに対して機能するストリームを提供できるようになりました。の偽のヘッダーを送信する必要はありTransfer-Encodingません。また、コンテンツの長さを指定する必要もありません。

Node.JS の HTTP サーバーが常に HTTP/1.0 モードでサービスを提供するように強制するにはどうすればよいですか?

4

3 に答える 3

8

私の目的のために、応答オブジェクトの文書化されていないプロパティを使用して、チャンクの強制的な使用を無効にする簡単な方法を見つけました。

response.useChunkedEncodingByDefault = false;

それはとても簡単です。もちろん、Node.js の将来のバージョンでこのプロパティを利用できるようにすることは最善ではありません。おそらくより良い解決策があるかもしれませんが、これは今のところ私にとってはうまくいきます。

于 2012-07-21T06:13:37.467 に答える