X-Git-Url: https://git.camperquake.de/gitweb.cgi?p=xmlrtorrent.git;a=blobdiff_plain;f=xmlrtorrent%2FSocketTalker.pm;h=a28f141417dfeafdfb8b043b569dc1296a4bf50d;hp=453b7f639ef608a134300648e9d4fa08610bde7d;hb=HEAD;hpb=feda2830239fe2c173411147161db90dc9c304f9 diff --git a/xmlrtorrent/SocketTalker.pm b/xmlrtorrent/SocketTalker.pm index 453b7f6..a28f141 100644 --- a/xmlrtorrent/SocketTalker.pm +++ b/xmlrtorrent/SocketTalker.pm @@ -4,10 +4,11 @@ # 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; @@ -18,8 +19,9 @@ sub new { $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); @@ -43,48 +45,50 @@ sub _create_scgi_header($$$) { 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;