Как разобрать URL запроса на простом сервере в Perl, который слушает порт - PullRequest
1 голос
/ 11 февраля 2010

вот URL запроса http://localhost:9009/?comd&user=kkc&mail=kkc@kkc.com

что нужно сделать для модификации в сценарии perl сервера.

server-Perl-script

use IO::Socket;
use Net::hostent;       # for OO version of gethostbyaddr
$PORT = 9009;           # pick something not in use
$server = IO::Socket::INET->new( Proto     => 'tcp',
                                 LocalPort => $PORT,
                                 Listen    => SOMAXCONN,
                                 Reuse     => 1);

die "can't setup server" unless $server;
print "[Server $0 accepting clients]\n";
     while ($client = $server->accept()) 
     {
       $client->autoflush(1);
       print $client "Welcome to $0; type help for command list.\n";
       $hostinfo = gethostbyaddr($client->peeraddr);
       printf "[Connect from %s]\n", $hostinfo ? $hostinfo->name : $client->peerhost;
       print $client "Command? ";
       while ( <$client>) {
         next unless /\S/;       # blank line
            if (/comd/i )        { print  $client `dir`;      }
       } continue {
          print $client "Command? ";
       }
       close $client;
       print "client closed";
     }

1 Ответ

0 голосов
/ 27 мая 2016

Я предполагаю, что ваш сценарий не для производства, а для домашней работы или тестирования. Существует несколько очень эффективных решений для веб-серверов в / с Perl, таких как Apache с CGI или mod_perl, HTTP :: Server :: Simple и PSGI / Plack .

Вы также обычно будете использовать фреймворк, такой как Dancer , Mojo или Catalyst , который делает большинство скучных стандартных вещей для вас:

use Dancer;

get '/' => sub {
    return 'Hi there, you just visited host '.request->host.
        ' at port '.request->port.' asking for '.request->uri;
};

Возвращаясь к вашему вопросу: ваш скрипт является интерактивным сервером, а HTTP имеет строгую структуру запросов и ответов:

  1. Клиент подключается к серверу
  2. Клиент отправляет запрос
  3. Сервер отправляет ответ

Вам нужно удалить интерактивную часть и просто подождать, пока клиент начнет разговор:

use IO::Socket;
use Net::hostent;       # for OO version of gethostbyaddr
$PORT = 9009;           # pick something not in use
$server = IO::Socket::INET->new( Proto     => 'tcp',
                                 LocalPort => $PORT,
                                 Listen    => SOMAXCONN,
                                 Reuse     => 1);

die "can't setup server" unless $server;
print "[Server $0 accepting clients]\n";
     while ($client = $server->accept()) 
     {
       $hostinfo = gethostbyaddr($client->peeraddr);

       # Read request up to a empty line
       my $request;
       while ( <$client>) {
         last unless /\S/;
         $request .= $_;
       }

       # Do something with the request

       # Send response
       print $client "Status: 200 OK\r\nContent-type: text/plain\r\n\r\n".$request;

       close $client;
       print "client closed";
     }

Сервер считывает полный запрос от клиента и возвращает свернутый заголовок HTTP плюс исходный запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...