#!/usr/bin/perl # next require defines: $helm_dir, $html_link require "/usr/lib/helm/configuration.pl"; use HTTP::Daemon; use HTTP::Status; use HTTP::Request; use LWP::UserAgent; use DB_File; my $cont = ""; my $d = new HTTP::Daemon LocalPort => 8081; tie(%map, 'DB_File', 'urls_of_uris.db', O_RDONLY, 0664); print "Please contact me at: url, ">\n"; print "helm_dir: $helm_dir\n"; $SIG{CHLD} = "IGNORE"; # do not accumulate defunct processes while (my $c = $d->accept) { if (fork() == 0) { while (my $r = $c->get_request) { #CSC: mancano i controlli di sicurezza $cont = ""; my $cicuri = $r->url; $cicuri =~ s/^[^?]*\?url=(.*)/$1/; print "*".$r->url."\n"; my $http_method = $r->method; my $http_path = $r->url->path; if ($http_method eq 'GET' and $http_path eq "/get") { my $filename = $cicuri; $filename =~ s/cic:(.*)/$1/; $filename =~ s/theory:(.*)/$1/; $filename = $helm_dir.$filename.".xml"; my $resolved = $map{$cicuri}; print "$cicuri ==> $resolved ($filename)\n"; if (stat($filename)) { print "Using local copy\n"; open(FD, $filename); while() { $cont .= $_; } close(FD); my $res = new HTTP::Response; $res->content($cont); $c->send_response($res); } else { print "Downloading\n"; $ua = LWP::UserAgent->new; $request = HTTP::Request->new(GET => "$resolved"); $response = $ua->request($request, \&callback); print "Storing file\n"; open(FD, $filename); print FD $cont; close(FD); my $res = new HTTP::Response; $res->content($cont); $c->send_response($res); } } elsif ($http_method eq 'GET' and $http_path eq "/annotate") { my $do_annotate = ($cicuri =~ /\.ann$/); my $target_to_annotate = $cicuri; $target_to_annotate =~ s/(.*)\.ann$/$1/ if $do_annotate; my $filename = $cicuri; $filename =~ s/cic:(.*)/$1/; $filename =~ s/theory:(.*)/$1/; my $filename_target = $helm_dir.$filename if $do_annotate; $filename = $helm_dir.$filename.".xml"; $filename_target =~ s/(.*)\.ann$/$1.xml/ if $do_annotate; my $resolved = $map{$cicuri}; my $resolved_target = $map{$target_to_annotate} if $do_annotate; if ($do_annotate) { print "($cicuri, $target_to_annotate) ==> ($resolved + $resolved_target) ($filename)\n"; } elsif ($http_method eq 'GET' and $http_path eq "/getwithtypes") { my $do_annotate = ($cicuri =~ /\.types$/); my $target_to_annotate = $cicuri; $target_to_annotate =~ s/(.*)\.types$/$1/ if $do_annotate; my $filename = $cicuri; $filename =~ s/cic:(.*)/$1/; $filename =~ s/theory:(.*)/$1/; my $filename_target = $helm_dir.$filename if $do_annotate; $filename = $helm_dir.$filename.".xml"; $filename_target =~ s/(.*)\.types$/$1.xml/ if $do_annotate; my $resolved = $map{$cicuri}; my $resolved_target = $map{$target_to_annotate} if $do_annotate; if ($do_annotate) { print "($cicuri, $target_to_annotate) ==> ($resolved + $resolved_target) ($filename)\n"; } else { print "$cicuri ==> $resolved ($filename)\n"; } # Retrieves the annotation if (stat($filename)) { print "Using local copy for the types\n"; open(FD, $filename); while() { $cont .= $_; } close(FD); } else { print "Downloading the types\n"; $ua = LWP::UserAgent->new; $request = HTTP::Request->new(GET => "$resolved"); $response = $ua->request($request, \&callback); print "Storing file for the types\n"; open(FD, $filename); print FD $cont; close(FD); } my $annotation = $cont; # Retrieves the target to annotate $cont = ""; if ($do_annotate) { if (stat($filename_target)) { print "Using local copy for the file to type\n"; open(FD, $filename_target); while() { $cont .= $_; } close(FD); } else { print "Downloading the file to type\n"; $ua = LWP::UserAgent->new; $request = HTTP::Request->new(GET => "$resolved_target"); $response = $ua->request($request, \&callback); print "Storing file for the file to type\n"; open(FD, $filename_target); print FD $cont; close(FD); } } my $target = $cont; # Merging the annotation and the target $target =~ s/<\?xml [^?]*\?>//sg; $target =~ s/]*>//sg; $annotation =~ s/<\?xml [^?]*\?>//sg; $annotation =~ s/]*>//sg; my $merged = < $target $annotation EOT # Answering the client my $res = new HTTP::Response; $res->content($merged); $c->send_response($res); } elsif ($http_method eq 'GET' and $http_path eq "/getdtd") { my $filename = $cicuri; $filename = $helm_dir."/dtd/".$filename; print "DTD: $cicuri ==> ($filename)\n"; if (stat($filename)) { print "Using local copy\n"; open(FD, $filename); while() { $cont .= $_; } close(FD); my $res = new HTTP::Response; $res->content($cont); $c->send_response($res); } 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 "Configuration requested, returned #$quoted_html_link#\n"; $cont = "$quoted_html_link"; my $res = new HTTP::Response; $res->content($cont); $c->send_response($res); } else { print "INVALID REQUEST!!!!!\n"; $c->send_error(RC_FORBIDDEN) } } $c->close; undef($c); print "\nCONNECTION CLOSED\n\n"; exit; } # fork } #================================ sub callback { my ($data) = @_; $cont .= $data; }