GoogleAppEngineにdjangoのアプリを載せていたのですが、
レスポンスサイズが大きいな……と思い、gzip圧縮しよう!と思ったら予想以上にドハマリしてしまったので。
備忘録的に。
事象
当初はDjangoのdjango.middleware.gzip.GZipMiddlewareを使用して解決のはずだったんですが、
headerにAccept-Encodingを入れてもgzip圧縮されて帰ってこず!
おかしいなと思い、request headerを見てみると、プログラム上ではAccept-Encodingのヘッダーが消えている!
何故だッ!? と、思ったらちゃんとドキュメントに書いてありました。
- Accept-Encoding
- Connection
- Keep-Alive
- Proxy-Authorization
- TE
- Trailer
- Transfer-Encoding
上のrequest headerは勝手に消えるみたいですねー
解決
ではでは、Accept-Encodingなしでどうやってgzip化するかどうか判定させよう?と思ったら、これもちゃんと書いてありました。
response_compression
curl \
-H "accept-encoding:gzip" \
-H "user-agent:gzip" \
https://xxxxxxxxxx.appspot.com/sugoi_api/
request headerのAccept-EncodingとUser-Agentの両方にgzipと含まれていれば、
上のcurlの戻りがアプリ上で特に何もしなくても自動的にgzip化してくれて返してくれました。
ちなみに一般的なブラウザのUAにはgzipと含まれていないんですが、ちゃんとgzip圧縮されたものが返却されました。
なので、gzip解凍ができるブラウザ、またはgzipってプログラム上で明示的に入れていれば圧縮して返すよ!ということなのかなと。
いやけど、User-Agentも判定に入れるってわかりにくくないですかね?
いやちゃんと最初から全部読んでいれば良かったんですが……うむむむ。