で自分がちょっと変更した部分は以下の通り:
- 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;
};