• Publicidad

Servidor HTTP en Perl

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Servidor HTTP en Perl

Notapor jimr1984 » 2015-02-04 16:55 @746

Estimados: buenas tardes. Por favor, necesito traducir este código Python a Perl.

Sintáxis: [ Descargar ] [ Ocultar ]
Using python Syntax Highlighting
  1. import sys
  2. import BaseHTTPServer
  3. from SimpleHTTPServer import SimpleHTTPRequestHandler
  4.  
  5.  
  6. HandlerClass = SimpleHTTPRequestHandler
  7. ServerClass  = BaseHTTPServer.HTTPServer
  8. Protocol     = "HTTP/1.0"
  9.  
  10. if sys.argv[1:]:
  11.     port = int(sys.argv[1])
  12. else:
  13.     port = 8000
  14. server_address = ('127.0.0.1', port)
  15.  
  16. HandlerClass.protocol_version = Protocol
  17. httpd = ServerClass(server_address, HandlerClass)
  18.  
  19. sa = httpd.socket.getsockname()
  20. print "Serving HTTP on", sa[0], "port", sa[1], "..."
  21. httpd.serve_forever()
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Si alguien puede ayudarme, por favor, a entender...
Última edición por explorer el 2015-02-05 15:05 @670, editado 3 veces en total
Razón: codigo => código;
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Publicidad

Re: Servidor HTTP en Perl

Notapor explorer » 2015-02-04 18:14 @801

