えんじにあ・めも

日々の生活に役立つ記事をエンジニア視点で

GAEにUnityWebRequestを使ってgzip圧縮転送をする

UnityWebRequestでgzip転送をしたいときがあります。
通常gzip転送する場合は、Accept-Encodingにgzipを指定します。

ただしGAEの場合は、それだけではgzip転送が有効になりません。
詳細は以下の公式ドキュメントに書いています。

How do I serve compressed content? cloud.google.com

Accept-EncodingとUser-Agentにgzipを入れないと有効になりません、ややこしいですね
通常のブラウザだとUser-Agentにgzipは入ってませんが、GAEはgzipで転送してくれます。
つまり、主要なブラウザであるか、gzipがUser-Agentに入っている必要があります、ややこしい。

ということでRequest-Headerに設定するだけです。

GAEにUnityWebRequestでgzipする

ちなみに、UnityWebRequestのSetRequestHeaderにはこんな事が書いています。
These headers cannot be set with custom values on any platform: accept-charset, access-control-request-headers, access-control-request-method, connection, date, dnt, expect, host, keep-alive, origin, referer, te, trailer, transfer-encoding, upgrade, via.
It is possible to set a custom value for the accept-encoding header but the resulting behavior is unreliable so it is strongly recommended to let it be automatically handled unless you can accept the risk of unexpected results.
The user-agent header is automatically set by Unity and it is not recommended to set it to custom value.

docs.unity3d.com

流し読みするとUser-Agentは変更できないような感じに見えますが、変更をお勧めしないだけであって変更できます。 変更できることはUnity 2018.3でPC,iOS,Androidで確認しています。
ただし上のサンプルのようなUser-Agentだと訳が分からないので、UnityのバージョンやOS、アプリのバージョンなどを仕込んでおくと良いでしょう。 最終的にどこかにgzipという単語さえ入っていればGAEはgzipで転送してくれます。
まぁでも通常はAccept-Encodingの指定だけでいいので、GAE使う人以外は中々User-Agentを書き換えないと思いますが・・・

余談: しかし標準のUser-AgentはiOSAndroidで全然形式が違って見にくいですよね。User-Agentは書き換えたほうが統一出来るような気がします。