• Publicidad

No sale bien la cabecera HTTP

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

No sale bien la cabecera HTTP

Notapor silva » 2012-09-27 12:09 @548

Estoy trabajando localmente en entorno Windows, Perl y Apache, probando el módulo CGI::Application y Template-Toolkit.

He intentado hacer los ejemplos y tutoriales que presenta CGI::Application pero me tira un error de cabecera en forma permanente:

Mensaje de error:
malformed header from script 'main.pl': Bad header: <head>

main.pl se compone de:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $PRIVATE_HOME_DIR;
  2. BEGIN { $PRIVATE_HOME_DIR = '../../MySitePrivate'; }
  3.  
  4. use strict;
  5. use lib $PRIVATE_HOME_DIR.'/MyApp';
  6. use CGI::Carp qw(fatalsToBrowser);
  7. use MyMain;
  8.  
  9. MyMain->new(
  10.          TMPL_PATH              => $PRIVATE_HOME_DIR.'/templates'
  11.         ,-config_file   => $PRIVATE_HOME_DIR.'/config/config.pl'
  12. )->run;
  13.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Si le incorporo la siguiente línea, el error desaparece, la página HTML generada por template_toolkit se muestra bien.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Content-type: text/html\n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero el problema es que al mostrar la página al final aparece la leyenda:
Content-Type: text/html; charset=ISO-8859-1 1 y no puedo sacarla.

¿Cómo hago para que no me muestre esta línea?

¡¡¡¡Muchísimas gracias!!!!
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Publicidad

Re: No sale bien la cabecera HTTP

Notapor explorer » 2012-09-27 12:51 @577

El problema está en que no debes agregar "a mano" la salida de la cabecera HTTP.

Es el propio CGI::Application el que se debe encargar de estas cosas. Y la prueba es que lo hace: es justo lo que sale al final de la página y lo que tu quieres que no salga.

En realidad, algo debe estar mal en la aplicación que no hace salir la cabecera cuando debe.

El error creo que no está en main.pl, sino en MyMain.pm.

¿Podrías hacer una cosa?

