dgaudet     99/12/30 21:35:53

  Modified:    src      CHANGES
               src/modules/standard mod_autoindex.c mod_include.c
  Log:
  > Attached are 2 alternative diffs to finish implementing server-parsed
  > mod_autoindex Header and Readme files in apache_1.3. A third diff is
  > attached that shows the differences between the alternatives.
  >
  > Why this is needed: With an unpatched apache_1.3.9, the include variables
  > DOCUMENT_NAME, DOCUMENT_PATH_INFO, DOCUMENT_URI, LAST_MODIFIED,
  > SCRIPT_NAME, and SERVER_PROTOCOL will have values reflecting the Header
  > or Readme files instead of the directory. Contrast this with the use of
  > included files in a non directory document where those include variables
  > reflect the base document, not the included file.
  >
  > Both alternatives work with and without various pool/memory
  > allocation/deallocation debugging options enabled and using various
  > compiler optimization levels on Linux. Alternative 0 has been in use for
  > the last 6 months (without the ap_table_unset's in mod_autoindex) using
  > apache_1.3.7-dev (downloaded 19990504) without problems.
  >
  > Two alternatives are presented because Dean did not think that alternative
  > 0 was safe 6 months ago. I believe that it is and it provides a cleaner
  > method for module authors to use the power and flexibility of mod_include
  > to enhance generated content, like mod_autoindex.
  
  i chose alternative 0.
  
  Submitted by: Raymond S Brand <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.1487    +3 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1486
  retrieving revision 1.1487
  diff -u -r1.1486 -r1.1487
  --- CHANGES   1999/12/28 09:12:33     1.1486
  +++ CHANGES   1999/12/31 05:35:48     1.1487
  @@ -1,5 +1,8 @@
   Changes with Apache 1.3.10
   
  +  *) Changes to enable server-parsed mod_autoindex Header and
  +     Readme files. [Raymond S Brand <[EMAIL PROTECTED]>]
  +
     *) Add back support for UseCanonicalName in <Directory> containers
        [Manoj Kasichainula]
   
  
  
  
  1.113     +16 -0     apache-1.3/src/modules/standard/mod_autoindex.c
  
  Index: mod_autoindex.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_autoindex.c,v
  retrieving revision 1.112
  retrieving revision 1.113
  diff -u -r1.112 -r1.113
  --- mod_autoindex.c   1999/12/01 22:10:45     1.112
  +++ mod_autoindex.c   1999/12/31 05:35:52     1.113
  @@ -970,6 +970,10 @@
       ap_rputs("</PRE>\n", r);
   }
   
  +/* See mod_include */
  +#define SUB_REQ_STRING       "Sub request to mod_include"
  +#define PARENT_STRING        "Parent request to mod_include"
  +
   /*
    * Handle the preamble through the H1 tag line, inclusive.  Locate
    * the file with a subrequests.  Process text/html documents by actually
  @@ -1012,6 +1016,11 @@
                if (! suppress_amble) {
                    emit_preamble(r, title);
                }
  +
  +             /* See mod_include */
  +             ap_table_add(r->notes, PARENT_STRING, "");
  +             ap_table_add(rr->notes, SUB_REQ_STRING, "");
  +
                /*
                 * If there's a problem running the subrequest, display the
                 * preamble if we didn't do it before -- the header file
  @@ -1022,6 +1031,7 @@
                    emit_amble = suppress_amble;
                    emit_H1 = 1;
                }
  +             ap_table_unset(r->notes, PARENT_STRING);        /* cleanup */
            }
            else if (!strncasecmp("text/", rr->content_type, 5)) {
                /*
  @@ -1087,11 +1097,17 @@
        if (rr->content_type != NULL) {
            if (!strcasecmp(ap_field_noparam(r->pool, rr->content_type),
                            "text/html")) {
  +
  +             /* See mod_include */
  +             ap_table_add(r->notes, PARENT_STRING, "");
  +             ap_table_add(rr->notes, SUB_REQ_STRING, "");
  +
                if (ap_run_sub_req(rr) == OK) {
                    /* worked... */
                    suppress_sig = 1;
                    suppress_post = suppress_amble;
                }
  +             ap_table_unset(r->notes, PARENT_STRING);        /* cleanup */
            }
            else if (!strncasecmp("text/", rr->content_type, 5)) {
                /*
  
  
  
  1.121     +58 -10    apache-1.3/src/modules/standard/mod_include.c
  
  Index: mod_include.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_include.c,v
  retrieving revision 1.120
  retrieving revision 1.121
  diff -u -r1.120 -r1.121
  --- mod_include.c     1999/12/11 00:36:17     1.120
  +++ mod_include.c     1999/12/31 05:35:52     1.121
  @@ -108,9 +108,6 @@
   
   module MODULE_VAR_EXPORT includes_module;
   
  -/* just need some arbitrary non-NULL pointer which can't also be a 
request_rec */
  -#define NESTED_INCLUDE_MAGIC (&includes_module)
  -
   /* ------------------------ Environment function -------------------------- 
*/
   
   /* XXX: could use ap_table_overlap here */
  @@ -745,10 +742,7 @@
                   ap_rputs(error, r);
               }
   
  -         /* destroy the sub request if it's not a nested include */
  -            if (rr != NULL
  -             && ap_get_module_config(rr->request_config, &includes_module)
  -                 != NESTED_INCLUDE_MAGIC) {
  +         if (rr != NULL) {
                ap_destroy_sub_req(rr);
               }
           }
  @@ -2375,6 +2369,53 @@
           return OK;
       }
   
  +#define SUB_REQ_STRING       "Sub request to mod_include"
  +#define PARENT_STRING        "Parent request to mod_include"
  +
  +    if (ap_table_get(r->notes, SUB_REQ_STRING)) {
  +     /*
  +      * The note is a flag to mod_include that this request
  +      * should be treated as if it was a subrequest originating
  +      * in the handle_include() procedure of mod_include.
  +      */
  +
  +     /*
  +      * There is no good way to pass the parent request_rec to mod_include.
  +      * Tables only take string values and there is nowhere appropriate in
  +      * in the request_rec that can safely be used. So, search for the
  +      * parent note by walking up the r->main list of subrequests, and at
  +      * each level walking back through any internal redirects. This is
  +      * the same request walking that mod_include uses in the procedure
  +      * handle_include().
  +      */
  +     request_rec *p = r->main;
  +     request_rec *q = p;
  +
  +     while (q) {
  +         if (ap_table_get(q->notes, PARENT_STRING)) {
  +             /* Kludge --- See below */
  +             ap_set_module_config(r->request_config, &includes_module, q);
  +
  +             /* Create the initial environment in the parent */
  +             ap_add_common_vars(q);
  +             ap_add_cgi_vars(q);
  +             add_include_vars(q, DEFAULT_TIME_FORMAT);
  +
  +             /* Cleanup - This should allow this technique to nest */
  +             ap_table_unset(r->notes, SUB_REQ_STRING);
  +             ap_table_unset(q->notes, PARENT_STRING);
  +             break;
  +         }
  +         if (q->prev != NULL) {
  +             q = q->prev;
  +         }
  +         else {
  +             p = p->main;
  +             q = p;
  +         }
  +     }
  +    }
  +
       if ((parent = ap_get_module_config(r->request_config, 
&includes_module))) {
        /* Kludge --- for nested includes, we want to keep the subprocess
         * environment of the base document (for compatibility); that means
  @@ -2410,9 +2451,16 @@
       send_parsed_content(f, r);
   
       if (parent) {
  -     /* signify that the sub request should not be killed */
  -     ap_set_module_config(r->request_config, &includes_module,
  -         NESTED_INCLUDE_MAGIC);
  +     /*
  +      * All the work is finished for this subrequest. The following
  +      * makes it safe for the creator of the subrequest to destroy it
  +      * via ap_destroy_sub_req() once the call to ap_run_sub_req()
  +      * returns. This is required since the original pool of the
  +      * subrequest has been merged into the pool of the parent request
  +      * of the subrequest (see Kludge above). The alternative is to
  +      * NOT destroy the subrequest.
  +      */
  +     r->pool = ap_make_sub_pool(r->pool);
       }
   
       ap_kill_timeout(r);
  
  
  

Reply via email to