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;