httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Graham Leggett <minf...@sharp.fm>
Subject quickhandler hook: what is "lookup" for?
Date Tue, 10 Feb 2009 15:52:23 GMT
Hi all,

According to the method signature for the quick_handler hook, an int 
field called "lookup" is passed.

According to the API docs, the "lookup" field is described as: "Controls 
whether the caller actually wants content or not. lookup is set when the 
quick_handler is called out of ap_sub_req_lookup_uri()".

This description doesn't tell me exactly what lookup means: does (lookup 
== 1) mean the caller wants content? Does (lookup == 0) mean the caller 
want's content?

Looking at ap_sub_req_method_uri(), which is used to set up a subrequest 
(but not necessarily run it yet or at all), lookup is set to 1.

     if (next_filter) {
         res = ap_run_quick_handler(rnew, 1);
     }

This would imply to me that (lookup == 1) means the caller *doesn't* 
want content.

Looking at ap_run_sub_req(), which is used to actually run the request 
as set up by ap_sub_req_method_uri(), the quick handler is called again, 
with the lookup set to 0:

         retval = ap_run_quick_handler(r, 0);

This would imply to me that (lookup == 0) means the caller *does* want 
content.

However, in ap_run_sub_req(), we only run the quick handler if the 
content *isn't* a file or directory on disk:

     if (!(r->filename && r->finfo.filetype)) {
         retval = ap_run_quick_handler(r, 0);
     }

Why does ap_run_sub_req() care whether the request is represented by a 
file or directory on disk?

To describe the problem I am trying to solve: mod_cache refuses to cache 
the result of subrequests, and this is happening because the 
quick_handler is not running on subrequests with a lookup value of zero.

Would it be correct to run the quick handler for all requests, like so?

  AP_DECLARE(int) ap_run_sub_req(request_rec *r)
  {
      int retval = DECLINED;
      /* Run the quick handler if the subrequest is not a dirent or file
       * subrequest
       */
-    if (!(r->filename && r->finfo.filetype)) {
-         retval = ap_run_quick_handler(r, 0);
+    retval = ap_run_quick_handler(r, 0);
-    }
      if (retval != OK) {
          retval = ap_invoke_handler(r);
          if (retval == DONE) {
              retval = OK;
          }
      }
      ap_finalize_sub_req_protocol(r);
      return retval;
  }

Regards,
Graham
--

Mime
View raw message