]> matita.cs.unibo.it Git - helm.git/commitdiff
Added support for CGI handling, still remain some problems for headers,
authorStefano Zacchiroli <zack@upsilon.cc>
Sat, 17 Mar 2001 16:10:22 +0000 (16:10 +0000)
committerStefano Zacchiroli <zack@upsilon.cc>
Sat, 17 Mar 2001 16:10:22 +0000 (16:10 +0000)
but it works !
- Makefile.in:
  - added some targets like: install and uninstall for getter and cgi
- configure.in
  - added variable substitution for @HELM_CGI_DIR@
- http_getter.pl.in
  - added subroutine html_nice_answer (wrapper for simple html answers)
  - CGI handling when request ends with ".cgi"

helm/http_getter/Makefile.in
helm/http_getter/configure.in
helm/http_getter/http_getter.pl.in

index 5aebd5a9ecc6ac41b93b2a693c05b19b3d9a925b..602c8d36208c353b3e208c50e1638682ca7fee0f 100644 (file)
@@ -1,11 +1,23 @@
 INSTALL_DIR=@RESOLVED_EXEC_PREFIX@/bin
-CGI_DIR=$(INSTALL_DIR)
+CGI_DIR=@HELM_CGI_DIR@
 
 all:
 
-install:
-       cp http_getter.pl $(INSTALL_DIR)
-       cp *.cgi $(INSTALL_DIR)
+install: installgetter installcgi
+
+uninstall: uninstallcgi uninstallgetter
+
+installgetter:
+       cp http_getter.pl $(INSTALL_DIR)/
+
+installcgi:
+       cp *.cgi $(CGI_DIR)/
+
+uninstallgetter:
+       rm $(INSTALL_DIR)/http_getter.pl
+
+uninstallcgi:
+       for f in *.cgi; do rm -f $(CGI_DIR)/$$f; done
 
 clean:
 
index 7d0c8278185aaeb336bf6bdf30159719e39db766..13ba5aee742bcfa345d08d761eae1d6f40f8b371 100644 (file)
@@ -27,6 +27,8 @@ else
   RESOLVED_EXEC_PREFIX=$RESOLVED_PREFIX
 fi
 
+HELM_CGI_DIR=$RESOLVED_PREFIX/bin
+
 if test $USE_DEFAULTS = auto; then
        AC_CHECK_PROG(HAVE_HELM_CONFIG, helm-config, yes, no)
        if test $HAVE_HELM_CONFIG = yes; then
@@ -88,6 +90,7 @@ AC_SUBST(RESOLVED_PREFIX)
 AC_SUBST(RESOLVED_EXEC_PREFIX)
 AC_SUBST(HELM_LIB_DIR)
 AC_SUBST(PERL_BINARY)
+AC_SUBST(HELM_CGI_DIR)
 
 AC_OUTPUT([
   Makefile
index 484041c8e7d853e66caad2ad4bf098bd85767a23..e301963bcf65af3225a866a54c5a82306fc4cfdd 100755 (executable)
@@ -29,6 +29,7 @@ my $VERSION = "@VERSION@";
 
 # various variables
 my ($HELM_LIB_PATH);
+my $cgi_dir = "@HELM_CGI_DIR@";
 my (%map);
 
 # First of all, let's load HELM configuration
@@ -224,7 +225,7 @@ while (my $c = $d->accept) {
            mk_urls_of_uris();
            kill(USR1,getppid()); # signal changes to parent
            print " done\n";
-           answer($c,"<html><body><h1>Update done</h1></body></html>","text/html","");
+           html_nice_answer($c,"Update done");
         } elsif ($http_method eq 'GET' and $http_path eq "/ls") {
             # send back keys that begin with a given uri
            my ($uritype,$uripattern,$uriprefix);
@@ -243,8 +244,8 @@ while (my $c = $d->accept) {
            if ($uritype ne "invalid") { # uri is valid
             if (($outype ne 'txt') and ($outype ne 'xml')) { # invalid out type
              print "Invalid output type specified: $outype\n";
-             answer($c,"<html><body><h1>Invalid output type, may be ".
-              "\"txt\" or \"xml\"</h1></body></html>","text/html","");
+             html_nice_answer($c,"Invalid output type, must be ".
+              "'txt' or 'xml'");
             } else { # valid output
              print "BASEURI $baseuri, FORMAT $outype\n";
              $cont = finduris($uritype,$uripattern,$outype);
@@ -259,13 +260,33 @@ while (my $c = $d->accept) {
            } else { # invalid uri
             print "Invalid uri: $baseuri, may begin with 'cic:', ".
              "'theory:' or '*:'\n";
-            answer($c,"<html><body><h1>Invalid uri , may begin with ".
-             "\"cic:\", \"theory:\" or \"*:\"</h1></body></html>","text/html","");
+            html_nice_answer($c,"Invalid uri , must begin with ".
+             "'cic:' or 'theory:'");
            }
         } elsif ($http_method eq 'GET' and $http_path eq "/help") {
-           print "Help requested!";
-           answer($c,"<html><body><h1>HTTP Getter Version ".
-            $VERSION."</h1></body></html>","text/html","");
+           print "Help requested!\n";
+           html_nice_answer($c,"HTTP Getter Version: $VERSION");
+        } elsif ($http_method eq 'GET' and $http_path =~ /\.cgi$/) {
+           print "CGI requested!\n";
+           if ($http_path !~ /^\/[^\/]*\.cgi$/) {
+            html_nice_answer($c,"Invalid CGI name: $http_path, ".
+            "you can't request CGI that contain a slash in the name\n");
+           } elsif (stat "$cgi_dir"."$http_path") {
+            if (not -x "$cgi_dir/$http_path") {
+             html_nice_answer($c,"CGI $http_path found but not ".
+              "executable\n");
+            } else { # exec CGI and anser back its output
+             my %old_ENV = %ENV;
+             %ENV = ();
+             $ENV{'QUERY_STRING'} = $http_query;
+             my $cgi_output = `$cgi_dir/$http_path`;
+             answer($c,$cgi_output,"","");
+             %ENV = %old_ENV;
+            }
+           } else {
+            html_nice_answer($c,"CGI '$http_path' not found ".
+             "in CGI dir '$cgi_dir'");
+           }
         } else {
             print "\n";
             print "INVALID REQUEST!!!!!\n";
@@ -562,15 +583,25 @@ sub download {
 }
 
 sub answer {
+# answer the client setting content, Content-Type and Content-Enconding
+# of the answer
  my ($c,$cont,$contype,$contenc) = @_;
  my $res = new HTTP::Response;
  $res->content($cont);
- $res->push_header("Content-Type" => $contype);
+ $res->push_header("Content-Type" => $contype)
+   unless ($contype eq "");
  $res->push_header("Content-Encoding" => $contenc)
    unless ($contenc eq "");
  $c->send_response($res);
 }
 
+sub html_nice_answer {
+# answer the client whith a nice html document
+ my ($c,$content) = @_;
+ $content = "<html><body><h1>$content</h1></body></html>";
+ answer($c,$content,"text/html","");
+}
+
 sub helm_wget {
 #retrieve a file from an url and write it to a temp dir
 #used for retrieve resource index from servers