というわけで、patchを送っときました。
404 Blog Not Found:はてなキーワード連想語API vs. XMLRPC::Liteそうなのです。XMLRPC::Liteは、Non-ASCIIな文字列はbase64でおくっておったのですね。
はてなブックマーク - torumのブックマーク/ 2006年02月16日
XML-RPCでNon-ASCIIな文字列をBase64エンコーディングしない、と仕様自体が改善されてからもう結構たったから、これはXMLRPC::Liteのバグかと...。
それで以下を見ると、確かにそうなってます。
XML-RPC SpecificationUpdated 6/30/03 DW Removed "ASCII" from definition of string.
とはいえ、こういうプロトコルの仕様変更の場合には、実装側でも新旧両方に対処しといた方がいいので、はてなにおかれてはBase64された場合の対処もお願いしつつ、Module側でも新旧両方に対処してもらうというのが筋。もちろんModule User側で
XMLRPC::Lite (SOAP::Lite) で base64 エンコーディングさせない: blog.bulknews.netmy $res = XMLRPC::Lite->new->proxy('http://d.hatena.ne.jp/xmlrpc') ->call('hatena.getSimilarWord', { wordlist => [ XMLRPC::Data->type(string => "はてな") ] } );
とするのも一向だけど、あまりバッドノウハウは貯めたくないし、というわけで、とりあえず以下のpatchを作者に送付しておきました。
use XMLRPC::Lite -nobase64;
とするか、$XMLRPC::Serializer::USE_BASE64 = 0;とするかすると、base64 encodingを行わなくなります。
Dan the CPAN Committer
diff -ruN SOAP-Lite-0.60/lib/XMLRPC/Lite.pm SOAP-Lite-0.60-dan/lib/XMLRPC/Lite.pm --- SOAP-Lite-0.60/lib/XMLRPC/Lite.pm 2006-02-16 20:38:46.000000000 +0900 +++ SOAP-Lite-0.60-dan/lib/XMLRPC/Lite.pm 2003-08-19 03:44:29.000000000 +0900 @@ -15,14 +15,6 @@ use vars qw($VERSION); $VERSION = sprintf("%d.%s", map {s/_//g; $_} q$Name: release-0_60-public $ =~ /-(\d+)_([\d_]+)/); -sub import{ - my $class = shift; - my %arg = map { $_ => 1 } @_; - if (exists $arg{-utf8string} || exists $arg{-nobase64}){ - $XMLRPC::Serializer::USE_BASE64 = 0; - } -} - # ====================================================================== package XMLRPC::Constants; @@ -53,25 +45,19 @@ @XMLRPC::Serializer::ISA = qw(SOAP::Serializer); -our $USE_BASE64 = 1; - sub new { my $self = shift; + unless (ref $self) { my $class = ref($self) || $self; - my %typelookup = - ( - int => [20, sub {$_[0] =~ /^[+-]?\d+$/}, 'as_int'], - double => [30, sub {$_[0] =~ /^(-?(?:\d+(?:\.\d*)?|\.\d+)|([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)$/}, 'as_double'], - dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'], - string => [40, sub {1}, 'as_string'], - ); - if ($USE_BASE64){ - $typelookup{base64} = - [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64']; - }; $self = $class->SUPER::new( - typelookup => \%typelookup, + typelookup => { + base64 => [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'], + int => [20, sub {$_[0] =~ /^[+-]?\d+$/}, 'as_int'], + double => [30, sub {$_[0] =~ /^(-?(?:\d+(?:\.\d*)?|\.\d+)|([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)$/}, 'as_double'], + dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'], + string => [40, sub {1}, 'as_string'], + }, attr => {}, namespaces => {}, @_,
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。