困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

Unityの話〜GZ圧縮ファイルを取得しようとしてつまづいた話〜

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は、サーバー側が最終的にどのアルゴリズムを採用したかをフロントに通知する目的のヘッダー。

しかし、こっちはGZIP指定されていても、フロント側でGZIP扱いになっていなかったので、割と適当なもかもしれない説

weblabo.oscasierra.net