@ISA = qw(xmlrtorrent::TalkerBase);
use RPC::XML;
+use RPC::XML::Parser;
use IO::Socket::UNIX;
use strict;
$self->{'_PARAMS'} = {
'SOCKET' => ['', 'filename of socket'],
};
+ $self->{'__RPCXMLPARSER'} = RPC::XML::Parser->new();
bless($self, $class);
sub send_request {
my $self = shift;
- my @params = @_;
+ my (@params) = (@_);
- unless (exists($self->{'_PARAMS'}->{'SOCKET'}) and defined($self->{'_PARAMS'}->{'SOCKET'}) and ($self->{'_PARAMS'}->{'SOCKET'} ne '')) {
+ my $socketfile = $self->_getval('SOCKET');
+
+ unless (defined $socketfile and $socketfile ne '') {
return 'socket talker: SOCKET not set';
}
# prepare socket
my $socket = IO::Socket::UNIX->new(
'Type' => SOCK_STREAM,
- 'Local' => $self->{'_PARAMS'}->{'SOCKET'},
+ 'Peer' => $socketfile,
)
- or return "socket: cannot connect to SOCKET: $!";
+ or return "socket talker: cannot connect to SOCKET: $!";
$socket->autoflush(1); # default since 1.18, but be sure
# prepare XML RPC request
- my $rpc_request = RPC::XML::request->new(@params);
+ my $rpc_request = RPC::XML::request->new(@params)->as_string();
# prpepare SCGI request
my $scgi_request =
# read from socket
while (my $line = <$socket>) {
- last if ($line =~ /^$/); # munch headers
+ last if ($line =~ /^\s*$/); # munch headers
}
my $ret = '';
while (my $line = <$socket>) {
$ret .= $line;
}
- $socket->close();
+ $socket->close() or return "socket talker: cannot close SOCKET: $!";
- return $ret;
+ return $self->{'__RPCXMLPARSER'}->parse($ret);
}
1;