Stanimirovv
Stanimirovv

Reputation: 3172

Where can I find the request body in HTTP::Server::Simple

I have the following simple server:

And I am trying to locate where the request body (or content) is. I have tried dumping $self and $cgi but they didn't contain the field (I am asuming because they don't carry any information regarding the request)

How can I get the request body ?

package MyWebServer;
 use strict;
 use HTTP::Server::Simple::CGI;
 use base qw(HTTP::Server::Simple::CGI);
 use Data::Dumper;

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

 sub handle_request {
     my $self = shift;
     my $cgi  = shift;

     my $path = $cgi->path_info();
     my $handler = $dispatch{$path};

     print "printing self in request".Dumper($cgi);
     my $req = $cgi->get_request;
     if (ref($handler) eq "CODE") {
         print "HTTP/1.0 200 OK\r\n";
         $handler->($cgi, "asd");

     } 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, $asd)  = @_;   # CGI.pm object

     my $who = $cgi->param('name');

     print $cgi->header,
           $cgi->start_html("Hello"),
           $cgi->h1("Hello world!!"),
           $cgi->h2("Azdh $asd");

           $cgi->end_html;
 }

 # start the server on port 8080
 my $pid = MyWebServer->new(8081)->background();
 print "Use 'kill $pid' to stop server.\n";

EDIT: Here is an example request:

use strict;
require LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => "http://localhost:8081/hello");


$req->content("<foo>3.14</foo>"); # the request body 


my $resp = $ua->request($req);
if ($resp->is_success) {
    my $message = $resp->decoded_content;
    print "Received reply: $message\n";
}
else {
    print "HTTP GET error code: ", $resp->code, "\n";
    print "HTTP GET error message: ", $resp->message, "\n";
}

Upvotes: 1

Views: 731

Answers (2)

vianns
vianns

Reputation: 26

It's a bit old, but facing the same issue, here's the solution :

$cgi->param('POSTDATA');

That's all you need to retreive the Body contents.

cheers.

Upvotes: 1

The request object you obtained using the line $req = $cgi->get_request is a CGI::Request object. Since this is a request object, it will have only attributes (parameters passed on to the request). Please note that only response objects will have content. So, to see all the parameters you have passed, you can use the as_string() object method as mentioned below.

print $req->as_string;

For more information about accessing individual parameters of the request object, please see CGI::Request documentation in http://search.cpan.org/~mrjc/cvswebedit-v2.0b1/cvs-web/lib/CGI/Request.pm.

Upvotes: 1

Related Questions