Making perl read from index.html file

倾然丶 夕夏残阳落幕 提交于 2019-12-25 18:27:03

问题


I'm trying to use perl as my web server for a specific address:port number, 10.x.x.x:portNumber, while also having it show what's in my index.html file by default. However, perl does not show the contents of index.html when I run 10.x.x.x:portNumber in my browser. How can I get perl to read from a file?

This is the code I'm working with for this problem.

#!/usr/bin/perl
{
package MyWebServer;
use HTTP::Server::Simple::CGI;
use base qw(HTTP::Server::Simple::CGI);
my %dispatch = (
    '/' => \&resp_hello,
);


sub handle_request {
    my $self = shift;
    my $cgi  = shift;
    my $path = $cgi->path_info();
    my $handler = $dispatch{$path};
    if (ref($handler) eq "CODE") {
        print "HTTP/1.0 200 OK\r\n";
        $handler->($cgi);
    } else {
        print "HTTP/1.0 404 Not found\r\n";
        print $cgi->header,
        $cgi->start_html('Not found'),
        $cgi->h1('Not found'),
        $cgi->end_html;
    }
}


sub resp_hello {
    my $cgi  = shift;   # CGI.pm object
    return if !ref $cgi;
    my $who = $cgi->param('name');   
    print $cgi->header,
        $cgi->start_html("Hello"),
        $cgi->h1("Hello Perl"),
        $cgi->end_html;
}
}


my $pid = MyWebServer->new(XXXX)->background();
print "Use 'kill $pid' to stop server.\n";

Thank you.


回答1:


Your code is explicitly configured run resp_hello() when you access your server's root URL.

my %dispatch = (
    '/' => \&resp_hello,
);

I don't know exactly what URL structure you are hoping to implement, but if you're trying to differentiate / and /index.html then you could do something like this:

my %dispatch = (
    '/' => \&resp_hello,
    '/index.html' => \&resp_index,
);

and then write a resp_index() subroutine which opens the index.html file and returns the contents to the browser.

You could extend this I suppose and serve any files that exist on the filesystem directly.

But I have to wonder why you're doing this all yourself and not just reaching for a solution that uses PSGI and Plack. Where did you get the idea to use HTTP::Server::Simple?

And I'm appalled to see documentation that encourages the use of the HTML-generation functions from CGI.pm. We've all known what a terrible idea they are for some considerable time, and they are now deprecated.

Before you spend too long going down this path, I'd urge you to investigate more standard Perl web tools.



来源:https://stackoverflow.com/questions/40276159/making-perl-read-from-index-html-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!