以前も書いたのですが、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 で確認するとこんな感じ
リクエスト
GET /smartphone/dat/1409368527.dat HTTP/1.1
Accept: */*
Accept-Encoding: identity
User-Agent: NativeHost
Host: anago.2ch.netConnection: 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 ではどうやるんでしょうね?