HTTP::Server::Simple

Max Maischein

Frankfurt.pm

Was ist HTTP::Server::Simple ?

Das Modul HTTP::Server::Simple ist ein einfacher, stand-alone Weserver in Perl. Es wurde 2004 von Jesse Vincent (JVINCENT auf PAUSE) entwickelt. Das Ziel von HTTP::Server::Simple ist es, einen schlichten Webserver ohne viel Konfigurationsaufwand zur Verfügung zu stellen. Einenn zugegebenermaßen sehr schlichten Webserver bekommt man zum Beispiel mit dem folgenden Code:

Geschrieben von Jesse Vincent

Ein einfacher, stand-alone Perl-Webserver

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

Ausgabe

Nicht sehr beeindruckend...

Verwendung

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

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

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":

     1:  ls 

    bzw.

     1:  dir

Web-Frontend (1)

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

Web-Frontend (2)

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

Web-Frontend (3)

 1:  # Eingabezeile
 2:    print <<HTML;
 3:      <html><body>
 4:      <tt>$ls <form action="?"><input name='args' type='text' value='$args'></form></tt>
 5:  HTML
 1:  # Ergebnis
 2:    if (defined $args) {
 3:        print "<hr /><tt>$ls $args</tt>";
 4:        print "<hr /><pre>";
 5:        print `$ls $args`;
 6:        print "</pre>"
 7:    };
 8:    print "</body></html>";
 9:  }

Web-Frontend (4)

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

Live Demo

... bitte warten ...

http://localhost:8080/

Plugins für HTTP::Server::Simple

HTTP::Server::Simple::Authen

 1:  package MyServer;
 2:  use base qw( HTTP::Server::Simple::Authen HTTP::Server::Simple::CGI);
 1:  use Authen::Simple::Passwd;
 2:  sub authen_handler {
 3:      Authen::Simple::Passwd->new(passwd => '/etc/passwd');
 4:  }
 1:  sub handle_request {
 2:      my($self, $cgi) = @_;
 3:      my $user = $self->authenticate or return;
 4:      ...
 5:  }
 1:  MyServer->new->run();

Hilfreiche andere Module

Hilfreiche andere Module:

  • s/\$(\w+)/$values{$1}/eg

  • Template Toolkit (Template)

  • HTML::Template

  • Petal

  • HTML::Mason

Danke

Fragen?