#!@PERL_BINARY@ # First of all, let's load HELM configuration use Env; my $HELM_LIBRARY_DIR = $ENV{"HELM_LIBRARY_DIR"}; # this should be the only fixed constant my $DEFAULT_HELM_LIBRARY_DIR = "@DEFAULT_HELM_LIBRARY_DIR@"; if (defined ($HELM_LIBRARY_DIR)) { $HELM_LIBRARY_PATH = $HELM_LIBRARY_DIR."./configuration.pl"; } else { $HELM_LIBRARY_PATH = $DEFAULT_HELM_LIBRARY_DIR."./configuration.pl"; } # next require defines: $helm_dir, $html_link, $dtd_dir, $uris_dbm require $HELM_LIBRARY_PATH; use HTTP::Daemon; use HTTP::Status; use HTTP::Request; use LWP::UserAgent; use DB_File; #CSC: mancano i controlli sulle condizioni di errore di molte funzioni #CSC: ==> non e' robusto #CSC: altra roba da sistemare segnata con CSC my $d = new HTTP::Daemon LocalPort => 8081; tie(%map, 'DB_File', $uris_dbm.".db", O_RDONLY, 0664); print "Please contact me at: url, ">\n"; print "helm_dir: $helm_dir\n"; print "dtd_dir: $dtd_dir\n"; print "urls_of_uris.db: $uris_dbm.db\n"; $SIG{CHLD} = "IGNORE"; # do not accumulate defunct processes $SIG{USR1} = \&update; # sent by the child to make the parent update while (my $c = $d->accept) { if (fork() == 0) { while (my $r = $c->get_request) { #CSC: mancano i controlli di sicurezza my $inputuri = $r->url; $inputuri =~ s/^[^?]*\?uri=(.*)/$1/; print "\nRequest: ".$r->url."\n\n"; my $http_method = $r->method; my $http_path = $r->url->path; if ($http_method eq 'GET' and $http_path eq "/getciconly") { # finds the uri, url and filename my $cicuri = $inputuri; my $cicfilename = $cicuri; $cicfilename =~ s/cic:(.*)/$1/; $cicfilename =~ s/theory:(.*)/$1/; $cicfilename = $helm_dir.$cicfilename.".xml"; my $cicurl = $map{$cicuri}; if (!defined($cicurl)) { print "\nNOT FOUND!!!!!\n"; $c->send_error(RC_NOT_FOUND) } else { print_request("cic",$cicuri,$cicurl,$cicfilename); # Retrieves the file my $ciccontent = download(0,"cic",$cicurl,$cicfilename); # Answering the client answer($c,$ciccontent); } } elsif ($http_method eq 'GET' and $http_path eq "/get") { # finds the uris, urls and filenames my $cicuri = $inputuri, $typesuri = $inputuri, $annuri = $inputuri; my $annsuffix; if ($inputuri =~ /\.types$/) { $cicuri =~ s/(.*)\.types$/$1/; undef($annuri); } elsif ($inputuri =~ /\.types\.ann$/) { $cicuri =~ s/(.*)\.types\.ann$/$1/; $typesuri =~ s/(.*)\.ann$/$1/; $annsuffix = ".types.ann"; } elsif ($inputuri =~ /\.ann$/) { $cicuri =~ s/(.*)\.ann$/$1/; undef($typesuri); $annsuffix = ".ann"; } else { undef($typesuri); undef($annuri); } my $cicfilename = $cicuri; $cicfilename =~ s/cic:(.*)/$1/; $cicfilename =~ s/theory:(.*)/$1/; $cicfilename = $helm_dir.$cicfilename; my $typesfilename = $cicfilename.".types.xml" if $typesuri; my $annfilename = $cicfilename.$annsuffix.".xml" if $annuri; $cicfilename .= ".xml"; my $cicurl = $map{$cicuri}; my $typesurl = $map{$typesuri} if $typesuri; my $annurl = $map{$annuri} if $annuri; if (!defined($cicurl) || (!defined($typesurl) && $typesuri) || (!defined($annuri) && $annuri)) { print "\nNOT FOUND!!!!!\n"; $c->send_error(RC_NOT_FOUND) } else { print_request("cic",$cicuri,$cicurl,$cicfilename); print_request("types",$typesuri,$typesurl,$typesfilename) if ($typesuri); print_request("ann",$annuri,$annurl,$annfilename) if ($annuri); # Retrieves the files my $ciccontent = download(1,"cic",$cicurl,$cicfilename); my $typescontent = download(1,"types",$typesurl,$typesfilename) if ($typesuri); my $anncontent = download(1,"ann",$annurl,$annfilename) if ($annuri); # Merging the files together my $merged = < $ciccontent $typescontent $anncontent EOT # Answering the client answer($c,$merged); } } elsif ($http_method eq 'GET' and $http_path eq "/getdtd") { my $filename = $inputuri; $filename = $dtd_dir."/".$filename; print "DTD: $inputuri ==> ($filename)\n"; if (stat($filename)) { print "Using local copy\n"; open(FD, $filename); $cont = ""; while() { $cont .= $_; } close(FD); answer($c,$cont); } else { die "Could not find DTD!"; } } elsif ($http_method eq 'GET' and $http_path eq "/conf") { my $quoted_html_link = $html_link; $quoted_html_link =~ s/&/&/g; $quoted_html_link =~ s//>/g; $quoted_html_link =~ s/'/'/g; $quoted_html_link =~ s/"/"/g; print "\nConfiguration requested, returned #$quoted_html_link#\n"; $cont = "$quoted_html_link"; answer($c,$cont); } elsif ($http_method eq 'GET' and $http_path eq "/update") { print "Update requested..."; update(); kill(USR1,getppid()); print " done\n"; answer($c,"

Update done

"); } else { print "\nINVALID REQUEST!!!!!\n"; $c->send_error(RC_FORBIDDEN) } print "\nRequest solved: ".$r->url."\n\n"; } $c->close; undef($c); print "\nCONNECTION CLOSED\n\n"; exit; } # fork } #================================ #CSC: Too much powerful: creates even /home, /home/users/, ... #CSC: Does not raise errors if could not create dirs/files sub mkdirs { my ($pathname) = @_; my @dirs = split /\//,$pathname; my $tmp; foreach $dir (@dirs) { $tmp = ((defined($tmp)) ? $tmp."\/".$dir : ""); mkdir($tmp,0777); } rmdir($tmp); } sub print_request { my ($str,$uri,$url,$filename) = @_; print $str."uri: $uri\n"; print $str."url: $url\n"; print $str."filename: $filename\n\n"; } sub callback { my ($data) = @_; $cont .= $data; } sub download { my ($remove_headers,$str,$url,$filename) = @_; $cont = ""; # modified by side-effect by the callback function if (stat($filename)) { print "Using local copy for the $str file\n"; open(FD, $filename); while() { $cont .= $_; } close(FD); } else { print "Downloading the $str file\n"; $ua = LWP::UserAgent->new; $request = HTTP::Request->new(GET => "$url"); $response = $ua->request($request, \&callback); print "Storing the $str file\n"; mkdirs($filename); open(FD, ">".$filename); print FD $cont; close(FD); } if ($remove_headers) { $cont =~ s/<\?xml [^?]*\?>//sg; $cont =~ s/]*>//sg; } return $cont; } sub answer { my ($c,$cont) = @_; my $res = new HTTP::Response; $res->content($cont); $c->send_response($res); } sub update { untie %map; tie(%map, 'DB_File', $uris_dbm.".db", O_RDONLY, 0664); }