kazuakix の日記

Windows Phone とか好きです

HttpClient で HTTP 圧縮を使う

以前も書いたのですが、WinRT には 2 種類の HttpClient があります。


このうち System.Net.Http.HttpClient ではお手軽に HTTP 圧縮を使うことができます。

普通に通信する場合

using (var req = new HttpClient())
using (var res = await req.GetAsync("http://~"))
if (res.IsSuccessStatusCode)
{
    using (var src = await res.Content.ReadAsStreamAsync())
    {
        // いろいろ
    }
}

 
通信内容を Fiddler で確認するとこんな感じ

f:id:kazuakix:20140911230153j:plain

リクエスト

GET /smartphone/dat/1409368527.dat HTTP/1.1
Accept: */*
Accept-Encoding: identity
User-Agent: NativeHost
Host: anago.2ch.net

Connection: Keep-Alive

レスポンス

HTTP/1.1 200 OK
Date: Thu, 11 Sep 2014 12:30:38 GMT
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8q PHP/5.3.8 mod_antiloris/0.4
Last-Modified: Thu, 11 Sep 2014 12:27:33 GMT
ETag: "10c80ea-22862-502c94af7f740"
Accept-Ranges: bytes
Content-Length: 141410
Vary: Accept-Encoding
Connection: close
Content-Type: text/plain

普通ですね。

HTTP 圧縮を利用する場合

HttpClient に HttpClientHandler を渡すことで、圧縮解除メソッドを指定することができます。

var handler = new HttpClientHandler()
{
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
using (var req = new HttpClient(handler))
using (var res = await req.GetAsync("http://~"))
if (res.IsSuccessStatusCode)
{
    using (var src = await res.Content.ReadAsStreamAsync())
    {
        // いろいろ
    }
}

圧縮解除メソッド (AutomaticDecompression ) には gzip, deflate またはその両方を指定することができます。(というか deflate という仕様を実装しているのが gzip なので同じもののはずなのですが...)

実際に通信するとこんな感じ。

リクエスト

GET /smartphone/dat/1409368527.dat HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: NativeHost
Host: anago.2ch.net
Connection: Keep-Alive

レスポンス

HTTP/1.1 200 OK
Date: Thu, 11 Sep 2014 13:46:29 GMT
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8q PHP/5.3.8 mod_antiloris/0.4
Last-Modified: Thu, 11 Sep 2014 13:13:32 GMT
ETag: "10c80ea-22a68-502c9ef6af700"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain

リクエストの Accept-Encoding に gzip, deflate が指定されて、レスポンスの Content-Encoding が gzip になっていますね。実にお手軽でいい感じです。

ところで Windows.Web.Http.HttpClient ではどうやるんでしょうね?