Author: rjung
Date: Sun Oct 23 15:31:26 2011
New Revision: 1187906

URL: http://svn.apache.org/viewvc?rev=1187906&view=rev
Log:
Fix BZ 52056: HTTPD: JK request log does not always log
correct response status. Fixed by refactoring JK request
log to use the standard request log hook. (rjung)

Modified:
    tomcat/jk/trunk/native/apache-1.3/mod_jk.c
    tomcat/jk/trunk/native/apache-2.0/mod_jk.c
    tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml

Modified: tomcat/jk/trunk/native/apache-1.3/mod_jk.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-1.3/mod_jk.c?rev=1187906&r1=1187905&r2=1187906&view=diff
==============================================================================
--- tomcat/jk/trunk/native/apache-1.3/mod_jk.c (original)
+++ tomcat/jk/trunk/native/apache-1.3/mod_jk.c Sun Oct 23 15:31:26 2011
@@ -214,6 +214,15 @@ typedef struct
 
 
 /*
+ * Request specific configuration
+ */
+typedef struct
+{
+    rule_extension_t *rule_extensions;
+    int jk_handled;
+} jk_request_conf_t;
+
+/*
  * The "private", or subclass portion of the web server service class for
  * Apache 1.3.  An instance of this class is created for each request
  * handled.  See jk_service.h for details about the ws_service object in
@@ -729,7 +738,9 @@ static int init_ws_service(apache_privat
     if (conf->options & JK_OPT_FLUSHEADER)
         s->flush_header = 1;
 
-    e = (rule_extension_t *)ap_get_module_config(r->request_config, 
&jk_module);
+    jk_request_conf_t *rconf = (jk_request_conf_t 
*)ap_get_module_config(r->request_config,
+                                                                         
&jk_module);
+    e = rconf->rule_extensions;
     if (e) {
         s->extension.reply_timeout = e->reply_timeout;
         s->extension.sticky_ignore = e->sticky_ignore;
@@ -1431,7 +1442,7 @@ static const char *process_item(request_
     return cp ? cp : "-";
 }
 
-static void request_log_transaction(request_rec * r, jk_server_conf_t * conf)
+static int request_log_transaction(request_rec * r)
 {
     request_log_format_item *items;
     char *str, *s;
@@ -1439,7 +1450,21 @@ static void request_log_transaction(requ
     int len = 0;
     const char **strs;
     int *strl;
-    array_header *format = conf->format;
+    jk_server_conf_t *conf;
+    jk_request_conf_t *rconf;
+    array_header *format;
+
+    conf = (jk_server_conf_t *) ap_get_module_config(r->server->module_config,
+                                                     &jk_module);
+    format = conf->format;
+    if (format == NULL) {
+        return DECLINED;
+    }
+    rconf = (jk_request_conf_t *)ap_get_module_config(r->request_config,
+                                                      &jk_module);
+    if (rconf == NULL || rconf->jk_handled == JK_FALSE) {
+        return DECLINED;
+    }
 
     strs = ap_palloc(r->pool, sizeof(char *) * (format->nelts));
     strl = ap_palloc(r->pool, sizeof(int) * (format->nelts));
@@ -1457,6 +1482,7 @@ static void request_log_transaction(requ
     }
     *s = 0;
     jk_log(conf->log, JK_LOG_REQUEST, "%s", str);
+    return OK;
 }
 
 /*****************************************************************
@@ -2332,8 +2358,10 @@ static int jk_handler(request_rec * r)
         (jk_server_conf_t *) ap_get_module_config(r->server->
                                                   module_config,
                                                   &jk_module);
+    jk_request_conf_t *rconf;
+
     /* Retrieve the worker name stored by jk_translate() */
-    const char *worker_name = ap_table_get(r->notes, JK_NOTE_WORKER_NAME);
+    const char *worker_name;
     int rc;
 
     JK_TRACE_ENTER(conf->log);
@@ -2347,20 +2375,7 @@ static int jk_handler(request_rec * r)
         return DECLINED;
     }
 
