2009-05-25 5 views
14

J'essaie d'écrire un script CGI Perl pour gérer les requêtes XML-RPC, dans lequel un document XML est envoyé en tant que corps d'une requête HTTP POST. Le module CGI.pm fait un excellent travail pour extraire les params nommés d'une requête HTTP, mais je n'arrive pas à comprendre comment lui donner le corps de la requête HTTP entière (ie le document XML dans le XML-RPC demande que je gère).Comment puis-je obtenir l'intégralité du corps de la requête avec CGI.pm?

Si ce n'est pas CGI.pm, y a-t-il un autre module qui serait capable d'analyser cette information hors de la demande? Je préférerais ne pas devoir extraire cette information "à la main" des variables d'environnement. Merci pour toute aide.

Répondre

24

Vous pouvez obtenir les données POST brutes en utilisant le nom de paramètre spécial POSTDATA.

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

Sinon, vous pouvez lire STDIN directement au lieu d'utiliser CGI.pm, mais vous perdez toutes les autres choses utiles que CGI.pm fait.

L'astuce POSTDATA est documentée dans les excellents documents CGI.pm here.

+0

Merci! Désolé j'ai raté cela dans les docs. –

12

À droite, on pourrait utiliser POSTDATA, mais cela ne fonctionne que si la requête Content-Type n'a pas été définie sur 'multipart/form-data'.

S'il est défini sur 'multipart/form-data', CGI.pm effectue son propre traitement de contenu et POSTDATA n'est pas initialisé. Par conséquent, d'autres options incluent $cgi->query_string et/ou $cgi->Dump. Le $cgi->query_string renvoie le contenu du POST dans un format GET (param=value&...) et il ne semble pas y avoir moyen d'obtenir simplement le contenu du POST STDIN tel qu'il a été transmis par le client. Pour obtenir le contenu réel de l'entrée standard d'une requête POST, si vous modifiez CGI.pm, vous pouvez modifier autour de la ligne 620 pour enregistrer le contenu de @lines dans une variable, par exemple:

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

Puis accédez-y par $cgi->{standard_input}.

Questions connexes