web-dev-qa-db-ja.com

ブラウザから送信されたHTTP Postデータの圧縮

圧縮されたPOSTデータをJavascriptで制御するサーバーに送信します。HTTPレイヤーに圧縮を処理させる方法はありますか。

JSONを送信しています。コンテンツタイプをGZIP/deflateに設定すると、ブラウザーは自動的に圧縮し、次にdeflate modを使用したApacheは自動的に圧縮解除されるので、アプリケーションはデータがまったく圧縮されていることを考慮する必要はありませんか?

私はそれが他の方法で動作することを知っていますが、それをこのように動作させる方法はありますか?

35
Derek Organ

ブラウザはデータを自動的にgzipエンコードしますか?短い答えはノーです。

長い答えは、一部のユーザーエージェントはこのようなことを行うことができるが、あなたは明確にそれに頼ることができないということです。 Apache mod_deflateドキュメントの状態:

webDAVクライアントなど、一部の特別なアプリケーションは実際にリクエストの圧縮をサポートしています。

だから、いや、それは動作しません。適切なHTTP要求メッセージを自分で生成する必要があります。この場合の適切なヘッダーはContent-Encoding: gzipであり、Content-Type:ではありません。コンテンツ自体がapplication/jsonであるため、HTTPリクエストメッセージのエンティティ本体を転送用にエンコードするだけです。

圧縮後にメッセージエンティティ本体のバイト単位のサイズを指定する適切なContent-Length:ヘッダーも追加する必要があることに注意してください。または、Transfer-Encoding: chunkedを使用してHTTPメッセージを送信し、content-length仕様を無視してください。

受信側で、canmod_deflateに入力フィルターを使用するように指示する 情報を解凍します。

<Location /dav-area>
SetInputFilter DEFLATE
</Location>

圧縮されたメッセージ本文を2、3のリソースだけで受信している場合、これは少し重いです。代わりに、おそらくクライアント側のスクリプトを使用してContent-Encoding: gzipヘッダーを確認し、リクエスト本文を手動で解凍する必要があります。たとえば、PHPでこれを行う方法は、まったく別の問題です。詳細が必要な場合は、別の質問を投稿してください。

70
rdlowrey

可能ですが、サーバーに着信するgzip圧縮されたデータの受け入れを強くお勧めします。主な理由は、サーバーが gzip bombed にならないようにすることです。一般に、実際にデータを圧縮解除する前に、圧縮されていないデータがどのように見えるかを知ることはできないため、ユーザーは無害な1 KBまたは1 M​​Bのデータのように見えるが、実際には100 GBのデータであるWeb要求を送信できます。サーバー(nginxまたはApache)は、すべてを解凍しようとして次の10分間ハングアップし、最終的にメモリ不足/ロックアップを引き起こします。

9
Michael Butler

https://github.com/dankogai/js-deflate を使用してこれを実現しましたが、何らかの理由でポストデータが+記号を削除し、スペースで置き換えます。

JavaScriptを介してデータを送信するには:

params.mapdata=  btoa(RawDeflate.deflate(JSON.stringify(mapdata)));

Php経由でデータを受信するには:

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));
0
Darren Johnston