で自分がちょっと変更した部分は以下の通り:
- XMLRPCで prefix.method_nameって呼んでた名残があるので、prefixをとっぱらっちゃう
- $q->argsが返すのは RPC::XML::simple_type とかの値なので、これを直してあげないとXMLRPC::Liteで動いてたコードが動かない
- @ret = () で RPX::XML::resposeを作ろうとするとundefを返してくるので、その後の $content->as_stringがこける。レガシーコードを期待しているクライアント側との兼ね合いもあるので@retが空だったら [] を渡してあげる
use strict; use Plack::Builder; use Plack::Request; use RPC::XML; use RPC::XML::ParserFactory 'XML::LibXML'; my $app = sub { my $req = Plack::Request->new(@_); my $q = RPC::XML::ParserFactory->new()->parse($req->content); my $method_name = $q->name; # (1) $method_name =~ s/^prefix\.//; my $code = $webapp->can($method_name); if (! $code) { return [ 404, [ "Content-Type" => "text/plain" ], [ "RPC method $method_name not found" ] ]; } # (2) my @ret = $webapp->$code( map { $_->value } @{$q->args} ); # (3) my $content = RPC::XML::response->new( @ret ? @ret : [] ); return [ 200, [ "Content-Type" => "text/xml" ], [ $content->as_string ] ]; }; builder { enable 'ContentLength'; $app; };