On Wed 23 Apr 2008, David E. Wheeler wrote:
> No subrequest appears at all! So this leads me to conclude one of two  
> things. Either
>
> 1. Internally, mod_perl's TransHandler code triggers the subrequest.  
> Why it would, I have no idea, but if there is no TransHandler, that  
> code doesn't execute and there is no subrequest. Or:
>
> 2. There is some code executing somewhere in Bricolage between the  
> AccessHander and the ResponseHandler, but only if there is a  
> TransHandler. If this is the case, I have no idea where that code  
> would be. Remember, this is my httpd.conf:
>
> NameVirtualHost *:80
> <VirtualHost *:80>
>   DocumentRoot           /usr/local/bricolage/comp
>   ServerName             localhost
>   DefaultType            "text/html; charset=utf-8"
>   AddDefaultCharset      utf-8
>   SetHandler             perl-script
>   PerlResponseHandler    Bric::App::Handler
>   PerlAccessHandler      Bric::App::AccessHandler
>   PerlCleanupHandler     Bric::App::CleanupHandler
>   PerlTransHandler       Apache2::Const::DECLINE
> </VirtualHost>
>
> So, with this information, I can at least work around the problem by  
> declining to do anything in the AccessHandler or the CleanupHandler  
> when $r->main returns something, but I'm still mystfied as to where  
> this subrequest is coming from.

Well, I think I can shed some light on that mystery. When you use 
the "perl-script" handler instead of "modperl" then your C-level response 
handler is modperl_response_handler_cgi (see src/modules/perl/mod_perl.c). 
This function calls modperl_env_request_populate (see modperl_env.c) and that 
calls ap_add_cgi_vars (see httpd.../server/util_script.c). All that happens 
in the response phase *before* the PerlResponseHandler is called.

ap_add_cgi_vars contains the following code:

  if (r->path_info && r->path_info[0]) {
      ...
      pa_req = ap_sub_req_lookup_uri(ap_escape_uri(r->pool, r->path_info), r,
                                     NULL);
      if (pa_req->filename) {
          ...
          apr_table_setn(e, "PATH_TRANSLATED", pt);

You see, if path_info is used the C-notion of $r->lookup_uri is used to map 
this path_info to the file system. The result is then made available as 
$r->subprocess_env->{PATH_TRANSLATED}. This environment variable is seldom 
used but unfortunately part of the CGI/1.1 standard 
(http://hoohoo.ncsa.uiuc.edu/cgi/env.html).

Why the subreq is not set up if your transhandler is not used I can only 
guess. Maybe it sets $r->path_info explicitly maybe it sets $r->filename so 
that the standard maptostorage handler sets path_info. But path_info is 
probably empty if your transhandler is not used.

Further I recall a problem/bug that if the PerlCleanupHandler is the only 
configured Perl handler for a request it is not called. But that does not 
seem to hit you since you have a (Trans|Access)Handler at least. If you think 
that may be the case try the threading mod_perl branch. There the problem is 
solved (http://svn.apache.org/repos/asf/perl/modperl/branches/threading). 
That branch still does not work with perl 5.10.

Torsten

--
Need professional mod_perl support?
Just hire me: [EMAIL PROTECTED]

Reply via email to