HTTP::Server::Simple

Max Maischein

Frankfurt.pm

Was ist HTTP::Server::Simple ?

Geschrieben von Jesse Vincent

Ein einfacher, stand-alone Perl-Webserver

  use warnings;
  use strict;
  use HTTP::Server::Simple;
  my $server = HTTP::Server::Simple->new();
  $server->run();

Verwendung

Normalerweise verwendet man aber nicht HTTP::Server::Simple direkt, sondern HTTP::Server::Simple::CGI.

  package Your::Web::Server;
  use base qw(HTTP::Server::Simple::CGI);
  sub handle_request {
    my ($self, $cgi) = @_;
    #... Webseite erzeugen ...
    # ... und ausgeben
    print "200 OK\r\n"
    print "Content-Type: text/plain\r\n";
    print "\r\n";
    print "Hello World";
  }

Vergleiche auch mod_perl.

Wofür ist das praktisch?

Man kann sofort einen kleinen Webserver starten, ohne zuvor Apache zu installieren und zu konfigurieren.

  • Tests von Modulen (Test::HTTP::Server::Simple)

  • Kleine User Interfaces

  • Maypole, Catalyst, Kwiki, ...

Wofür nicht?

Wofür sollte man HTTP::Server::Simple nicht verwenden?

  • Mehrere User unter Windows (einzelne Instanz)

  • Performancekritische Anwendungen (mod_perl)

Bestehende Module

Es gibt bereits mehrere Leute, die jeweils Module geschrieben haben, die auf HTTP::Server::Simple zurückgreifen:

  • Maypole::HTTPD

  • HTTP::Server::Simple::Kwiki

Web-Frontend

  • "Mal eben" ein Web-Frontend vor ein Programm setzen:

  • "Programm":

      ls 

    bzw.

      dir

Web-Frontend (1)

  #!/usr/bin/perl -wT
  package HTTP::Server::Simple::ls;
  use strict;
  use base 'HTTP::Server::Simple::CGI';
  # Auswahl "dir" oder "ls"
  my $ls = $^O eq 'MSWin32' ? "dir" : "ls";
  # nur "gute" Zeichen zulassen
  my $shell_safe = qr![-0-9a-z/\\:.*? ]!i;

Web-Frontend (2)

  sub handle_request {
    my ($self,$cgi) = @_;
    my $args = $cgi->param('args');
    if ($args !~ m!^($shell_safe+)$!) {
        my @unsafe = $args =~ m<((?!$shell_safe).)>g;
        warn "Command line contains unsafe characters: @unsafe";
        undef $args;
    } else { 
      $args = $1 
    };

Web-Frontend (3)

  # Eingabezeile
    print <<HTML;
      <html><body>
      <tt>$ls <form action="?"><input name='args' type='text' value='$args'></form></tt>
  HTML
  # Ergebnis
    if (defined $args) {
        print "<hr /><tt>$ls $args</tt>";
        print "<hr /><pre>";
        print `$ls $args`;
        print "</pre>"
    };
    print "</body></html>";
  }

Web-Frontend (4)

  # Hauptprogramm
  package main;
  HTTP::Server::Simple::ls->new->run();

Hilfreiche andere Module

Hilfreiche andere Module: z.B. Template Toolkit (Template) HTML::Template Petal

Danke

Fragen?