代码之家  ›  专栏  ›  技术社区  ›  Sinan Ünür

如何获取$cgi->state以在http::server::simple下返回有意义的信息?

  •  4
  • Sinan Ünür  · 技术社区  · 14 年前

    首先,这里是我正在使用的代码(您需要0.42版本的 HTTP::Server::Simple 运行它):

    #!/usr/bin/perl
    package My::HTTP::Server;
    
    use strict; use warnings;
    use parent 'HTTP::Server::Simple::CGI';
    
    sub handle_request {
        my $server = shift;
        my ($cgi) = @_;
    
        print $cgi->header('text/plain'), $cgi->state, "\n";
    }
    
    package main;
    use strict; use warnings;
    
    my $server = My::HTTP::Server->new;
    
    $server->cgi_class('CGI::Simple');
    $server->cgi_init(sub {
        require CGI::Simple;
        CGI::Simple->import(qw(-nph));
    });
    
    $server->port(8888);
    $server->run;
    

    当我启动服务器并浏览到 http://localhost:8888/here/is/something?a=1 ,我得到输出 http://localhost:8888E:\Home\Src\Test\HTTP-Server-Simple\hts.pl/here/is/something?a=1 . 那是因为 CGI::Simple $0 如果 $ENV{SCRIPT_NAME} 为空或未定义。所以,我想解决办法是写:

    $server->cgi_init(sub {
        $ENV{SCRIPT_NAME} = '/';
        require CGI::Simple;
        CGI::Simple->import(qw(-nph));
    });
    

    现在,我得到的输出是 http://localhost:8888//here/is/something?a=1 . 注意额外 / .

    这样可以吗?还是有更好的方法来解决这个问题?

    我正在尝试编写一个可以作为 mod_perl Registry Script 或独立应用程序。

    1 回复  |  直到 14 年前
        1
  •  4
  •   daotoad    14 年前

    代码 CGI::Simple

    sub script_name    { $ENV{'SCRIPT_NAME'} || $0 || '' }
    

    基于此,我看到了几个选择:

    • $ENV{SCRIPT_NAME} $0
    • 子类或monkey patch cgi::易于重写 script_name

    与一个全球性的人打交道让我紧张。改变 0美元 可能是无害的。可能。

    妄想症意味着我会超越 脚本名 以尽量减少更改的影响。

    猴子修补很容易,很有诱惑力:

    { no warnings 'redefine'; sub CGI::Simple::script_name {''} }
    

    但是一个合适的子类并不太难,而且它可以将影响最小化(但是您的应用程序中是否可能有多个CGI::Simple对象?):

    package CGI::Simple::NoScriptName;
    
    use base 'CGI::Simple';
    
    sub script_name {''};
    
    1;