AWS のRESTインタフェースで返ってくる ImageUrlSmall とか ImageUrlMedium のURLは、輸入盤の場合は 09 を 01 に置換しないとダメみたい。で、これを判断するために 「PATH_INFO の URL を受け取って、Content-Length: 807 のときはURLを置換したものをリクエストして返す mod_perl 用のプロキシハンドラ」というバッドノウハウの極みなものを書いてたんだけど、javascript を使ったもっとスマートな方法が hail2u に書いてありました。
hail2u.net - Weblog - Amazonの画像置換
AWSで返された画像のURLとかAmazonのASINコードから09で類推した画像が、1*1の黒いGIF画像だった場合に、01で類推できるURL無理やり置換してみる実験。
しかし、img タグに width とか height とかつけてるとそっちに引きずられて、このコードが動かなくなってしまうな。 if (this.width==this.height) だとうまくいく。でもこれだと正しい画像も表示できなくなるかも。
というわけでやはりプロキシなハンドラを使うことにした。一応mod_proxy 経由でキャッシュもみこめるし。
ちなみにコードはこんな感じであります。
package Bormius::AmazonImage; # <Location /awsimg> # SetHandler perl-script # PerlHandler Bormius::AmazonImage # </Location> # see http://hail2u.net/blog/coding/air.html use strict; use Apache::Constants; use HTTP::Request::Common; use constant BLANK_IMAGE_LENGTH => 807; sub make_request { my($r, $uri) = @_; my $request = GET $uri; return LWP::UserAgent->new->simple_request($request); } sub handler { my $r = shift; my $uri = $r->path_info(); $uri =~ s!^/!!; my $res = make_request($r, $uri); # if it's a Blank Image, try 09 => 01 if ($res->header('Content-Length') == BLANK_IMAGE_LENGTH) { $uri =~ s/\.09\./.01./; $res = make_request($r, $uri); } $r->content_type($res->header('Content-type')); $r->status($res->code); $r->status_line($res->status_line); my $table = $r->headers_out; $res->scan(sub { $table->add(@_); }); $r->send_http_header(); $r->print($res->content); return OK; } 1;