# licensed under GNU GPL v2
package xmlrtorrent::SocketTalker;
-use xmlrtorrent::TalkerBase;
-@ISA = qw(xmlrtorrent::TalkerBase);
+use xmlrtorrent::RTorrentTalkerBase;
+@ISA = qw(xmlrtorrent::RTorrentTalkerBase);
use RPC::XML;
+use RPC::XML::Parser;
use IO::Socket::UNIX;
use strict;
$self->{'NAME'} = 'socket';
$self->{'DESC'} = 'talker using SCGI over Unix Domain Socket';
$self->{'_PARAMS'} = {
- 'SOCKET' => ['', 'filename of socket'],
+ '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 '')) {
- return 'socket talker: SOCKET not set';
+ 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'},
- )
- or return "socket: cannot connect to SOCKET: $!";
+ 'Type' => SOCK_STREAM,
+ 'Peer' => $socketfile,
+ )
+ 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 =
- $self->_create_netstring(
- $self->_create_scgi_header('CONTENT_LENGTH', length $rpc_request)
- .
- $self->_create_scgi_header('SCGI', '1')
- )
- .
- $rpc_request;
+ $self->_create_netstring(
+ $self->_create_scgi_header('CONTENT_LENGTH', length $rpc_request)
+ .
+ $self->_create_scgi_header('SCGI', '1')
+ )
+ .
+ $rpc_request;
# write to socket
$socket->print($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;
+ $ret .= $line;
}
- $socket->close();
+ $socket->close() or return "socket talker: cannot close SOCKET: $!";
- return $ret;
+ return $self->{'__RPCXMLPARSER'}->parse($ret);
}
1;