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);
16 my $self = $class->SUPER::new();
18 $self->{'NAME'} = 'socket';
19 $self->{'DESC'} = 'talker using SCGI over Unix Domain Socket';
20 $self->{'_PARAMS'} = {
21 'SOCKET' => ['', 'filename of socket'],
26 $self->_prepare_parameters();
31 sub _create_netstring($$) {
34 my $len = length $string;
35 return "$len:$string,";
38 sub _create_scgi_header($$$) {
40 my ($name, $value) = (@_);
41 return "$name\0$value\0";
48 unless (exists($self->{'_PARAMS'}->{'SOCKET'}) and defined($self->{'_PARAMS'}->{'SOCKET'}) and ($self->{'_PARAMS'}->{'SOCKET'} ne '')) {
49 return 'socket talker: SOCKET not set';
53 my $socket = IO::Socket::UNIX->new(
54 'Type' => SOCK_STREAM,
55 'Local' => $self->{'_PARAMS'}->{'SOCKET'},
57 or return "socket: cannot connect to SOCKET: $!";
58 $socket->autoflush(1); # default since 1.18, but be sure
60 # prepare XML RPC request
61 my $rpc_request = RPC::XML::request->new(@params);
63 # prpepare SCGI request
65 $self->_create_netstring(
66 $self->_create_scgi_header('CONTENT_LENGTH', length $rpc_request)
68 $self->_create_scgi_header('SCGI', '1')
74 $socket->print($scgi_request);
77 while (my $line = <$socket>) {
78 last if ($line =~ /^$/); # munch headers
81 while (my $line = <$socket>) {