test for symbol table/package lookup bug
[urisagit/Stem.git] / bin / cgi2stem.pl
1 #!/usr/local/bin/perl -wT
2
3 # This is a CGI script that interfaces to stem. it collects all the
4 # CGI data and sends it to a Stem::SockMsg cell as a single
5 # Stem::Packet.  It reads a single Stem::Packet back from the socket
6 # and uses the data in there to generate a response page.
7
8 $|++ ;
9
10 use strict ;
11 use lib '/wrk/stem/src/stem/lib/' ;
12
13 use CGI ;
14 use CGI::Carp qw(fatalsToBrowser) ;
15 use IO::Socket ;
16
17 use Stem::Packet ;
18
19 my $cgi = CGI->new() ;
20
21 my %cgi_data ;
22
23 # get all the cgi data we can
24
25 $cgi_data{ 'params' }   = get_cgi_data( 'param' ) ;
26 $cgi_data{ 'cookies' }  = get_cgi_data( 'cookie' ) ;
27 #$cgi_data{ 'env' }     = { %ENV } ;
28 #$cgi_data{ 'self_url' }        = $cgi->self_url() ;
29 $cgi_data{ 'url' }      = $cgi->url() ;
30 #$cgi_data{ 'cgi' }     = $cgi ;
31
32 # todo: handle default host:port here
33
34 my $data = send_and_get_packet( \%cgi_data ) ;
35
36 # use Data::Dumper ;
37
38 # print $cgi->header() ;
39 # # print "<PRE>\n", Dumper( \%cgi_data ), "\n</PRE>\n" ;
40 # print "<PRE>\n", Dumper( $data ), "\n</PRE>\n" ;
41
42 # exit ;
43
44 if ( ref $data eq 'SCALAR' ) {
45
46         print $$data ;
47         exit ;
48 }
49
50 print $cgi->header(), <<HTML ;
51 <HTML>
52 cgi2stem error: $data
53 </HTML>
54 HTML
55
56
57
58 # this works for both cookies and params as their APIs are the same
59
60 sub get_cgi_data {
61
62         my( $type ) = @_ ;
63
64         my %cgi_info ;
65
66         foreach my $name ( $cgi->$type() ) { ;
67
68                 my @values = $cgi->$type( $name ) ;
69
70                 if ( @values > 1 ) {
71                         $cgi_info{ $type } = \@values ;
72                         next ;
73                 }
74
75                 $cgi_info{ $name } = shift @values ;
76         }
77
78         return \%cgi_info ;
79 }
80
81 sub send_and_get_packet {
82
83         my( $in_data, $host, $port ) = @_ ;
84
85         $port ||= 9999 ;
86         $host ||= 'localhost' ;
87
88         my $sock = IO::Socket::INET->new( "$host:$port" ) ;
89
90         $sock or return "can't connect to $host:$port\n" ;
91
92         my $packet = Stem::Packet->new( codec => 'Storable' ) ;
93
94         my $write_buf = $packet->to_packet($in_data) ;
95
96         syswrite( $sock, $$write_buf ) ;
97
98         my $read_buf  ;
99
100         while( 1 ) {
101
102                 my $bytes_read = sysread( $sock, $read_buf, 8192 ) ;
103
104                 return "sysread error $!" unless defined $bytes_read ;
105                 return "sysread closed" if $bytes_read == 0 ;
106
107                 my $result = $packet->to_data( $read_buf ) ;
108
109                 return $result if $result ;
110         }
111 }