#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

# URL der Homepage
# Formulare werden mit <FORM METHOD=POST ACTION="$HOMEURL$script_url">
# angesprochen.
my $HOMEURL = "http://www.netzmafia.de";

# der Pfad des Programms selbst wird automatisch ermittelt
my $script_url = $ENV{'SCRIPT_NAME'};

# Pfad zum wget-Programm
my $wget = '/usr/bin/wget';

# global: Formulardaten
my %FORM = ();

my ($url, @result, $temp);

# auf jeden Fall Abbruch nach 1 Minute
$SIG{'ALRM'} =\&alarm_handle;
alarm(60);

# Header generieren
InsertHeader('HTTP-Header');

# Formulareingabe parsen
ParseForm();

if (defined($FORM{'URL'}))
  {
  # Antwort vom Formular
  process_request($FORM{'URL'}); 
  # Vermeiden einer Denial-of-Service-Attacke
  sleep(2);
  }
else
  # leerer Aufruf, Formular anzeigen
  { show_form(); }
  
# und Schluss ...
InsertTrailer();

sub show_form
  {
  # Leeres Formular ausgeben
  print qq~
  <FORM ACTION="$HOMEURL$script_url" METHOD="POST">
  <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="5">
  <TR>
  <TD VALIGN=TOP ALIGN=LEFT>Url eingeben:</TD>
  <TD VALIGN=TOP ALIGN=LEFT>
  http://<INPUT TYPE="TEXT" NAME="URL" VALUE="" SIZE=40 MAXLENGTH=100> 
  </TD>
  </TR><TR>
  <TD VALIGN=TOP ALIGN=LEFT>&nbsp;</TD>
  <TD VALIGN=TOP ALIGN=LEFT>
  <INPUT TYPE="SUBMIT" VALUE=" Absenden ">
  </TD>
  </TR>
  </TABLE>
  </FORM>
  ~;
  }
  
sub process_request
  {  
  $url = shift;
  # "http://" ergaenzen, falls nicht schon vorhanden
  $url = "http://" . $url unless ($url =~ m|http://|);
  # alles entfernen, was nicht zu einer URL gehoert
  chomp($url);
  $url =~ s/ \-.*?(\W|\S)//sg;
  $url =~ s/;//sg;
  # Pfad etc. entfernen
  $url =~ m#http://(.*?)(/*$|/.*$)#;
  $url = $1;

  print "<h2>Header von $url</h2>\n";
  # wget aufrufen und Resultat ausgeben
  @result = `$wget -A html,htm -T 5 -O /dev/null -S $url 2>&1`;

  # ersten beiden Zeilen entfernen (wget-Status)
  shift(@result);
  shift(@result);
  # den Rest ausgeben
  foreach $temp (@result)
    {
    # Leerzeilen ueberspringen
    last if ($temp =~ m/^$/);
    print "$temp<br>";
    }
  }

sub alarm_handle
  {
  # Unterprogramm fuer Timeout, mit Fehler beenden
  alarm(0);
  print "<P><H2>Fehler</H2>", "\n";
  print "Zeit\&uuml;berschreitung, Abbruch!", "\n";
  print "</BODY></HTML>", "\n";
  exit 0;
  }


sub InsertHeader
  {
  # HTTP-Header und HTML-Vorspann ausgeben
  my ($htmltitle) = @_;
  print "Content-type: text/html\n\n";
  print "<HTML>\n<HEAD>\n";
  print "<TITLE> $htmltitle </TITLE>\n</HEAD>\n";
  print "<BODY>\n";
  }


sub InsertTrailer
  {
  # HTML-Nachspann ausgeben
  print "</BODY>\n</HTML>\n";
  }


sub ParseForm
    {
    my ($buffer, @pairs, $pair, $name, $value);
    # Read in text
    if ($ENV{'REQUEST_METHOD'} eq "POST")
      { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
    else
      { $buffer = $ENV{'QUERY_STRING'};  }
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs)
      {
      # Name-Wert-Paare trennen
      ($name, $value) = split(/=/, $pair);
      # Leerzeichen wieder einsetzen
      $value =~ tr/+/ /;
      # URL-codierte Zeichen (%xx) ersetzen
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      # im hash speichern
      if (defined $FORM{$name})    # vermutlich checkbox
        { $FORM{$name} = $FORM{$name} . ", " . $value; }
      else
        { $FORM{$name} = $value; }
      }
    }