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 )