Como enviar um código de status http personalizado com mod_perl

9

Eu escrevi um programa CGI e enviei um erro de status com o cabeçalho HTTP para o cliente. mas quando tentei usar o mod_perl ele só responde com 200 status ok. Como posso enviar um código de status personalizado?

aqui está o código quando quero responder com o erro de status personalizado:

my $cgi      = new CGI;
print $cgi->header(-type=>"text/html", -charset=>'utf-8', -status=>599);

EDITAR :
aqui está o código:

#!/usr/bin/perl -w
use strict;
use warnings;
use CGI;
use SessionManagement;


my $cgi      = new CGI;
my $method = $cgi->param("method");

my $sessionManagement = new SessionManagement(cgi=>$cgi);
if($sessionManagement){

  if (defined($method)) {
    if($method eq "authentication") {
        loginMethod($cgi,$sessionManagement);
    } elsif ($method eq "someMethod"){
        someMethod($cgi);
    } else{
        print $cgi->header(-type=>"text/xml", -charset=>'utf-8');
        print "<html>method does not exist</html>";
    }

  } else {
      print $cgi->header(-type=>"text/html", -charset=>'utf-8' , -status=>599);
      print "<html>blah blah</html>";
  }

}else{
  print $cgi->header(-type=>"text/html", -charset=>'utf-8' , -status=>599);
  print "<html>blah blah</html>";
}

-------------------------------------------

EDIT 2

dando mais algumas informações: quando uso o comando curl -v 192.168.1.212/mymodperl/test.pl no shell.
aqui está a resposta:

* About to connect() to 192.168.1.212 port 80 (#0)
*   Trying 192.168.1.212... connected
* Connected to 192.168.1.212 (192.168.1.212) port 80 (#0)
> GET /mymodperl/test.pl HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 192.168.1.212
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Sat, 25 Nov 2017 11:04:18 GMT
< Server: Apache/2.2.15 (Red Hat)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=ISO-8859-1
< 
<html>hi</html><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator,
 root@localhost and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.</p>
<p>More information about this error may be available
in the server error log.</p>
<hr>
<address>Apache/2.2.15 (Red Hat) Server at 192.168.1.212 Port 80</address>
</body></html>
* Closing connection #0
    
por Sarah Aziziyan 23.11.2017 в 09:28
fonte

1 resposta

2

A partir do link , a maneira de definir um código de status é

package My::Handler;

use strict;
use warnings 'all';
use Apache2::RequestRec;

sub handler : method {
  my ($class, $r) = @_;

  $r->status( 401 );
  return 401;
}

1;# return true:

EDIT: esclarecimento

De link

  

O que são manipuladores?

     

O Apache distingue entre várias fases para as quais fornece ganchos (porque as funções C são chamadas de ap_hook_), em que os módulos podem conectar vários callbacks para estender e alterar o comportamento padrão do servidor da web. O mod_perl fornece uma interface Perl para a maioria dos ganchos disponíveis, então os gravadores de módulos mod_perl podem mudar o comportamento do Apache em Perl. Esses retornos de chamada são geralmente chamados de manipuladores e, portanto, as diretivas de configuração dos manipuladores mod_perl são semelhantes a: PerlFooHandler, em que Foo é um dos nomes do manipulador. Por exemplo, PerlResponseHandler configura o retorno de resposta.

     

Um manipulador típico é simplesmente um pacote perl com uma sub-rotina de manipulador. Por exemplo:

file:MyApache2/CurrentTime.pm
----------------------------
package MyApache2::CurrentTime;

use strict;
use warnings;

use Apache2::RequestRec ();
use Apache2::RequestIO ();

use Apache2::Const -compile => qw(OK);

sub handler {
  my $r = shift;

  $r->content_type('text/plain');
  $r->print("Now is: " . scalar(localtime) . "\n");

  return Apache2::Const::OK;
}
1;
  

Esse manipulador simplesmente retorna a data e a hora atuais como resposta.

     

Como este é um manipulador de resposta, nós o configuramos como tal no httpd.conf:

PerlResponseHandler MyApache2::CurrentTime
  

Como o manipulador de respostas deve ser configurado para um local específico, vamos escrever uma seção de configuração completa:

PerlModule MyApache2::CurrentTime
<Location /time>
  SetHandler modperl
  PerlResponseHandler MyApache2::CurrentTime
</Location>
  

Agora, quando uma solicitação é emitida para o link , esse manipulador de resposta é executado e uma resposta que inclui a hora atual é retornada ao cliente.

    
por mikep 26.11.2017 / 14:51
fonte