読者です 読者をやめる 読者になる 読者になる

Accept-Encoding gzipを指定したときの LWP::UserAgentと Furlの挙動に関するメモ

perl

挙動の違いがあったのでメモ.

サーバプログラム

use strict;
use warnings;

use Plack::Builder;

builder {
    enable 'Deflater'; # Don't use version 0.10
    sub { [200, [], ["hello world\n"]]}
}

LWP::UserAgent

レスポンスオブジェクトの contentメソッドでは圧縮されたデータ、
decode_contentメソッドでは伸長されたデータ(文字コードも decodeされる)が
返ります.

use strict;
use warnings;

use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
$ua->default_header('Accept-Encoding' => 'gzip');
my $res = $ua->get('http://localhost:5000');
die "Can't get" unless $res->is_success;

print $res->content;         # 圧縮されたデータ
print $res->decoded_content; # 伸長されたデータ("Hello World\n")

Furl

Furlではレスポンスオブジェクトの contentメソッドで伸長された
データが返ってきます.

use strict;
use warnings;

use Furl;

my $ua = Furl->new(
    headers => [ "Accept-Encoding" => 'gzip' ],
);
my $res = $ua->get('http://localhost:5000');
die "Can't get" unless $res->is_success;

print $res->content; # 伸長されたデータ("Hello World\n")

Accept-Encoding: gzipを指定した際, decoded_contentメソッド
使うと undefが返るという問題がありましたが, 2.18で修正されました.

おわりに

LWP::UserAgentから Furlに置き換える際, Accept-Encodingを指定しているので
あれば, レスポンスオブジェクトの contentメソッドの使用には若干注意が
必要ということがわかりました.