How can I get the entire request body with CGI.pm?

I'm trying to write a Perl CGI script to handle XML-RPC requests, in which an XML document is sent as the body of an HTTP POST request.

The CGI.pm module does a great job at extracting named params from an HTTP request, but I can't figure out how to make it give me the entire HTTP request body (i.e. the XML document in the XML-RPC request I'm handling).

If not CGI.pm, is there another module that would be able to parse this information out of the request? I'd prefer not to have to extract this information "by hand" from the environment variables. Thanks for any help.


You can get the raw POST data by using the special parameter name POSTDATA.

my $q = CGI->new;
my $xml = $q->param( 'POSTDATA' );

Alternatively, you could read STDIN directly instead of using CGI.pm, but then you lose all the other useful stuff that CGI.pm does.

The POSTDATA trick is documented in the excellent CGI.pm docs here.

How can I get the entire request body with CGI.pm? - perl - php, Get raw request body using perl CGI.pm. I am building a web server using Apache and Perl CGI which processes the POST requests sent to it. I get how to make the header of a request (using CGI.pm and printing the results of the header() function), but haven't been able to find any info on how to access the headers being sent to my CGI script.


Right, one could use POSTDATA, but that only works if the request Content-Type has not been set to 'multipart/form-data'.

If it is set to 'multipart/form-data', CGI.pm does its own content processing and POSTDATA is not initialized.

So, other options include $cgi->query_string and/or $cgi->Dump.

The $cgi->query_string returns the contents of the POST in a GET format (param=value&...), and there doesn't seem to be a way to simply get the contents of the POST STDIN as they were passed in by the client.

So to get the actual content of the standard input of a POST request, if modifying CGI.pm is an option for you, you could modify around line 620 to save the content of @lines somewhere in a variable, such as:

$self->{standard_input} = join '', @lines;

And then access it through $cgi->{standard_input}.

Get raw request body using perl CGI.pm, CGI.pm is a stable, complete and mature solution for processing and preparing This method returns a canned HTML header and the opening <body> tag. This prints out the field names and the data entered into each field in the form. It does not do URL-decoding, however. A better way to parse QUERY_STRING variables is with CGI.pm. Using CGI.pm to Parse the Query String. If you're sending more than one value in the query string, it's best to use CGI.pm to parse it.


To handle all cases, including those when Content-Type is multipart/form-data, read (and put back) the raw data, before CGI does.

use strict;
use warnings;

use IO::Handle;
use IO::Scalar;

STDIN->blocking(1); # ensure to read everything
my $cgi_raw = '';

{ 
  local $/; 
  $cgi_raw = <STDIN>;
  my $s;
  tie  *STDIN, 'IO::Scalar', \$s;
  print STDIN $cgi_raw;
  tied(*STDIN)->setpos(0);
}

use CGI qw /:standard/;
...

CGI, CGI.pm is a stable, complete and mature solution for processing and preparing HTTP requests and responses. Major features including processing form  Perl and CGI. Nov 12, 2018 by Dave Jacoby CGI stands for Common Gateway Interface, it’s a protocol for executing scripts via web requests, and in the late 1990’s was the main way to write dynamic programs for the Web.


CGI, The CGI module helped Perl grow when the web first blew up. “POST” request, with the form input as key value pairs in the request body. CGI  pm.environment.set('request_body', body_str); // this sets an environment variable with the stringified body In the request body editor, specify the raw request body as the variable created in step 3. {{request_body}} Note that the snippet from step 4 will have to be placed in the body editor.


Perl and CGI, As a whole, libapreq implements a Perl interface to underlying Apache CAPI methods client request data such as cookies, file uploads, and GET and POST data of type The interface for Apache::Request is modeled after that of CGI.pm. You cannot send a request body using a GET operation (HTTP method). To send data, you have to use one of: POST (the more common), PUT, DELETE or PATCH.


Mod_perl Developer's Cookbook, As an example, to limit the size of the request body to 2 MB, you should add: This section demonstrates how a small input submitted by a malicious user may hog the whole server. Imagine an We will use DBI and CGI.pm for this example​. One ASP.NET Web API related question that frequently comes up frequently is how to capture the raw request content to a simple parameter on a controller method. Turns out that's not as easy as it should be. In this post I discuss how to natively capture the raw request content and then create a [NakedBody] attribute that makes it easy capture the raw content in a string or byte[] parameter.