> No... the default server is still a server.  But you make an interesting point, that
> certain percolation occurs in the post config.  I suppose I would want that to
> happen before my handlers dealt with the per-vhost settings, and I would not
> want the changes I make to that global server to percolate any longer in the
> host_init phase.  So running the post config, then the host init phases makes
> sense for that paradigm.

cool.  just to keep up, new patches attached.

> But let's imagine a scenario of dynamic vhosts, al la htaccess.  It would actually
> be quite cool in one thread to create such a dynamic host (propagate from some
> given vhost for example.)  This host init hook would still be run against the thread
> specific dynamic server record.  We could get away with some really cool things
> that way :)  Discuss ...

you'd need a way to direct requests directly to that specific thread,
though, right?  anyway, what kind of cool things?  I can see some advantage
to this oven in prefork, where you might want to dedicate a pool of children
to specific clients, but I don't really see the threaded advantages.  but I
generally don't get threaded environments anyway :)

--Geoff
Index: include/http_config.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/include/http_config.h,v
retrieving revision 1.103
diff -u -r1.103 http_config.h
--- include/http_config.h       31 Oct 2003 22:00:38 -0000      1.103
+++ include/http_config.h       23 Dec 2003 16:49:03 -0000
@@ -1001,6 +1001,17 @@
 
 
 /**
+ * Run the host_init function for each module
+ * @param pconf The config pool
+ * @param plog The logging streams pool
+ * @param ptemp The temporary pool
+ * @param s The (virtual) host to initialize
+ * @return OK or DECLINED on success anything else is a error
+ */
+AP_DECLARE_HOOK(int,host_init,(apr_pool_t *pconf,apr_pool_t *plog,
+                               apr_pool_t *ptemp,server_rec *s))
+
+/**
  * Run the post_config function for each module
  * @param pconf The config pool
  * @param plog The logging streams pool
Index: server/main.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/main.c,v
retrieving revision 1.149
diff -u -r1.149 main.c
--- server/main.c       10 Dec 2003 13:43:14 -0000      1.149
+++ server/main.c       23 Dec 2003 16:49:03 -0000
@@ -444,6 +444,7 @@
     const char *temp_error_log = NULL;
     process_rec *process;
     server_rec *server_conf;
+    server_rec *s; /* host-specific server_rec */
     apr_pool_t *pglobal;
     apr_pool_t *pconf;
     apr_pool_t *plog; /* Pool of log streams, reset _after_ each read of conf */
@@ -655,6 +656,14 @@
         destroy_and_exit_process(process, 1);
     }
 
+    for (s = server_conf; s; s = s->next) {
+        if ( ap_run_host_init(pconf, plog, ptemp, s) != OK) {
+            ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
+                         0, NULL, "Unable to initialize hosts\n");
+            destroy_and_exit_process(process, 1);
+       }
+    }
+
     apr_pool_destroy(ptemp);
 
     for (;;) {
@@ -698,6 +707,14 @@
             ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
                          0, NULL, "Configuration Failed\n");
             destroy_and_exit_process(process, 1);
+        }
+
+        for (s = server_conf; s; s = s->next) {
+            if ( ap_run_host_init(pconf, plog, ptemp, s) != OK) {
+                ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR,
+                             0, NULL, "Unable to initialize hosts\n");
+                destroy_and_exit_process(process, 1);
+            }
         }
 
         apr_pool_destroy(ptemp);
Index: server/config.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/config.c,v
retrieving revision 1.167
diff -u -r1.167 config.c
--- server/config.c     11 Oct 2003 06:37:45 -0000      1.167
+++ server/config.c     23 Dec 2003 16:49:03 -0000
@@ -109,6 +109,7 @@
 APR_HOOK_STRUCT(
            APR_HOOK_LINK(header_parser)
            APR_HOOK_LINK(pre_config)
+           APR_HOOK_LINK(host_init)
            APR_HOOK_LINK(post_config)
            APR_HOOK_LINK(open_logs)
            APR_HOOK_LINK(child_init)
@@ -124,6 +125,11 @@
                           (apr_pool_t *pconf, apr_pool_t *plog,
                            apr_pool_t *ptemp),
                           (pconf, plog, ptemp), OK, DECLINED)
