#!/usr/bin/perl use HTTP::Daemon; use HTTP::Status; use HTTP::Response; use CGI; my $d = new HTTP::Daemon LocalPort => 8084; print "Please contact me at: url, ">\n"; $SIG{CHLD} = "IGNORE"; # do not accumulate defunct processes my %uri_sets; my %uri_queues; #NOT REENTRANT: CAN NOT FORK DUE TO THE GLOBAL VARIABLES %uri_sets & %uri_queues #HENCE, THE "PID" ARGUMENT OF EVERY REQUEST MUST IDENTIFY THE SET OF URI #IT WANTS TO WORK WITH. MOREOVER, EVERY CLIENT MUST WORK WITH A DIFFERENT SET #OF URI, I.E. EVERY PID MUST BE UNIQUE. #CSC: WHAT IF THE CLIENTS ARE ON DIFFERENT MACHINES AND HAVE THE SAME PID? #CSC: CGI MODULE REQUIRED TO PROCESS PARAMETERS BETTER while (my $c = $d->accept) { while (my $r = $c->get_request) { if ($r->method eq 'GET' and $r->url->path eq '/add_if_not_in') { my $http_query = $r->url->equery; my $cgi = new CGI("$http_query"); my $uri = $cgi->param('uri'); my $pid = $cgi->param('PID'); print "$pid: "; print(@{$uri_queues{$pid}} + 0); print "/"; my $tot = keys(%{$uri_sets{$pid}}) + 0; print "$tot $uri: "; my $res; if (!(defined($uri_sets{$pid}->{$uri}))) { if ($tot + 1 > 20) { $uri_sets{$pid}->{$uri} = -1; push @{$uri_queues{$pid}},$uri; $res = "added_with_mark"; } else { $uri_sets{$pid}->{$uri} = 1; push @{$uri_queues{$pid}},$uri; $res = "added"; } } else { $res = "already_in"; } print $res."\n"; my $response = new HTTP::Response; $response->content("\n<$res/>\n"); $response->content_type('text/xml'); $c->send_response($response); } elsif ($r->method eq 'GET' and $r->url->path eq '/get_next') { my $http_query = $r->url->equery; my $cgi = new CGI("$http_query"); my $pid = $cgi->param('PID'); print "$pid: "; print(@{$uri_queues{$pid}} + 0); print "/"; print(keys(%{$uri_sets{$pid}}) + 0); print " "; my $elem = shift @{$uri_queues{$pid}}; my $mark = $uri_sets{$pid}->{$elem}; my $response = new HTTP::Response; my $xml_header = "\n"; if ($mark == 1) { print "$elem removed\n"; $response->content("$xml_header\n"); } elsif ($mark == -1) { print "$elem (marked) removed\n"; $response->content("$xml_header\n"); } else { print "is now empty\n"; $response->content("$xml_header\n"); } $response->content_type('text/xml'); $c->send_response($response); } elsif ($r->method eq 'GET' and $r->url->path eq '/reset_to_empty') { my $pid = $r->url->query; $pid =~ s/[^=]*=//; # Next loop for debugging purposes only my $count = 1; while (my $e = shift @{$uri_queues{$pid}}) { print "#$count $e forced out of the set\n"; $count++; } print "************\nThe URI set $pid is now empty again\n"; delete($uri_sets{$pid}); my $response = new HTTP::Response; $response->content("\n\n"); $response->content_type('text/xml'); $c->send_response($response); } else { $c->send_error(RC_FORBIDDEN) } } $c->close; undef($c); }