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);