+
+AP_IMPLEMENT_HOOK_RUN_ALL(int, host_init,
+                          (apr_pool_t *pconf, apr_pool_t *plog,
+                           apr_pool_t *ptemp, server_rec *s),
+                          (pconf, plog, ptemp, s), OK, DECLINED)
 
 AP_IMPLEMENT_HOOK_RUN_ALL(int, post_config,
                           (apr_pool_t *pconf, apr_pool_t *plog,
Index: modules/experimental/mod_example.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/mod_example.c,v
retrieving revision 1.44
diff -u -r1.44 mod_example.c
--- modules/experimental/mod_example.c  13 Dec 2003 15:41:33 -0000      1.44
+++ modules/experimental/mod_example.c  23 Dec 2003 16:49:21 -0000
@@ -859,8 +859,28 @@
 }
 
 /*
- * This routine is called to perform any module-specific fixing of header
- * fields, et cetera.  It is invoked just before any content-handler.
+ * This routine is called to do virtual host initialization.
+ * It is invoked just after the post_config phase.
+ *
+ * The return value is OK, DECLINED, or HTTP_mumble.  If we return OK, the
+ * server will still call any remaining modules with an handler for this
+ * phase.
+ */
+static int x_host_init(apr_pool_t *pconf, apr_pool_t *plog,
+                       apr_pool_t *ptemp, server_rec *s)
+{
+    /*
+     * Log the call and exit.
+     */
+    trace_add(s, NULL, NULL, 
+              apr_psprintf(ptemp, "x_host_init() for %s host %s",
+                                  s->is_virtual ? "virtual" : "", 
+                                  s->server_hostname));
+    return OK;
+}
+/*
+ * This routine is called to perform module initialization routines.
+ * It is invoked just after the open_logs phase.
  *
  * The return value is OK, DECLINED, or HTTP_mumble.  If we return OK, the
  * server will still call any remaining modules with an handler for this
@@ -872,13 +892,13 @@
     /*
      * Log the call and exit.
      */
-    trace_add(NULL, NULL, NULL, "x_post_config()");
+    trace_add(s, NULL, NULL, "x_post_config()");
     return OK;
 }
 
 /*
  * This routine is called to perform any module-specific log file
- * openings. It is invoked just before the post_config phase
+ * openings. It is invoked just before the post_config phase.
  *
  * The return value is OK, DECLINED, or HTTP_mumble.  If we return OK, the
  * server will still call any remaining modules with an handler for this
@@ -1304,8 +1324,9 @@
 static void x_register_hooks(apr_pool_t *p)
 {
     ap_hook_pre_config(x_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
-    ap_hook_post_config(x_post_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_open_logs(x_open_logs, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_post_config(x_post_config, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_host_init(x_host_init, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_child_init(x_child_init, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_handler(x_handler, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_quick_handler(x_quick_handler, NULL, NULL, APR_HOOK_MIDDLE);
Index: docs/manual/developer/modules.html.en
===================================================================
RCS file: /home/cvspublic/httpd-2.0/docs/manual/developer/modules.html.en,v
retrieving revision 1.13
diff -u -r1.13 modules.html.en
--- docs/manual/developer/modules.html.en       29 May 2003 16:12:50 -0000      1.13
+++ docs/manual/developer/modules.html.en       23 Dec 2003 16:55:31 -0000
@@ -206,6 +206,9 @@
         <dt><code>ap_hook_open_logs</code></dt>
         <dd>open any specified logs</dd>
 
+        <dt><code>ap_hook_host_init</code></dt>
+        <dd>initialize each (virtual) host</dd>
+
         <dt><code>ap_hook_auth_checker</code></dt>
         <dd>check if the resource requires authorization</dd>
 
Index: docs/manual/developer/modules.xml
===================================================================
RCS file: /home/cvspublic/httpd-2.0/docs/manual/developer/modules.xml,v
retrieving revision 1.4
diff -u -r1.4 modules.xml
--- docs/manual/developer/modules.xml   12 Apr 2003 15:04:45 -0000      1.4
+++ docs/manual/developer/modules.xml   23 Dec 2003 16:55:31 -0000
@@ -192,6 +192,9 @@
         <dt><code>ap_hook_open_logs</code></dt>
         <dd>open any specified logs</dd>
 
+        <dt><code>ap_hook_host_init</code></dt>
+        <dd>initialize each (virtual) host</dd>
+
         <dt><code>ap_hook_auth_checker</code></dt>
         <dd>check if the resource requires authorization</dd>
 

Reply via email to