Unity2018.3.8f1での話。
結構ハマったのでメモ。
【現象】 サーバーにおいてあるGZ圧縮されたファイルを、UnityWebRequestを使ってHTTPで取得しようとしたところ、プラットフォーム毎に挙動に差が出た。
具体的には、
・PC上のUnityEditor →圧縮されたファイルのままダウンロード
・Android実機 →解凍された状態でダウンロード (バイト数が解凍後の物になり、テキストデータとして、webRequest.downloadHandler.textの中に解凍後の文字列が格納されていた。)
ソースコードとしては
public IEnumerator CoGetZipForShinEdit(string url, Action<UnityWebRequest> callback) { //URLをGETで用意 UnityWebRequest webRequest = UnityWebRequest.Get(url); yield return webRequest.SendWebRequest(); //エラーが出ていないかチェック if (webRequest.isNetworkError || (string.IsNullOrEmpty(webRequest.error) == false)) { //通信失敗 } else { //通信成功 callback(webRequest); } }
これだと、解凍後の物がきた。
【解決】
webRequest.SetRequestHeader("accept-encoding", "deflate,gzip");
の一文を追加で直った。 デフォルトのHTTPリクエストヘッダーを知る手段がわからなかったので、
http://sassembla.github.io/Public/2018:03:24%2018-26-28/2018:03:24%2018-26-28.html
この人のを見る限り、きちんとAccept-Encodingは追加されているのだが、 このバージョンのバグなのかわからないが、実動作的にバグってしまったので、 これでいったん解決した。
具体的には
public IEnumerator CoGetZipForShinEdit(string url, Action<UnityWebRequest> callback) { //URLをGETで用意 UnityWebRequest webRequest = UnityWebRequest.Get(url); // これ指定しないと、Android実機で解凍されたデータが来てしまう webRequest.SetRequestHeader("accept-encoding", "deflate,gzip"); yield return webRequest.SendWebRequest(); //エラーが出ていないかチェック if (webRequest.isNetworkError || (string.IsNullOrEmpty(webRequest.error) == false)) { //通信失敗 } else { //通信成功 callback(webRequest); } }
こんな感じだ。
・・・と思っていたが、これでもダメな事もあったので、おとなしく受け取ったデータがバイナリか解凍後のデータかは判定した方が良いかもしれない。
【メモ】
Accept-Encodingは、サーバー側に、フロント側で使える解凍アルゴリズムを教えるという目的のヘッダー。
Content-Encodingは、サーバー側が最終的にどのアルゴリズムを採用したかをフロントに通知する目的のヘッダー。