金曜日, 7月 08, 2005

Content-Encoding: gzip

HTTPの話。
前回はchunkedに対応したので、今度はgzipに対応してみます。これで圧縮された転送にも対応できるわけですね。

ソケットから読み込んだデータをバッファにためて、perlioを使って解凍します。
ここで「使いにくいなー」と思う、readコマンド。
最初はソケットから読み込みながら伸張しようと思っていたんですが、なんと!指定するバイト数分読み込むのではなくて、読み込んだ(伸張した)バイト数をカウントするんですね。
これは不便。だって、圧縮されてるデータを展開したら何バイトになるかなんてわからないじゃないですか。なのでなんだか2度手間な感じになってます。

サンプルコード
-------------------------------------------------------------
my $buff = '';
if ( $chunked ) {
while ( <$sock> ) {
warn $_ if $debug;
last if m/^\r\n$/;
s/\r\n//;
s/\s//i;
my $content_length = hex($_) or last;
my $tmp;
read $sock, $tmp, $content_length;
$buff .= $tmp;
}
}
elsif ( $content_length ) {
read $sock, $buff, $content_length;
}

my $content = '';
if ( $gzipped ) {
open FH, '<:gzip', \$buff or die $!;
$content .= $_ while ;
close FH or die $!;
}
else {
$content .= $buff;
}
-------------------------------------------------------------

0 件のコメント: