package POE::Component::Server::HTTPServer::ParameterParseHandler; use strict; use HTTP::Status; use MIME::Types; use URI::Escape qw(uri_unescape); use POE::Component::Server::HTTPServer::Handler; use base 'POE::Component::Server::HTTPServer::Handler'; # # problems to fix: # multi-valued params # mutlipart form data # the hash copying at the end of the POST handling could be more efficient # sub handle { my $self = shift; my $context = shift; my $req = $context->{request}; # technically, for POST requests we could ignore (uri-)query params # might as well grab them, though my %p = $req->uri->query_form; $context->{param} = \%p; if ( $req->method eq 'POST' ) { if ( $req->content_type ne 'application/x-www-form-urlencoded' ) { print "XXX Don't know how to handle POST content encoding: ", $req->content_type, "\n"; } else { my $querydata = $req->content; # following mapmap stolen from URI::_query my %bodyp = map { s/\+/ /g; uri_unescape($_) } map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/&/, $querydata); foreach my $k (keys %bodyp) { $context->{param}->{$k} = $bodyp{$k}; } } } return H_CONT; } 1; __END__ =pod =head1 NAME POE::Component::Server::HTTPServer::ParameterParseHandler - Parse request parameters into context =head1 SYNOPSIS use POE::Component::Server::HTTPServer::Handler; $server->handlers([ '/act/' => new_handler('ParameterParseHandler'), '/act/' => \&action_handler, ]); sub action_handler { my $context = shift; print "The 'foo' parameter is: ", $context->{param}->{foo}, "\n"; } =head1 DESCRIPTION ParameterParseHandler parses the request URI and body (for POST requests), and stores CGI parameters in the context. Parameters are stored as a hashref (name => value) in C<$context-E{param}>. Stack this handler before handlers which need to process request parameters. =head1 TODO Multivalued parameters are currently not currently supported. Multipart submissions are currently not supported. =head1 AUTHOR Greg Fast =head1 COPYRIGHT Copyright 2003 Greg Fast. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut