#!/usr/bin/perl

use HTTP::Daemon;
use HTTP::Status;
use HTTP::Response;
use URI::Escape;
use CGI;
use FindBin;
use IPC::Open3;

chdir $FindBin::Bin; # chdir to the directory of this perl script

my $d = new HTTP::Daemon LocalPort => 8085
 or die "Error: port 8085 not available.";
print "Please contact me at: <URL:", $d->url, ">\n";

my $IsProofCheckerLiving = 0;

$SIG{CHLD} =
   sub {
      print stderr "\nERROR: The proof-checker died.\n";
      $IsProofCheckerLiving=0;
   };
$| = 1;

while(true) {
   open3(*PC_IN, *PC_OUT, *PC_ERR, "./proofChecker.opt 2>&1");
   $IsProofCheckerLiving=1;
   print stderr "\nWARNING: A new proof-checker starts.\n";
   PC_IN->autoflush(1);

  while (my $c = $d->accept) {
    my $r = $c->get_request;
    my $http_query = uri_unescape($r->url->query);
    my $cgi = new CGI("$http_query");
    my $uri = $cgi->param('uri');

    if ($r->method eq 'GET' && $r->url->path eq "/proofCheck"){
       print "Request to proof-check \"$uri\"...";
       print PC_IN "$uri\n";
       print $c <<EOT;
<html>
<head>
 <title>Proof-Checking $uri</title>
</head>
<body bgcolor="white">
<h1>Proof-Checking $uri:</h1> 
EOT
       while(chomp($_ = <PC_OUT>)) {
         last if ($_ eq "END");
         print $c $_;
       }
       print $c <<EOT;
<h1>Done.</h1>
</body>
</html>
EOT
       print " done\n\n";
    } else {
        print "INVALID REQUEST \"$http_query\"!!!!!\n\n";
        $c->send_error(RC_FORBIDDEN);
    }
    $c->close;
    undef($c);
    last unless $IsProofCheckerLiving;
  }
  close(PC_IN);
  close(PC_OUT);
  close(PC_ERR);
}
