2012年6月27日水曜日

S3のエラーハンドリングPerl編

S3は作ったばかりのバケットを扱おうとすると、307 redirectを返すことがある。他にも http://docs.amazonwebservices.com/AmazonS3/latest/API/ErrorResponses.htmlにあるように多数のエラーレスポンスは定義されている。が、3xx系は扱えないライブラリであるLWPがメインのperlの場合

CPANに登録されているAmazon::S3とNet-Amazon-S3ではこんな対応がされている。(というかここのコメント100%同じ。ライセンス的にはokだからいいんだろう)

cpansearch.perl.org/src/TIMA/Amazon-S3-0.45/lib/Amazon/S3.pm

http://cpansearch.perl.org/src/PFIG/Net-Amazon-S3-0.56/lib/Net/Amazon/S3.pm

# Send a HEAD request first, to find out if we'll be hit with a 307 redirect.
# Since currently LWP does not have true support for 100 Continue, it simply
# slams the PUT body into the socket without waiting for any possible redirect.
# Thus when we're reading from a filehandle, when LWP goes to reissue the request
# having followed the redirect, the filehandle's already been closed from the
# first time we used it. Thus, we need to probe first to find out what's going on,
# before we start sending any actual data.

ということらしい。LWPがサポートしてないが故にHEADをわざわざ発行しているという。

Perlモジュール/LWP - Walrus, Digit.

POSTメソッドの場合でもこれを行うには、正攻法であればrequest処理時に返されるHTTP::Responseオブジェクトの内容を調べます。 リダイレクトが指定されていると、HTTP::Responseオブジェクトのis_responseメソッドの返り値は1になります。 この時に、HTTP::Responseオブジェクトのheaderメソッドで'Location'に対応する値(リダイレクト先のURLです)を取得し、このURLをGET(リダイレクトはGETで行うのが標準です)すれば良いのです。

0 件のコメント:

コメントを投稿