#!/usr/bin/perl
##
## cerca.pl
##
#
# Incorpora la libreria di decodifica dei dati.
#
require ('mini-lib.pl');
#
# &Metodo_non_gestibile ()
#
sub Metodo_non_gestibile
{
    print STDOUT ("Content-type: text/html\n");
    print STDOUT ("\n");
    print STDOUT ("<HTML>\n");
    print STDOUT ("<HEAD>\n");
    print STDOUT ("<TITLE>Errore</TITLE>\n");
    print STDOUT ("</HEAD>\n");
    print STDOUT ("<BODY>\n");
    print STDOUT ("<H1>Metodo $ENV{REQUEST_METHOD} non gestibile.</H1>\n");
    print STDOUT ("</BODY>\n");
    print STDOUT ("</HTML>\n");
}
#
# &Modulo_iniziale ()
#
sub Modulo_iniziale
{
    print STDOUT ("Content-type: text/html\n");
    print STDOUT ("\n");
    print STDOUT ("<HTML>\n");
    print STDOUT ("<HEAD>\n");
    print STDOUT ("<TITLE>Ricerca all'interno del sito</TITLE>\n");
    print STDOUT ("</HEAD>\n");
    print STDOUT ("<BODY>\n");
    print STDOUT ("<H1>Ricerca all'interno del sito</H1>\n");
    print STDOUT ("<P>\n");
    print STDOUT ("<FORM action=\"/cgi-bin/cerca.pl\" method=\"GET\">\n");
    print STDOUT ("<P>\n");
    print STDOUT ("Stringa di ricerca:\n");
    print STDOUT ("<INPUT name=\"richiesta\" size=\"60\">\n");
    print STDOUT ("<INPUT type=\"submit\" value=\"Cerca\"></P>\n");
    print STDOUT ("</FORM>\n");
    print STDOUT ("</BODY>\n");
    print STDOUT ("</HTML>\n");
}
#
# &Elabora_riga ()
#
sub Elabora_riga
{
    local ($riga)          = $_[0];
    local ($punteggio)     = 0;
    local ($file_percorso) = "";
    local ($nome_file)     = "";
    local ($percorso)      = "";
    #
    # Scompone la riga in modo da estrarre il nome del file e il
    # percorso relativo al sito HTTP.
    #
    if ($riga =~ m|^.*Score:\s+([0-9]*),.*?'(.*?)'.*$|i)
      {
        $punteggio = $1;
        $file_percorso = $2;
        #
        # È meglio scomporre l'analisi attraverso le espressioni
        # regolari, altrimenti si fa troppa confusione.
        #
        $file_percorso =~ m|^(.*)\s+/home/httpd/html/(.*?)/?$|i;
        $nome_file = $1;
        $percorso = $2;
        #
        # Se questa variabile è vuota, non si può mettere la barra
        # iniziale.
        #
        if ($percorso eq "")
          {
            ;
          }
        else
          {
            $percorso = "/$percorso";
          }
        #
        # Emette le righe utili come riferimenti ipertestuali.
        #
        print STDOUT ("<P>Punteggio: $punteggio ");
        print STDOUT ("<A href=\"$percorso/$nome_file\">");
        print STDOUT ("$percorso/$nome_file</A></P>\n");
      }
}
#
# &Elaborazione_richiesta ()
#
sub Elaborazione_richiesta
{
    #
    # Rinvia la richiesta a waissearch e ne restituisce l'esito.
    #
    if (open (WAIS,
         "echo -n | waissearch -d /var/lib/wais/http \'$DATI{richiesta}\' |"))
      {
        print STDOUT ("Content-type: text/html\n");
        print STDOUT ("\n");
        print STDOUT ("<HTML>\n");
        print STDOUT ("<HEAD>\n");
        print STDOUT ("<TITLE>Risultato della ricerca in base al modello: ");
        print STDOUT ("$DATI{richiesta}</TITLE>\n");
        print STDOUT ("</HEAD>\n");
        print STDOUT ("<BODY>\n");
        print STDOUT ("<H1>Risultato della ricerca</H1>\n");
        print STDOUT ("<P><STRONG>$DATI{richiesta}</STRONG></p>\n");
        #
        while ($risposta = <WAIS>)
          {
            #
            # Legge le righe del testo restituito da waissearch, e
            # se corrispondono al modello, la funzione seguente
            # emette direttamente una riga adatta alla pagina che
            # si sta costruendo.
            #
            &Elabora_riga ($risposta);
          }
        #
        print STDOUT ("</BODY>\n");
        print STDOUT ("</HTML>\n");
      }
    else
      {
        print STDOUT ("Content-type: text/html\n");
        print STDOUT ("\n");
        print STDOUT ("<HTML>\n");
        print STDOUT ("<HEAD>\n");
        print STDOUT ("<TITLE>Errore</TITLE>\n");
        print STDOUT ("</HEAD>\n");
        print STDOUT ("<BODY>\n");
        print STDOUT ("<H1>Errore</H1>\n");
        print STDOUT ("Si è manifestato un errore durante l'inoltro ");
        print STDOUT ("della richiesta.\n");
        print STDOUT ("</BODY>\n");
        print STDOUT ("</HTML>\n");
      }
}
##
## Inizio del programma.
##
local (%DATI)     = ();
local ($risposta) = "";
#
# Decodifica i dati in funzione del tipo di metodo della richiesta.
#
if ($ENV{REQUEST_METHOD} eq 'GET')
  {
    %DATI = &Decodifica_GET ();
  }
elsif ($ENV{REQUEST_METHOD} eq 'POST')
  {
    %DATI = &Decodifica_POST ();
  }
else
  {
    &Metodo_non_gestibile ();
  }
#
# Controlla che sia stata indicata una stringa di ricerca, altrimenti
# mostra il modulo per iniziare.
#
if ($DATI{richiesta} eq "")
  {
    &Modulo_iniziale ();
  }
else
  {
    &Elaborazione_richiesta ();
  }
#
1;
#
