April 06, 2004

Amazon の輸入盤画像

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;
Posted by miyagawa at April 6, 2004 12:30 AM | Permalink | Comments (0) | TrackBack(0)
Comments
Trackbacks
TrackBack URL for this entry: http://blog.bulknews.net/mt3/mt-tb.cgi/906
Post a comment