2013-01-20 77 views
3

我是Perl新手,我有一个关于HTTP服务器和客户端API的问题。Perl HTTP服务器

我想写一个HTTP服务器,它接受来自HTTP客户端的请求。问题是我不知道该怎么做,因为我是一名Java开发人员,对我来说有点困难。请你能给我一些关于Perl的HTTP::Daemon模块的教程和例子吗?

回答

5

documentation for HTTP::Daemon中有一个很好的例子。

+0

确定,有关客户端API一些例子吗? –

+0

?任何浏览器都是客户端。请参阅curl,www-mechanize,lwp,firefox,chrome ... –

1

客户端例如符合新思从HTTP::Daemon

require LWP::UserAgent; 

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
$ua->env_proxy; 

my $response = $ua->get('http://localhost:52798/xyzzy'); 

if ($response->is_success) { 
    print $response->decoded_content; # or whatever 
} 
else { 
    die $response->status_line; 
} 

你只需要适应港口和可能的主机。

+0

可以告诉我如何解析URL中的参数吗? –

+0

我在这里没有看到任何参数 –

+0

http:// localhost:52798 /?doc = pdf&code = 0000 这里是一些参数的例子 –

13

我花了很多时间试图让许多用户同时创建一个“简单”的可用Web服务器。 HTTP::Daemon和其他在线资源的文档不帮助我。

这里是工作(Ubuntu的12.10的默认Perl包v5.14.2)例如preforked不同的内容类型页面和错误页面 Web服务器:

#!/usr/bin/perl 

use strict; 
use warnings; 

use CGI qw/ :standard /; 
use Data::Dumper; 
use HTTP::Daemon; 
use HTTP::Response; 
use HTTP::Status; 
use POSIX qw/ WNOHANG /; 

use constant HOSTNAME => qx{hostname}; 

my %O = (
    'listen-host' => '127.0.0.1', 
    'listen-port' => 8080, 
    'listen-clients' => 30, 
    'listen-max-req-per-child' => 100, 
); 

my $d = HTTP::Daemon->new(
    LocalAddr => $O{'listen-host'}, 
    LocalPort => $O{'listen-port'}, 
    Reuse => 1, 
) or die "Can't start http listener at $O{'listen-host'}:$O{'listen-port'}"; 

print "Started HTTP listener at " . $d->url . "\n"; 

my %chld; 

if ($O{'listen-clients'}) { 
    $SIG{CHLD} = sub { 
     # checkout finished children 
     while ((my $kid = waitpid(-1, WNOHANG)) > 0) { 
      delete $chld{$kid}; 
     } 
    }; 
} 

while (1) { 
    if ($O{'listen-clients'}) { 
     # prefork all at once 
     for (scalar(keys %chld) .. $O{'listen-clients'} - 1) { 
      my $pid = fork; 

      if (!defined $pid) { # error 
       die "Can't fork for http child $_: $!"; 
      } 
      if ($pid) { # parent 
       $chld{$pid} = 1; 
      } 
      else { # child 
       $_ = 'DEFAULT' for @SIG{qw/ INT TERM CHLD /}; 
       http_child($d); 
       exit; 
      } 
     } 

     sleep 1; 
    } 
    else { 
     http_child($d); 
    } 

} 

sub http_child { 
    my $d = shift; 

    my $i; 
    my $css = <<CSS; 
     form { display: inline; } 
CSS 

    while (++$i < $O{'listen-max-req-per-child'}) { 
     my $c = $d->accept or last; 
     my $r = $c->get_request(1) or last; 
     $c->autoflush(1); 

     print sprintf("[%s] %s %s\n", $c->peerhost, $r->method, $r->uri->as_string); 

     my %FORM = $r->uri->query_form(); 

     if ($r->uri->path eq '/') { 
      _http_response($c, { content_type => 'text/html' }, 
       start_html(
        -title => HOSTNAME, 
        -encoding => 'utf-8', 
        -style => { -code => $css }, 
       ), 
       p('Here are all input parameters:'), 
       pre(Data::Dumper->Dump([\%FORM],['FORM'])), 
       (map { p(a({ href => $_->[0] }, $_->[1])) } 
        ['/', 'Home'], 
        ['/ping', 'Ping the simple text/plain content'], 
        ['/error', 'Sample error page'], 
        ['/other', 'Sample not found page'], 
       ), 
       end_html(), 
      ) 
     } 
     elsif ($r->uri->path eq '/ping') { 
      _http_response($c, { content_type => 'text/plain' }, 1); 
     } 
     elsif ($r->uri->path eq '/error') { 
      my $error = 'AAAAAAAAA! My server error!'; 
      _http_error($c, RC_INTERNAL_SERVER_ERROR, $error); 
      die $error; 
     } 
     else { 
      _http_error($c, RC_NOT_FOUND); 
     } 

     $c->close(); 
     undef $c; 
    } 
} 

sub _http_error { 
    my ($c, $code, $msg) = @_; 

    $c->send_error($code, $msg); 
} 

sub _http_response { 
    my $c = shift; 
    my $options = shift; 

    $c->send_response(
     HTTP::Response->new(
      RC_OK, 
      undef, 
      [ 
       'Content-Type' => $options->{content_type}, 
       'Cache-Control' => 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 
       'Pragma' => 'no-cache', 
       'Expires' => 'Thu, 01 Dec 1994 16:00:00 GMT', 
      ], 
      join("\n", @_), 
     ) 
    ); 
} 
+0

非常感谢:) –

+0

我登录只是为了说大声笑@“'AAAAAAAAA !我的服务器错误!'' - +1! – Mintx

+0

感谢您发布这个!精彩的例子! – slm