Se trata de que publiques el trozo de código más pequeño de estos dos códigos (main.pl y MyMain.pm, que siga reproduciendo el error. Incluso es posible que puedas quitar la parte del sistema de plantillas de Template-Toolkit.

Lo dicho, mándanos lo más pequeño que puedas hacer, que siga sacando el error.

O si se trata de un ejemplo de un tutorial, mándanos el enlace.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No sale bien la cabecera HTTP

Notapor silva » 2012-09-27 14:13 @634

Bueno he dicho anteriormente que estoy trabajando a nivel local, sobre Windows con un Apache implementado con XAMPP, por las dudas.

Código Mymain.pm
Sintáxis: [ Descargar ] [ Ocultar ]
  1. #!c:/perl64/bin/perl -w 
  2. package MyMain; 
  3.  
  4. use base 'CGI::Application'; 
  5. use Template; 
  6. use DBI; 
  7. use strict; 
  8. use CGI::Application::Plugin::ConfigAuto (qw/cfg cfg_file/); 
  9. use CGI::Application::Plugin::DBH (qw/dbh_config dbh/); 
  10.  
  11. #------------------------------------------------------------------------------- 
  12. sub setup {    # called after cgiapp_init() 
  13.     my $self = shift; 
  14.     $self->run_modes( 
  15.        'start' => 'start', 
  16.     ); 
  17.    $self->start_mode('start'); 
  18.    $self->mode_param('mode'); 
  19.    $self->error_mode('error'); 
  20.  
  21. sub cgiapp_prerun{ 
  22.  
  23.   my $self = shift; 
  24.   $self->cfg_file('../../MySitePrivate/config/config.pl'); 
  25.  
  26.    $self->dbh_config( 
  27.       $self->cfg('db_dsn'), 
  28.       $self->cfg('db_user'), 
  29.       $self->cfg('db_pw') 
  30.    ) or die "error al conectar"; 
  31.  
  32.   my $q =$self->query(); 
  33.  
  34.  
  35. sub start{ 
  36.   my $self = shift; 
  37.   my $template = Template->new( { 
  38.      INCLUDE_PATH => '../../MySitePrivate/templates', 
  39.   }); 
  40.   
  41.   my $plantilla ='formulario.html'; 
  42.   #Procesamos la salida de l aplantilla 
  43.   return $template->process($plantilla) || die $template->error(); 
  44.  
  45. sub error{ 
  46.   my $self = shift; 
  47.   my $error = shift; 
  48.   return "Existe un error: ".$error; 
  49.  
  50. 1; 


Código HTML simple, que también funciona mal. Muestra en la parte inferior:
Content-Type: text/html; charset=ISO-8859-1
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5.         <link rel="stylesheet" type="text/css" href="../../MySite/css/estilos.css" />
  6.         <title>Intranet</title>
  7. </head>
  8. <body>
  9. <div id="cabecera">
  10.         <img src="../../MySite/images/header.jpg" width="760" height="90"  title="Header"  border="0">
  11. </div>
  12. <div id="page">
  13. Esto es una prueba, testeo CGI APPLICATION - TEMPLATE TOOLKIT
  14. </div><!-- page -->
  15. <div id='pie'>
  16.                 <img src="../../MySite/images/footer.jpg" width="760" height="95"  title="Pie de Pagina"  border="0">
  17. </div><!-- pie -->
  18. </body>
  19. </html>
  20.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


He intentado sacar del código HTML, el header. Lo he sacado pero la respuesta continua siendo la misma. Repite en la parte inferior: Content-Type: text/html; charset=ISO-8859-1

¡¡¡¡¡Gracias!!!!!
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Re: No sale bien la cabecera HTTP

Notapor danimera » 2012-09-27 17:54 @788

Prueba en tu

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub start{
  2.   my $self = shift;
  3.   my $template = Template->new( {
  4.      INCLUDE_PATH => '../../MySitePrivate/templates',
  5.   });
  6.  
  7.   my $plantilla ='formulario.html';
  8.   #Procesamos la salida de l aplantilla
  9.   return $template->process($plantilla) || die $template->error();
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


exactamente después del my $self = shift; y antes de
my $template = Template->new( {
INCLUDE_PATH => '../../MySitePrivate/templates',
});

poner un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. return "info de prueba";
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con eso descartamos que sea el código en ese procedimiento.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: No sale bien la cabecera HTTP

Notapor silva » 2012-09-27 18:52 @827

He insertado la línea como me sugieres. El resultado:

Página en blanco con la leyenda: 'info de prueba'
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Re: No sale bien la cabecera HTTP

Notapor explorer » 2012-09-27 20:21 @890

¿Qué es lo que hay en /config/config.pl?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No sale bien la cabecera HTTP

Notapor silva » 2012-09-28 04:39 @236

El archivo config.pl se compone de:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl64/bin/perl -w
  2. use strict;
  3. my %CFG;
  4.  
  5. $CFG{app_name} = "Intranet";
  6. $CFG{site_url} = "http://localhost/";
  7. $CFG{db_typel} = "MYSQL";
  8. $CFG{template_name} = "talabary"; #nombre de la plantilla por defecto
  9. $CFG{description} = "MVC Intranet Perl"; #descripción contenidos generales
  10. $CFG{tags} = "cms";
  11. $CFG{db_dsn} = "dbi:mysql:proyecto";
  12. $CFG{db_user} = "root";
  13. $CFG{db_pw} = "admin";
  14. $CFG{upload_dir} = "../../MySitePrivate/uploads";
  15. $CFG{upload_url} = $CFG{site_url}."uploads";
  16. $CFG{log_file} = "../../MySitePrivate/logs/my_errs.txt";
  17. $CFG{system_email} = '[email protected]';
  18.  
  19. return \%CFG;
  20.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡Gracias!!
silva
Perlero nuevo
Perlero nuevo
 
Mensajes: 82
Registrado: 2011-05-24 05:59 @291

Re: No sale bien la cabecera HTTP

Notapor explorer » 2012-09-29 20:29 @895

[Para evitar que en este foro salgan con marcas las direcciones electrónicas (las direcciones de correo incluidas), solo tienes que marcar la opción «No convertir automáticamente las URLs» que se encuentra debajo de la caja de edición.]

Creo que ya he encontrado el error...

Estás usando Template Toolkit (TT), a través del módulo Template, en la línea 5.

En el método start(), creas un objeto Template, y en la línea 45 llamas a process().

GI::Application (C::A) requiere que lo que retorne de los métodos, es el texto que deberá aparecer como página HTML. Tú lo haces bien con el return(), esperando que $template->process($plantilla), genere el resultado, y con el return, C::A lo tome y lo muestre en la ventana del navegador del usuario.

Y aquí está el fallo: process() NO devuelve el código HTML de la plantilla. Solo devuelve un '1' para indicar el éxito de la llamada. Lo que realmente hace process(), es procesar la $plantilla, y sacar el resultado directamente a la salida estándar.

Y eso es lo que ocurre: estás viendo que sale el contenido de la página primero (por efecto del process()), y luego sale la cabecera HTTP al final (porque es lo que C::A siempre hace antes de la salida del código HTML).

Así que el resultado es que estás generando la salida hacia el navegador en vez de dárselo a C::A, para que éste saque todo en el orden correcto.

Hay dos opciones básicas para resolver esto.

La primera: hacer que TT nos devuelva el resultado a una variable escalar en lugar de a la salida estándar, y eso es lo que regresaremos a C::A:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   # Procesamos la salida de la plantilla
  2.   my $salida = '';
  3.   $template->process('formulario.html', {}, \$salida);
  4.  
  5.   return $salida;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La segunda opción es mejor: usar CGI::Application::Plugin::TT.

Quitas el 'use Template;' y todo el código de creación de objetos Template, y pones en su lugar 'use CGI::Application::Plugin::TT;' y más tarde, dentro de los métodos
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   return $self->tt_process('formulario.html');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y ya está. Es un módulo muy cómodo. Incluso si llamas a las plantillas con el mismo nombre que los runmode, puedes simplificar la llamada a tt_process(), sin indicarle ningún argumento.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado