Apache-Wombat
view release on metacpan or search on metacpan
lib/Apache/Wombat/Connector.pm view on Meta::CPAN
of B<Apache::Request> in the process), generating and sending a
response. This method is meant to be called during the content
handling phase by a PerlHandler subroutine; after calling this method,
the handler should examine the Apache request's status code and return
an appropriate value.
B<Parameters:>
=over
=item $r
the B<Apache> instance
=back
=cut
sub process {
my $self = shift;
my $r = shift;
# 1. receive request
my $apr = Apache::Request->instance($r, DISABLE_UPLOADS => 1);
#
# 2. create Request and Response instances
my $request = $self->createRequest();
$request->setRequestRec($apr);
my $response = $self->createResponse();
$response->setRequestRec($apr);
# 2.1 set Request fields
$request->setConnector($self);
$request->setContentLength($apr->header_in('Content-Length'));
$request->setContentType($apr->header_in('Content-Type'));
$request->setHandle($apr);
# protocol handled by $apr
# remoteAddr handled by $apr
$request->setResponse($response);
$request->setScheme($self->getScheme());
$request->setSecure($self->getSecure());
$request->setServerName($apr->hostname());
$request->setServerPort($apr->get_server_port());
$request->setSocket($apr);
# 2.2 set HttpRequest fields
# method handled by $apr
# queryString handled by $apr
# requestURI and maybe session ID stuff
my $uri = $apr->uri();
my $sessionID = Wombat::Util::RequestUtil->decodeURI(\$uri);
$request->setRequestURI($uri);
if ($sessionID) {
$request->setRequestedSessionId($sessionID);
$request->setRequestedSessionCookie(undef);
$request->setRequestedSessionURL(1);
}
# locales
my $acceptLangHdr = $apr->header_in('Accept-Language');
for my $locale (Wombat::Util::RequestUtil->parseLocales($acceptLangHdr)) {
$request->addLocale($locale);
}
# cookies and maybe session ID stuff
my $cookieHdr = $apr->header_in('Cookie');
for my $cookie (Wombat::Util::RequestUtil->parseCookies($cookieHdr)) {
if ($cookie->getName() eq Wombat::Globals::SESSION_COOKIE_NAME) {
# override session id specified in URI
$request->setRequestedSessionId($cookie->getValue());
$request->setRequestedSessionCookie(1);
$request->setRequestedSessionURL(undef);
# don't add session cookie
next;
}
$request->addCookie($cookie);
}
# headers
my $headers = $apr->headers_in();
while (my ($key, $val) = each %$headers) {
$request->addHeader($key, $val);
}
# security-related fields
$request->setAuthorization($apr->header_in('Authorization'));
# 2.3 Response fields
$response->setConnector($self);
$response->setHandle($apr);
$response->setRequest($request);
# 2.4 HttpResponse fields
# 3 identify container
my $container = $self->getContainer();
# XXX: use Host header and $apr->location() to find an Application?
# 4+5 call invoke and return response
eval {
$container->invoke($request, $response);
};
if ($@) {
$self->log('error invoking container', $@, 'ERROR');
my $status =
Servlet::Http::HttpServletResponse::SC_INTERNAL_SERVER_ERROR;
$response->sendError($status);
$container->handleError($request, $response, $@);
}
eval {
$response->finishResponse();
$request->finishRequest();
};
if ($@) {
$self->log("error finishing up", $@, 'ERROR');
}
return 1;
( run in 0.680 second using v1.01-cache-2.11-cpan-ceb78f64989 )