-    if (r->proxyreq) {
-        jk_log(conf->log, JK_LOG_ERROR,
-               "Request has proxyreq flag set in mod_jk handler - aborting.");
-        JK_TRACE_EXIT(conf->log);
-        return HTTP_INTERNAL_SERVER_ERROR;
-    }
-
-    /* Set up r->read_chunked flags for chunked encoding, if present */
-    if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK))) {
-        jk_log(conf->log, JK_LOG_ERROR,
-               "Could not setup client_block for chunked encoding - aborting");
-        JK_TRACE_EXIT(conf->log);
-        return rc;
-    }
+    worker_name = ap_table_get(r->notes, JK_NOTE_WORKER_NAME);
 
     if (worker_name == NULL && r->handler && !strcmp(r->handler, JK_HANDLER)) {
         /* we may be here because of a manual directive ( that overrides
@@ -2402,6 +2417,30 @@ static int jk_handler(request_rec * r)
         }
     }
 
+    if (JK_IS_DEBUG_LEVEL(conf->log))
+       jk_log(conf->log, JK_LOG_DEBUG, "Into handler %s worker=%s"
+              " r->proxyreq=%d",
+              r->handler, STRNULL_FOR_NULL(worker_name), r->proxyreq);
+
+    rconf = (jk_request_conf_t *)ap_get_module_config(r->request_config,
+                                                      &jk_module);
+    rconf->jk_handled = JK_TRUE;
+
+    if (r->proxyreq) {
+        jk_log(conf->log, JK_LOG_ERROR,
+               "Request has proxyreq flag set in mod_jk handler - aborting.");
+        JK_TRACE_EXIT(conf->log);
+        return HTTP_INTERNAL_SERVER_ERROR;
+    }
+
+    /* Set up r->read_chunked flags for chunked encoding, if present */
+    if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK))) {
+        jk_log(conf->log, JK_LOG_ERROR,
+               "Could not setup client_block for chunked encoding - aborting");
+        JK_TRACE_EXIT(conf->log);
+        return rc;
+    }
+
     if (worker_name) {
         jk_worker_t *worker;
 
@@ -2471,9 +2510,6 @@ static int jk_handler(request_rec * r)
 #endif
                 if (s.route && *s.route)
                     ap_table_setn(r->notes, JK_NOTE_WORKER_ROUTE, s.route);
-                if (conf->format != NULL) {
-                    request_log_transaction(r, conf);
-                }
             }
             else {
                 jk_log(conf->log, JK_LOG_ERROR, "Could not init service"
@@ -3032,7 +3068,10 @@ static void jk_init(server_rec * s, ap_p
  */
 static int jk_translate(request_rec * r)
 {
-    ap_set_module_config(r->request_config, &jk_module, NULL);
+    jk_request_conf_t *rconf = ap_palloc(r->pool, sizeof(jk_request_conf_t));
+    rconf->jk_handled = JK_FALSE;
+    rconf->rule_extensions = NULL;
+    ap_set_module_config(r->request_config, &jk_module, rconf);
 
     if (!r->proxyreq) {
         jk_server_conf_t *conf =
@@ -3065,7 +3104,8 @@ static int jk_translate(request_rec * r)
                 rule_extension_t *e;
                 worker = map_uri_to_worker_ext(conf->uw_map, clean_uri,
                                                NULL, &e, NULL, conf->log);
-                ap_set_module_config(r->request_config, &jk_module, e);
+                rconf->rule_extensions = e;
+                ap_set_module_config(r->request_config, &jk_module, rconf);
             }
 
             /* Don't know the worker, ForwardDirectories is set, there is a
@@ -3365,7 +3405,7 @@ module MODULE_VAR_EXPORT jk_module = {
     NULL,                       /* [4] check access by host address */
     NULL,                       /* XXX [7] MIME type checker/setter */
     jk_fixups,                  /* [8] fixups */
-    NULL,                       /* [10] logger */
+    request_log_transaction,    /* [10] logger */
     NULL,                       /* [3] header parser */
     child_init_handler,         /* apache child process initializer */
     child_exit_handler,         /* apache child process exit/cleanup */

Modified: tomcat/jk/trunk/native/apache-2.0/mod_jk.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-2.0/mod_jk.c?rev=1187906&r1=1187905&r2=1187906&view=diff
==============================================================================
--- tomcat/jk/trunk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/jk/trunk/native/apache-2.0/mod_jk.c Sun Oct 23 15:31:26 2011
@@ -243,6 +243,15 @@ typedef struct
     server_rec *s;
 } jk_server_conf_t;
 
+/*
+ * Request specific configuration
+ */
+typedef struct
+{
+    rule_extension_t *rule_extensions;
+    int jk_handled;
+} jk_request_conf_t;
+
 struct apache_private_data
 {
     jk_pool_t p;
@@ -783,7 +792,9 @@ static int init_ws_service(apache_privat
     if (conf->options & JK_OPT_FLUSHEADER)
         s->flush_header = 1;
 
-    e = (rule_extension_t *)ap_get_module_config(r->request_config, 
&jk_module);
+    jk_request_conf_t *rconf = (jk_request_conf_t 
*)ap_get_module_config(r->request_config,
+                                                                         
&jk_module);
+    e = rconf->rule_extensions;
     if (e) {
         s->extension.reply_timeout = e->reply_timeout;
         s->extension.sticky_ignore = e->sticky_ignore;
@@ -1526,7 +1537,7 @@ static const char *process_item(request_
     return cp ? cp : "-";
 }
 
-static void request_log_transaction(request_rec * r, jk_server_conf_t * conf)
+static int request_log_transaction(request_rec * r)
 {
     request_log_format_item *items;
     char *str, *s;
@@ -1534,7 +1545,21 @@ static void request_log_transaction(requ
     int len = 0;
     const char **strs;
     int *strl;
-    apr_array_header_t *format = conf->format;
+    jk_server_conf_t *conf;
+    jk_request_conf_t *rconf;
+    apr_array_header_t *format;
+
+    conf = (jk_server_conf_t *) ap_get_module_config(r->server->module_config,
+                                                     &jk_module);
+    format = conf->format;
+    if (format == NULL) {
+        return DECLINED;
+    }
+    rconf = (jk_request_conf_t *)ap_get_module_config(r->request_config,
+                                                      &jk_module);
+    if (rconf == NULL || rconf->jk_handled == JK_FALSE) {
+        return DECLINED;
+    }
 
     strs = apr_palloc(r->pool, sizeof(char *) * (format->nelts));
     strl = apr_palloc(r->pool, sizeof(int) * (format->nelts));
@@ -1553,6 +1578,7 @@ static void request_log_transaction(requ
     *s = 0;
 
     jk_log(conf->log, JK_LOG_REQUEST, "%s", str);
+    return OK;
 
 }
 
@@ -2473,6 +2499,7 @@ static int jk_handler(request_rec * r)
 {
     const char *worker_name;
     jk_server_conf_t *xconf;
+    jk_request_conf_t *rconf;
     int rc, dmt = 1;
 
     /* We do DIR_MAGIC_TYPE here to make sure TC gets all requests, even
@@ -2502,13 +2529,8 @@ static int jk_handler(request_rec * r)
         JK_TRACE_EXIT(xconf->log);
         return DECLINED;
     }
-    worker_name = apr_table_get(r->notes, JK_NOTE_WORKER_NAME);
 
-    /* Set up r->read_chunked flags for chunked encoding, if present */
-    if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) != 
APR_SUCCESS) {
-        JK_TRACE_EXIT(xconf->log);
-        return rc;
-    }
+    worker_name = apr_table_get(r->notes, JK_NOTE_WORKER_NAME);
 
     if (worker_name == NULL) {
         /* we may be here because of a manual directive ( that overrides
@@ -2549,7 +2571,9 @@ static int jk_handler(request_rec * r)
                 rule_extension_t *e;
                 worker_name = map_uri_to_worker_ext(xconf->uw_map, r->uri,
                                                     NULL, &e, NULL, 
xconf->log);
-                ap_set_module_config(r->request_config, &jk_module, e);
+                rconf = (jk_request_conf_t 
*)ap_get_module_config(r->request_config,
+                                                                  &jk_module);
+                rconf->rule_extensions = e;
             }
 
             if (worker_name == NULL && worker_env.num_of_workers) {
@@ -2569,6 +2593,10 @@ static int jk_handler(request_rec * r)
               " r->proxyreq=%d",
               r->handler, STRNULL_FOR_NULL(worker_name), r->proxyreq);
 
+    rconf = (jk_request_conf_t *)ap_get_module_config(r->request_config,
+                                                      &jk_module);
+    rconf->jk_handled = JK_TRUE;
+
     /* If this is a proxy request, we'll notify an error */
     if (r->proxyreq) {
         jk_log(xconf->log, JK_LOG_INFO, "Proxy request for worker=%s"
@@ -2578,6 +2606,12 @@ static int jk_handler(request_rec * r)
         return HTTP_INTERNAL_SERVER_ERROR;
     }
 
+    /* Set up r->read_chunked flags for chunked encoding, if present */
+    if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) != 
APR_SUCCESS) {
+        JK_TRACE_EXIT(xconf->log);
+        return rc;
+    }
+
     if (worker_name) {
         jk_worker_t *worker = wc_get_worker_for_name(worker_name, xconf->log);
 
@@ -2678,10 +2712,6 @@ static int jk_handler(request_rec * r)
             if (s.route && *s.route)
                 apr_table_setn(r->notes, JK_NOTE_WORKER_ROUTE, s.route);
 
-            if (xconf->format != NULL) {
-                request_log_transaction(r, xconf);
-            }
-
             jk_close_pool(&private_data.p);
 
             if (rc > 0) {
@@ -2737,6 +2767,7 @@ static int jk_handler(request_rec * r)
         }
     }
 
+    rconf->jk_handled = JK_FALSE;
     JK_TRACE_EXIT(xconf->log);
     return DECLINED;
 }
@@ -3465,7 +3496,10 @@ static int jk_post_config(apr_pool_t * p
  */
 static int jk_translate(request_rec * r)
 {
-    ap_set_module_config(r->request_config, &jk_module, NULL);
+    jk_request_conf_t *rconf = apr_palloc(r->pool, sizeof(jk_request_conf_t));
+    rconf->jk_handled = JK_FALSE;
+    rconf->rule_extensions = NULL;
+    ap_set_module_config(r->request_config, &jk_module, rconf);
 
     if (!r->proxyreq) {
         jk_server_conf_t *conf =
@@ -3541,7 +3575,8 @@ static int jk_translate(request_rec * r)
                 rule_extension_t *e;
                 worker = map_uri_to_worker_ext(conf->uw_map, r->uri,
                                                NULL, &e, NULL, conf->log);
-                ap_set_module_config(r->request_config, &jk_module, e);
+                rconf->rule_extensions = e;
+                ap_set_module_config(r->request_config, &jk_module, rconf);
             }
 
             if (worker) {
@@ -3662,6 +3697,14 @@ static int jk_translate(request_rec * r)
 static int jk_map_to_storage(request_rec * r)
 {
 
+    jk_request_conf_t *rconf = ap_get_module_config(r->request_config, 
&jk_module);
+    if (rconf == NULL) {
+        jk_request_conf_t *rconf = apr_palloc(r->pool, 
sizeof(jk_request_conf_t));
+        rconf->jk_handled = JK_FALSE;
+        rconf->rule_extensions = NULL;
+        ap_set_module_config(r->request_config, &jk_module, rconf);
+    }
+
     if (!r->proxyreq && !apr_table_get(r->notes, JK_NOTE_WORKER_NAME)) {
         jk_server_conf_t *conf =
             (jk_server_conf_t *) ap_get_module_config(r->server->
@@ -3700,7 +3743,8 @@ static int jk_map_to_storage(request_rec
                 rule_extension_t *e;
                 worker = map_uri_to_worker_ext(conf->uw_map, r->uri,
                                                NULL, &e, NULL, conf->log);
-                ap_set_module_config(r->request_config, &jk_module, e);
+                rconf->rule_extensions = e;
+                ap_set_module_config(r->request_config, &jk_module, rconf);
             }
 
             if (worker) {
@@ -3776,11 +3820,12 @@ static int jk_map_to_storage(request_rec
 
 static void jk_register_hooks(apr_pool_t * p)
 {
-    ap_hook_handler(jk_handler, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_post_config(jk_post_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_child_init(jk_child_init, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_translate_name(jk_translate, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_map_to_storage(jk_map_to_storage, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_handler(jk_handler, NULL, NULL, APR_HOOK_MIDDLE);
+    ap_hook_log_transaction(request_log_transaction, NULL, NULL, 
APR_HOOK_MIDDLE);
 }
 
 module AP_MODULE_DECLARE_DATA jk_module = {

Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1187906&r1=1187905&r2=1187906&view=diff
==============================================================================
--- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Sun Oct 23 15:31:26 2011
@@ -44,6 +44,11 @@
   <br />
   <subsection name="Native">
     <changelog>
+      <fix>
+        <bug>52056</bug>: HTTPD: JK request log does not always log
+        correct response status. Fixed by refactoring JK request
+        log to use the standard request log hook. (rjung)
+      </fix>
       <add>
         HTTPD: Allow to choose a sticky worker using the environment
         variable JK_ROUTE. This can be used if sessions and routes



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to