1 # Talker using SCGI over Unix Domain Socket
3 # (c) 2008 by Christian Garbs <mitch@cgarbs.de>
4 # licensed under GNU GPL v2
6 package xmlrtorrent::SocketTalker;
7 use xmlrtorrent::TalkerBase;
8 @ISA = qw(xmlrtorrent::TalkerBase);
17 my $self = $class->SUPER::new();
19 $self->{'NAME'} = 'socket';
20 $self->{'DESC'} = 'talker using SCGI over Unix Domain Socket';
21 $self->{'_PARAMS'} = {
22 'SOCKET' => ['', 'filename of socket'],
24 $self->{'__RPCXMLPARSER'} = RPC::XML::Parser->new();
28 $self->_prepare_parameters();
33 sub _create_netstring($$) {
36 my $len = length $string;
37 return "$len:$string,";
40 sub _create_scgi_header($$$) {
42 my ($name, $value) = (@_);
43 return "$name\0$value\0";
50 my $socketfile = $self->_getval('SOCKET');
52 unless (defined $socketfile and $socketfile ne '') {
53 return 'socket talker: SOCKET not set';
57 my $socket = IO::Socket::UNIX->new(
58 'Type' => SOCK_STREAM,
59 'Peer' => $socketfile,
61 or return "socket talker: cannot connect to SOCKET: $!";
62 $socket->autoflush(1); # default since 1.18, but be sure
64 # prepare XML RPC request
65 my $rpc_request = RPC::XML::request->new(@params)->as_string();
67 # prpepare SCGI request
69 $self->_create_netstring(
70 $self->_create_scgi_header('CONTENT_LENGTH', length $rpc_request)
72 $self->_create_scgi_header('SCGI', '1')
78 $socket->print($scgi_request);
81 while (my $line = <$socket>) {
82 last if ($line =~ /^\s*$/); # munch headers
85 while (my $line = <$socket>) {
89 $socket->close() or return "socket talker: cannot close SOCKET: $!";
91 return $self->{'__RPCXMLPARSER'}->parse($ret);