Creo que sería así, pero no lo he probado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3.                                                 # import sys
  4. use HTTP::Server::Simple;                       # import BaseHTTPServer
  5.                                                 # from SimpleHTTPServer import SimpleHTTPRequestHandler
  6.  
  7.  
  8.                                                 # HandlerClass = SimpleHTTPRequestHandler
  9. my $ServerClass = 'HTTP::Server::Simple';       # ServerClass  = BaseHTTPServer.HTTPServer
  10.                                                 # Protocol     = "HTTP/1.0"
  11.  
  12. my $port;
  13. if (@ARGV) {                                    # if sys.argv[1:]:
  14.     $port = int $ARGV[0];                       #     port = int(sys.argv[1])
  15. }
  16. else {                                          # else:
  17.     $port = 8000;                               #     port = 8000
  18. }
  19.  
  20. my @server_address = ('127.0.0.1', $port);      # server_address = ('127.0.0.1', port)
  21.  
  22.                                                 # HandlerClass.protocol_version = Protocol
  23. my $httpd = $ServerClass->new();                # httpd = ServerClass(server_address, HandlerClass)
  24. $httpd->host($server_address[0]);
  25. $httpd->port($server_address[1]);
  26.  
  27.                                                 # sa = httpd.socket.getsockname()
  28.  
  29.                                                 # print "Serving HTTP on", sa[0], "port", sa[1], "..."
  30. say "Serving HTTP on ", $httpd->host, " port ", $httpd->port, "...";
  31.  
  32. $httpd->run();                                  # httpd.serve_forever()
  33.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Naturalmente, se trata de una copia literal... se puede hacer en menos líneas :)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use HTTP::Server::Simple;
  3. my $httpd = HTTP::Server::Simple->new($ARGV[0] // 8000);
  4. $httpd->run();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Servidor HTTP en Perl

Notapor jimr1984 » 2015-02-05 09:40 @444

Estimado, estuve revisando el código y probando ambos pero no logro conseguir que al ejecutar el script me dé como resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Serving  HTTP on 0.0.0.0 port 80
192.168.0.13 -- [05/02/2015 10:28] "GET /index.php HTTP/1.0" 200-
192.168.0.13 -- [05/02/2015 10:38] "GET /index2.php HTTP/1.0" 200-
192.168.0.13 -- [05/02/2015 11:12] "GET /index3.php HTTP/1.0" 200-
192.168.0.13 -- [05/02/2015 12:28] "GET /index4.php HTTP/1.0" 200-
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Al momento de ejecutar el scritp debe mostrar un mensaje
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Serving  HTTP on 0.0.0.0 port 80
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y quedar a la espera de solicitudes.

Cuando un cliente se conecte a mi servidor web en el script debe mostrar la IP, fecha, hora, método y archivo solicitado y código de respuesta HTTP:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
192.168.0.13 -- [05/02/2015 10:28] "GET /index.php HTTP/1.0" 200-
192.168.0.13 -- [05/02/2015 10:38] "GET /index2.php HTTP/1.0" 200-
192.168.0.13 -- [05/02/2015 11:12] "GET /index3.php HTTP/1.0" 200-
192.168.0.13 -- [05/02/2015 12:28] "GET /index4.php HTTP/1.0" 200-
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Cuando ejecuto el script que se puso como ejemplo en Perl me da el siguiente resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
C:\Perl64\bin\miscript\server>perl miserver.pl 80
Serving HTTP on

 port

Use of uninitialized value in concatenation (.) or string at C:/Perl64/site/lib/
HTTP/Server/Simple.pm line 581, <DATA> line 16.
HTTP::Server::Simple::CGI: You can connect to your server at http://localhost:/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Saludos, por favor.
Última edición por explorer el 2015-02-05 15:07 @671, editado 2 veces en total
Razón: codigo => código; de => dé;
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Re: Servidor HTTP en Perl

Notapor explorer » 2015-02-05 15:04 @669

Había un error en la línea 20 del programa. Había que cambiar un '$' por un '@'. Ya está cambiado y funciona.

El porqué no funciona en el puerto 80 es porque los puertos que están por debajo del 1024 están reservados, así que hay que ser administrador del sistema para poder usarlos.

Si lo ejecuto en mi máquina, como un usuario normal, sale un aviso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl code_38314.pl 80
  2. Serving HTTP on 127.0.0.1 port 80...
  3. bind to 127.0.0.1:80: Permiso denegado at code_38314.pl line 32.
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

pero si lo uso en un puerto superior a 1024, no hay problemas (salvo que ya esté ocupado, claro).

Para que salga el registro de actividad, hay que programarlo. El servidor HTTP es solo eso: sirve contenido, nada más.

El siguiente programa hace de servidor y va registrando la actividad hacia la salida estándar de error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. package main;
  3. use v5.14;
  4. use base qw(HTTP::Server::Simple::CGI);
  5.  
  6. my $port = @ARGV ? int($ARGV[0]) : 8000;
  7.  
  8. sub handle_request {
  9.     my $self = shift;
  10.     my $cgi  = shift;
  11.  
  12.     # Registro de actividad
  13.     my @ahora = (localtime)[3,4,5,2,1];
  14.     $ahora[1]++;
  15.     $ahora[2]+=1900;
  16.     my $ahora = sprintf "[%02d/%02d/%4d %02d:%02d]", @ahora;
  17.  
  18.     my $peticion = '"' . $cgi->request_method() . " " . $cgi->path_info() . '"';
  19.  
  20.     warn join(" ",
  21.             $cgi->remote_addr(),
  22.             '--',
  23.             $ahora,
  24.             $peticion,
  25.             '200',
  26.             $cgi->user_agent(),
  27.         ),"\n"
  28.     ;
  29.  
  30.     # Respuesta al cliente
  31.     print "HTTP/1.0 200\r\n";
  32.     print $cgi->header, $cgi->start_html('Not found'), $cgi->h1('Not found'), $cgi->end_html;
  33.  
  34. }
  35.  
  36. # start the server on port 8080
  37. my $pid = main->new($port)->run();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Arrancando este programa en una terminal, sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl code_38314.pl
  2. main: You can connect to your server at http://localhost:8000/
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En otra terminal hago
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ telnet 0 8000
  2. Trying 0.0.0.0...
  3. Connected to 0.
  4. Escape character is '^]'.
  5. GET / HTTP/1.1
  6.  
  7. HTTP/1.0 200
  8. Content-Type: text/html; charset=ISO-8859-1
  9.  
  10. <!DOCTYPE html
  11.         PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  12.          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  13. <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
  14. <head>
  15. <title>Not found</title>
  16. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  17. </head>
  18. <body>
  19. <h1>Not found</h1>
  20. </body>
  21. </html>Connection closed by foreign host.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y en la terminal donde se arrancó el servidor sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
127.0.0.1 -- [05/02/2015 19:40] "GET /" 200
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

P.D.: Hay otros módulos para crear servidores HTTP en Perl. Por ejemplo, IO::All o Net::Server::HTTP o Mojo::Server::Daemon.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Servidor HTTP en Perl

Notapor jimr1984 » 2015-02-09 09:44 @447

Muchas gracias, estimado explorer... mis dudas fueron resueltas.

Saludos...
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados