2009-05-25 16 views
14

Estoy tratando de escribir una secuencia de comandos Perl CGI para manejar solicitudes XML-RPC, en las que se envía un documento XML como el cuerpo de una solicitud HTTP POST.¿Cómo puedo obtener todo el cuerpo de la solicitud con CGI.pm?

El módulo CGI.pm hace un gran trabajo extrayendo params con nombre de una solicitud HTTP, pero no entiendo cómo hacer que me proporcione todo el cuerpo de la solicitud HTTP (es decir, el documento XML en el XML-RPC solicitud estoy manejando).

Si no es CGI.pm, ¿hay otro módulo que pueda analizar esta información fuera de la solicitud? Prefiero no tener que extraer esta información "a mano" de las variables de entorno. Gracias por cualquier ayuda.

Respuesta

24

Puede obtener los datos de POST sin formato utilizando el nombre de parámetro especial POSTDATA.

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

Alternativamente, se podía leer STDIN directamente en lugar de utilizar CGI.pm, pero entonces se pierde el resto de materia útil que CGI.pm hace.

El truco POSTDATA está documentado en los excelentes documentos CGI.pm here.

+0

Gracias! Lo siento, me perdí eso en los documentos. –

12

Derecho, se podría usar POSTDATA, pero eso solo funciona si la solicitud Content-Type no se ha establecido en 'multipart/form-data'.

Si se establece en 'multipart/form-data', CGI.pm realiza su propio procesamiento de contenido y POSTDATA no se inicializa.

Por lo tanto, otras opciones incluyen $cgi->query_string y/o $cgi->Dump.

El $cgi->query_string devuelve los contenidos del POST en formato GET (param=value&...), y no parece haber una manera de obtener simplemente los contenidos del POST STDIN tal como fueron pasados ​​por el cliente.

Así que para obtener el contenido real de la entrada estándar de una solicitud POST, si modificando CGI.pm es una opción para usted, usted podría modificar alrededor de la línea 620 para guardar el contenido del @lines en algún lugar de una variable, como por ejemplo:

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

Y luego acceder a ella a través $cgi->{standard_input}.

Cuestiones relacionadas