You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by gl...@apache.org on 2003/03/14 14:36:36 UTC

cvs commit: jakarta-tomcat-connectors/jk/native/common jk_ajp_common.c jk_ajp_common.h

glenn       2003/03/14 05:36:35

  Modified:    jk/native CHANGES.txt
               jk/native/apache-2.0 mod_jk.c
               jk/native/common jk_ajp_common.c jk_ajp_common.h
  Log:
  Traced through the code to clean up error handling for when a client
  aborts a request.
  
  * The retry loop would continue to retry processing the request even
    if the client aborted.  Fixed this.
  
  * If the client aborts set the aborted flag in the conn_rec
  
  * If the handler is invoked and the conn_rec aborted flag is set
    return an HTTP_INTERNAL_SERVER_ERROR instead of processing a
    request for an aborted client.
  
  * Setting the conn_rec aborted flag and checking it prevents mod_jk
    from passing on a request to Tomcat for processing when the
    client has aborted the connection. An HTML page could use SSI to
    invoke multiple servlet's or JSP pages during a single request.
    There is no need to continue processing these if the client has
    aborted the connection.
  
  There was a bug in get_content_length() which would cause a SSI of
  a page which gets procesed by Tomcat to fail if the original client
  request was a POST.
  
  Cleaned up and reformatted code to 80 columns in source code files
  I worked on.
  
  Revision  Changes    Path
  1.11      +8 -2      jakarta-tomcat-connectors/jk/native/CHANGES.txt
  
  Index: CHANGES.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/CHANGES.txt,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- CHANGES.txt	28 Feb 2003 21:55:21 -0000	1.10
  +++ CHANGES.txt	14 Mar 2003 13:36:35 -0000	1.11
  @@ -11,7 +11,13 @@
         let Apache handle processing the error returned by Tomcat.
       * Added the load balancer sticky_session property. If set to 0
         requests with servlet SESSION ID's can be routed to any Tomcat
  -      worker. Default is 1, sessions are sticky.
  +      worker. Default is 1, sessions are sticky. [glenn]
  +    * Cleaned up detection and reporting of aborted client connections.
  +      This cleanup also makes sure that mod_jk does not pass any requests
  +      on to Tomcat if the remote client aborted its connection. [glenn]
  +    * Fixed a bug in Apache 2.0 which caused a POST request forwarded to
  +      Tomcat to fail if it generated SSI directives which were post
  +      processed by mod_include. [glenn]
   
   Changes with JK 1.2.2:
       * tomcat_trend.pl updated script to support changed logging of 
  
  
  
  1.67      +105 -105  jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c
  
  Index: mod_jk.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/apache-2.0/mod_jk.c,v
  retrieving revision 1.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- mod_jk.c	28 Feb 2003 17:58:39 -0000	1.66
  +++ mod_jk.c	14 Mar 2003 13:36:35 -0000	1.67
  @@ -103,14 +103,16 @@
   #define __arpa_inet_h__
   #define __sys_timeval_h__
   #endif
  +
  +#include "jk_ajp13.h"
   #include "jk_global.h"
  -#include "jk_util.h"
  +#include "jk_logger.h"
   #include "jk_map.h"
   #include "jk_pool.h"
   #include "jk_service.h"
  -#include "jk_worker.h"
   #include "jk_uri_worker_map.h"
  -#include "jk_logger.h"
  +#include "jk_util.h"
  +#include "jk_worker.h"
   
   #define JK_WORKER_ID        ("jakarta.worker")
   #define JK_HANDLER          ("jakarta-servlet")
  @@ -233,59 +235,57 @@
                                          const char * const *header_values,
                                          unsigned num_of_headers)
   {
  -    if(s && s->ws_private) {
  -        unsigned h;
  -        apache_private_data_t *p = s->ws_private;
  -        request_rec *r = p->r;
  -        
  -        if(!reason) {
  -            reason = "";
  -        }
  -        r->status = status;
  -        r->status_line = apr_psprintf(r->pool, "%d %s", status, reason);
  +    unsigned h;
  +    apache_private_data_t *p = s->ws_private;
  +    request_rec *r = p->r;
  +    
  +    if(!reason) {
  +        reason = "";
  +    }
  +    r->status = status;
  +    r->status_line = apr_psprintf(r->pool, "%d %s", status, reason);
   
  -        for(h = 0 ; h < num_of_headers ; h++) {
  -            if(!strcasecmp(header_names[h], "Content-type")) {
  -                char *tmp = apr_pstrdup(r->pool, header_values[h]);
  -                ap_content_type_tolower(tmp);
  -                /* It should be done like this in Apache 2.0 */
  -                /* This way, Apache 2.0 will be able to set the output filter */
  -                /* and it make jk useable with deflate using AddOutputFilterByType DEFLATE text/html */
  -                ap_set_content_type(r, tmp);
  -            } else if(!strcasecmp(header_names[h], "Location")) {
  +    for(h = 0 ; h < num_of_headers ; h++) {
  +        if(!strcasecmp(header_names[h], "Content-type")) {
  +            char *tmp = apr_pstrdup(r->pool, header_values[h]);
  +            ap_content_type_tolower(tmp);
  +            /* It should be done like this in Apache 2.0 */
  +            /* This way, Apache 2.0 will be able to set the output filter */
  +            /* and it make jk useable with deflate using
  +            /* AddOutputFilterByType DEFLATE text/html */
  +            ap_set_content_type(r, tmp);
  +        } else if(!strcasecmp(header_names[h], "Location")) {
   #ifdef AS400 
  -                /* Fix escapes in Location Header URL*/
  -                ap_fixup_escapes((char *)header_values[h], 
  -                strlen(header_values[h]), ap_hdrs_from_ascii);
  +            /* Fix escapes in Location Header URL*/
  +            ap_fixup_escapes((char *)header_values[h], 
  +            strlen(header_values[h]), ap_hdrs_from_ascii);
   #endif 
  -                apr_table_set(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            } else if(!strcasecmp(header_names[h], "Content-Length")) {
  -                apr_table_set(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            } else if(!strcasecmp(header_names[h], "Transfer-Encoding")) {
  -                apr_table_set(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            } else if(!strcasecmp(header_names[h], "Last-Modified")) {
  -                /*
  -                 * If the script gave us a Last-Modified header, we can't just
  -                 * pass it on blindly because of restrictions on future values.
  -                 */
  -                ap_update_mtime(r, ap_parseHTTPdate(header_values[h]));
  -                ap_set_last_modified(r);
  -            } else {                
  -                apr_table_add(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            }
  +            apr_table_set(r->headers_out, 
  +                          header_names[h], header_values[h]);
  +        } else if(!strcasecmp(header_names[h], "Content-Length")) {
  +            apr_table_set(r->headers_out, 
  +                          header_names[h], header_values[h]);
  +        } else if(!strcasecmp(header_names[h], "Transfer-Encoding")) {
  +            apr_table_set(r->headers_out, 
  +                          header_names[h], header_values[h]);
  +        } else if(!strcasecmp(header_names[h], "Last-Modified")) {
  +            /*
  +             * If the script gave us a Last-Modified header, we can't just
  +             * pass it on blindly because of restrictions on future values.
  +             */
  +            ap_update_mtime(r, ap_parseHTTPdate(header_values[h]));
  +            ap_set_last_modified(r);
  +        } else {                
  +            apr_table_add(r->headers_out, 
  +                          header_names[h], header_values[h]);
           }
  -
  -        /* this NOP function was removed in apache 2.0 alpha14 */
  -        /* ap_send_http_header(r); */
  -        p->response_started = JK_TRUE;
  -        
  -        return JK_TRUE;
       }
  -    return JK_FALSE;
  +
  +    /* this NOP function was removed in apache 2.0 alpha14 */
  +    /* ap_send_http_header(r); */
  +    p->response_started = JK_TRUE;
  +    
  +    return JK_TRUE;
   }
   
   /*
  @@ -454,7 +454,7 @@
   {
       if(r->clength > 0) {
           return r->clength;
  -    } else {
  +    } else if(r->main == NULL || r->main == r) {
           char *lenp = (char *)apr_table_get(r->headers_in, "Content-Length");
   
           if(lenp) {
  @@ -494,15 +494,15 @@
       s->remote_host  = NULL_FOR_EMPTY(s->remote_host);
       s->remote_addr  = NULL_FOR_EMPTY(r->connection->remote_ip);
   
  -    jk_log(main_log, JK_LOG_DEBUG, 
  -                 "agsp=%u agsn=%s hostn=%s shostn=%s cbsport=%d sport=%d \n",
  -                ap_get_server_port( r ),
  -                ap_get_server_name( r ),
  -                r->hostname,
  -                r->server->server_hostname,
  -                r->connection->base_server->port,
  -                r->server->port
  -                );
  +    jk_log(conf->log, JK_LOG_DEBUG, 
  +           "agsp=%u agsn=%s hostn=%s shostn=%s cbsport=%d sport=%d \n",
  +           ap_get_server_port( r ),
  +           ap_get_server_name( r ),
  +           r->hostname,
  +           r->server->server_hostname,
  +           r->connection->base_server->port,
  +           r->server->port
  +           );
   
       /* get server name */
       /* s->server_name= (char *)(r->hostname ? r->hostname : r->server->server_hostname); */
  @@ -977,7 +977,7 @@
       }
       *s = 0;
       
  -    jk_log(main_log, JK_LOG_REQUEST, str);
  +    jk_log(conf->log, JK_LOG_REQUEST, str);
   }
   
   /*****************************************************************
  @@ -1660,6 +1660,11 @@
       jk_server_conf_t *conf;
       int              rc,dmt=1;
   
  +    /* If the remote client has aborted, just return */
  +    if (r->connection->aborted) {
  +        return HTTP_INTERNAL_SERVER_ERROR;
  +    }
  +
       /* We do DIR_MAGIC_TYPE here to make sure TC gets all requests, even
        * if they are directory requests, in case there are no static files
        * visible to Apache and/or DirectoryIndex was not used. This is only
  @@ -1694,24 +1699,22 @@
                 I'm not sure how ). We also have a manual config directive that
                 explicitely give control to us. */
             worker_name=  worker_env.first_worker;
  -          jk_log(main_log, JK_LOG_DEBUG, 
  +          jk_log(xconf->log, JK_LOG_DEBUG, 
                    "Manual configuration for %s %s %d\n",
                    r->uri, worker_env.first_worker, worker_env.num_of_workers); 
         } else {
  -          worker_name = map_uri_to_worker(xconf->uw_map, r->uri, main_log);
  +          worker_name = map_uri_to_worker(xconf->uw_map, r->uri, xconf->log);
             if( worker_name == NULL ) 
                 worker_name=  worker_env.first_worker;
  -          jk_log(main_log, JK_LOG_DEBUG, 
  +          jk_log(xconf->log, JK_LOG_DEBUG, 
                    "Manual configuration for %s %d\n",
                    r->uri, worker_env.first_worker); 
         }
       }
   
  -    if (1) {
  -        jk_log(main_log, JK_LOG_DEBUG, "Into handler r->proxyreq=%d "
  -               "r->handler=%s r->notes=%d worker=%s\n", 
  -               r->proxyreq, r->handler, r->notes, worker_name); 
  -    }
  +    jk_log(xconf->log, JK_LOG_DEBUG, "Into handler r->proxyreq=%d "
  +           "r->handler=%s r->notes=%d worker=%s\n", 
  +           r->proxyreq, r->handler, r->notes, worker_name); 
   
       conf=(jk_server_conf_t *)ap_get_module_config(r->server->module_config, 
                                                     &jk_module);
  @@ -1723,7 +1726,7 @@
   
       if(conf && ! worker_name ) {
           /* Direct mapping ( via setHandler ). Try overrides */
  -        worker_name = map_uri_to_worker(conf->uw_map, r->uri, main_log);
  +        worker_name = map_uri_to_worker(conf->uw_map, r->uri, conf->log);
           if( ! worker_name ) {
               /* Since we are here, an explicit (native) mapping has been used */
               /* Use default worker */
  @@ -1735,7 +1738,7 @@
       }
         
       if(worker_name) {
  -        jk_worker_t *worker = wc_get_worker_for_name(worker_name, main_log);
  +        jk_worker_t *worker = wc_get_worker_for_name(worker_name, xconf->log);
   
           if(worker) {
           	struct timeval tv_begin,tv_end;
  @@ -1775,18 +1778,18 @@
           
           apr_pool_userdata_get( (void **)&end, "jk_thread_endpoint", tpool );
           if(end==NULL ) {
  -            worker->get_endpoint(worker, &end, main_log);
  +            worker->get_endpoint(worker, &end, xconf->log);
               apr_pool_userdata_set( end , "jk_thread_endpoint", 
                                      &jk_cleanup_endpoint,  tpool );
           }
   #else */
           /* worker->get_endpoint might fail if we are out of memory so check */
           /* and handle it */
  -        if (worker->get_endpoint(worker, &end, main_log))
  +        if (worker->get_endpoint(worker, &end, xconf->log))
   /* #endif */
           {   
               int is_recoverable_error = JK_FALSE;
  -                rc = end->service(end, &s, main_log, &is_recoverable_error);
  +            rc = end->service(end, &s, xconf->log, &is_recoverable_error);
   
               if (s.content_read < s.content_length ||
                   (s.is_chunked && ! s.no_more_chunks)) {
  @@ -1796,8 +1799,8 @@
                   * request data, consume and discard all further
                   * characters left to read from client
                   */
  -                    char *buff = apr_palloc(r->pool, 2048);
  -                    if (buff != NULL) {
  +                char *buff = apr_palloc(r->pool, 2048);
  +                if (buff != NULL) {
                       int rd;
                       while ((rd = ap_get_client_block(r, buff, 2048)) > 0) {
                           s.content_read += rd;
  @@ -1806,7 +1809,7 @@
               }
                                                                               
   /* #ifndef REUSE_WORKER */
  -            end->done(&end, main_log); 
  +            end->done(&end, xconf->log); 
   /* #endif */
                   }
                   else /* this means we couldn't get an endpoint */
  @@ -1833,18 +1836,22 @@
   
               jk_close_pool(&private_data.p);
   
  -            if(rc) {
  +            if (rc > 0) {
                   /* If tomcat returned no body and the status is not OK,
                      let apache handle the error code */
                   if( !r->sent_bodyct && r->status >= HTTP_BAD_REQUEST ) {
                       return r->status;
                   }
                   return OK;    /* NOT r->status, even if it has changed. */
  -            } else
  +            } else if (rc == JK_CLIENT_ERROR) {
  +                r->connection->aborted = 1;
                   return HTTP_INTERNAL_SERVER_ERROR;
  +            } else {
  +                return HTTP_INTERNAL_SERVER_ERROR;
  +            }
  +        } else {
  +            return HTTP_INTERNAL_SERVER_ERROR;
           }
  -	else
  -		return HTTP_INTERNAL_SERVER_ERROR;
   
       }
   
  @@ -1856,13 +1863,12 @@
   static apr_status_t jk_apr_pool_cleanup(void *data)
   {
       server_rec *s = data;
  -    
  -    while (NULL != s)
  -    {
  +
  +    while (NULL != s) {
           jk_server_conf_t *conf =
  -            (jk_server_conf_t *)ap_get_module_config(s->module_config, &jk_module);
  -    
  -    
  +            (jk_server_conf_t *)ap_get_module_config(s->module_config,
  +                                                     &jk_module);
  +
           if (conf)
           {
               wc_close(conf->log);
  @@ -1878,7 +1884,7 @@
           }
           s = s->next;
       }
  -	return APR_SUCCESS;
  +    return APR_SUCCESS;
   }
   
   /** Create default jk_config. XXX This is mostly server-independent,
  @@ -2042,7 +2048,8 @@
                   if (status != APR_SUCCESS) {
                       apr_strerror(status, error, 254);
                       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0,
  -                             NULL, "mod_jk: jk_log_to_file failed: %s\n",error);
  +                             NULL, "mod_jk: jk_log_to_file %s failed: %s\n",
  +                             what, error);
                   }
                   rv = apr_global_mutex_unlock(jk_log_lock);
                   if (rv != APR_SUCCESS) {           
  @@ -2083,7 +2090,6 @@
       if (main_log != NULL) {
           conf->log = main_log;
       }
  -
       if (conf->log_file == NULL) {
           return;
       }
  @@ -2130,12 +2136,6 @@
               main_log = conf->log;
           return;
       }
  -    if(jkl) {
  -        free(jkl);
  -    }
  -    if(flp) {
  -        free(flp);
  -    }
   
       exit(1);
   }
  @@ -2176,7 +2176,7 @@
               return;
           }
       }
  -    
  +
       /* we add the URI->WORKER MAP since workers using AJP14
          will feed it */
       worker_env.uri_to_worker = conf->uw_map;
  @@ -2185,7 +2185,7 @@
       if(wc_open(init_map, &worker_env, conf->log)) {
           ap_add_version_component(pconf, JK_EXPOSED_VERSION);
           return;
  -    }            
  +    }
       return;
   }
   
  @@ -2221,15 +2221,15 @@
                        "mod_jk: Could not set permissions on "
                        "jk_log_lock; check User and Group directives");
           return HTTP_INTERNAL_SERVER_ERROR;
  -    }      
  -#endif     
  -     
  +    }
  +#endif
  +
       /* step through the servers and
        * - open each jk logfile
        */    
       for (; s; s = s->next) {
           open_jklog(s, pconf);
  -    }      
  +    }
       return OK;
   }
   
  @@ -2254,7 +2254,7 @@
                          "Manually mapped, no need to call uri_to_worker\n");
                   return DECLINED;
               }
  -            worker = map_uri_to_worker(conf->uw_map, r->uri, main_log);
  +            worker = map_uri_to_worker(conf->uw_map, r->uri, conf->log);
   
               if(worker) {
                   r->handler=apr_pstrdup(r->pool,JK_HANDLER);
  
  
  
  1.35      +323 -174  jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c
  
  Index: jk_ajp_common.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- jk_ajp_common.c	17 Feb 2003 16:24:31 -0000	1.34
  +++ jk_ajp_common.c	14 Mar 2003 13:36:35 -0000	1.35
  @@ -118,23 +118,23 @@
       } else if(0 == strcmp(method, "TRACE")) {
           *sc = SC_M_TRACE;
       } else if(0 == strcmp(method, "PROPFIND")) {
  -    *sc = SC_M_PROPFIND;
  +        *sc = SC_M_PROPFIND;
       } else if(0 == strcmp(method, "PROPPATCH")) {
  -    *sc = SC_M_PROPPATCH;
  +        *sc = SC_M_PROPPATCH;
       } else if(0 == strcmp(method, "MKCOL")) {
  -    *sc = SC_M_MKCOL;
  +        *sc = SC_M_MKCOL;
       } else if(0 == strcmp(method, "COPY")) {
  -    *sc = SC_M_COPY;
  +        *sc = SC_M_COPY;
       } else if(0 == strcmp(method, "MOVE")) {
  -    *sc = SC_M_MOVE;
  +        *sc = SC_M_MOVE;
       } else if(0 == strcmp(method, "LOCK")) {
  -    *sc = SC_M_LOCK;
  +        *sc = SC_M_LOCK;
       } else if(0 == strcmp(method, "UNLOCK")) {
  -    *sc = SC_M_UNLOCK;
  +        *sc = SC_M_UNLOCK;
       } else if(0 == strcmp(method, "ACL")) {
  -    *sc = SC_M_ACL;
  +        *sc = SC_M_ACL;
       } else if(0 == strcmp(method, "REPORT")) {
  -    *sc = SC_M_REPORT;
  +        *sc = SC_M_REPORT;
       } else if(0 == strcmp(method, "VERSION-CONTROL")) {
           *sc = SC_M_VERSION_CONTROL;
       } else if(0 == strcmp(method, "CHECKIN")) {
  @@ -295,7 +295,9 @@
       jk_log(l, JK_LOG_DEBUG, "Into ajp_marshal_into_msgb\n");
   
       if (!sc_for_req_method(s->method, &method)) { 
  -        jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - No such method %s\n", s->method);
  +        jk_log(l, JK_LOG_ERROR,
  +               "Error ajp_marshal_into_msgb - No such method %s\n",
  +               s->method);
           return JK_FALSE;
       }
   
  @@ -310,7 +312,9 @@
           jk_b_append_byte(msg, (unsigned char)(s->is_ssl)) ||
           jk_b_append_int(msg, (unsigned short)(s->num_headers))) {
   
  -        jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the message begining\n");
  +        jk_log(l, JK_LOG_ERROR,
  +               "Error ajp_marshal_into_msgb - "
  +               "Error appending the message begining\n");
           return JK_FALSE;
       }
   
  @@ -319,18 +323,24 @@
   
           if (sc_for_req_header(s->headers_names[i], &sc)) {
               if (jk_b_append_int(msg, sc)) {
  -                jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the header name\n");
  +                jk_log(l, JK_LOG_ERROR,
  +                       "Error ajp_marshal_into_msgb - "
  +                       "Error appending the header name\n");
                   return JK_FALSE;
               }
           } else {
               if (jk_b_append_string(msg, s->headers_names[i])) {
  -                jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the header name\n");
  +                jk_log(l, JK_LOG_ERROR,
  +                       "Error ajp_marshal_into_msgb - "
  +                       "Error appending the header name\n");
                   return JK_FALSE;
               }
           }
           
           if (jk_b_append_string(msg, s->headers_values[i])) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the header value\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the header value\n");
               return JK_FALSE;
           }
       }
  @@ -339,7 +349,8 @@
           if (jk_b_append_byte(msg, SC_A_SECRET) ||
               jk_b_append_string(msg, s->secret)) {
               jk_log(l, JK_LOG_ERROR,
  -                   "Error ajp_marshal_into_msgb - Error appending secret\n");
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending secret\n");
               return JK_FALSE;
           }
       }
  @@ -347,14 +358,18 @@
       if (s->remote_user) {
           if (jk_b_append_byte(msg, SC_A_REMOTE_USER) ||
               jk_b_append_string(msg, s->remote_user)) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the remote user\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the remote user\n");
               return JK_FALSE;
           }
       }
       if (s->auth_type) {
           if (jk_b_append_byte(msg, SC_A_AUTH_TYPE) ||
               jk_b_append_string(msg, s->auth_type)) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the auth type\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the auth type\n");
               return JK_FALSE;
           }
       }
  @@ -365,21 +380,27 @@
   #else
               jk_b_append_string(msg, s->query_string)) {
   #endif
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the query string\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the query string\n");
               return JK_FALSE;
           }
       }
       if (s->jvm_route) {
           if (jk_b_append_byte(msg, SC_A_JVM_ROUTE) ||
               jk_b_append_string(msg, s->jvm_route)) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the jvm route\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the jvm route\n");
               return JK_FALSE;
           }
       }
       if (s->ssl_cert_len) {
           if (jk_b_append_byte(msg, SC_A_SSL_CERT) ||
               jk_b_append_string(msg, s->ssl_cert)) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the SSL certificates\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the SSL certificates\n");
               return JK_FALSE;
           }
       }
  @@ -387,14 +408,18 @@
       if (s->ssl_cipher) {
           if (jk_b_append_byte(msg, SC_A_SSL_CIPHER) ||
               jk_b_append_string(msg, s->ssl_cipher)) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the SSL ciphers\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the SSL ciphers\n");
               return JK_FALSE;
           }
       }
       if (s->ssl_session) {
           if (jk_b_append_byte(msg, SC_A_SSL_SESSION) ||
               jk_b_append_string(msg, s->ssl_session)) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the SSL session\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the SSL session\n");
               return JK_FALSE;
           }
       }
  @@ -407,7 +432,9 @@
       if (s->ssl_key_size != -1) {
           if (jk_b_append_byte(msg, SC_A_SSL_KEY_SIZE) ||
               jk_b_append_int(msg, (unsigned short) s->ssl_key_size)) {
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the SSL key size\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_marshal_into_msgb - "
  +                   "Error appending the SSL key size\n");
               return JK_FALSE;
           }
       }
  @@ -417,7 +444,9 @@
               if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE)       ||
                   jk_b_append_string(msg, s->attributes_names[i]) ||
                   jk_b_append_string(msg, s->attributes_values[i])) {
  -                jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending attribute %s=%s\n",
  +                jk_log(l, JK_LOG_ERROR,
  +                      "Error ajp_marshal_into_msgb - "
  +                      "Error appending attribute %s=%s\n",
                         s->attributes_names[i], s->attributes_values[i]);
                   return JK_FALSE;
               }
  @@ -425,7 +454,9 @@
       }
   
       if (jk_b_append_byte(msg, SC_A_ARE_DONE)) {
  -        jk_log(l, JK_LOG_ERROR, "Error ajp_marshal_into_msgb - Error appending the message end\n");
  +        jk_log(l, JK_LOG_ERROR,
  +               "Error ajp_marshal_into_msgb - "
  +               "Error appending the message end\n");
           return JK_FALSE;
       }
       
  @@ -469,7 +500,8 @@
       d->status = jk_b_get_int(msg);
   
       if (!d->status) {
  -        jk_log(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - Null status\n");
  +        jk_log(l, JK_LOG_ERROR,
  +               "Error ajp_unmarshal_response - Null status\n");
           return JK_FALSE;
       }
   
  @@ -480,12 +512,15 @@
   #endif
       }
   
  -    jk_log(l, JK_LOG_DEBUG, "ajp_unmarshal_response: status = %d\n", d->status);
  +    jk_log(l, JK_LOG_DEBUG,
  +           "ajp_unmarshal_response: status = %d\n", d->status);
   
       d->num_headers = jk_b_get_int(msg);
       d->header_names = d->header_values = NULL;
   
  -    jk_log(l, JK_LOG_DEBUG, "ajp_unmarshal_response: Number of headers is = %d\n", d->num_headers);
  +    jk_log(l, JK_LOG_DEBUG,
  +           "ajp_unmarshal_response: Number of headers is = %d\n",
  +           d->num_headers);
   
       if (d->num_headers) {
           d->header_names = jk_pool_alloc(p, sizeof(char *) * d->num_headers);
  @@ -500,15 +535,21 @@
                       jk_b_get_int(msg);
                       name = name & 0X00FF;
                       if (name <= SC_RES_HEADERS_NUM) {
  -                        d->header_names[i] = (char *)long_res_header_for_sc(name);
  +                        d->header_names[i] =
  +                            (char *)long_res_header_for_sc(name);
                       } else {
  -                        jk_log(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - No such sc (%d)\n", name);
  +                        jk_log(l, JK_LOG_ERROR,
  +                               "Error ajp_unmarshal_response - "
  +                               "No such sc (%d)\n",
  +                               name);
                           return JK_FALSE;
                       }
                   } else {
                       d->header_names[i] = (char *)jk_b_get_string(msg);
                       if (!d->header_names[i]) {
  -                        jk_log(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - Null header name\n");
  +                        jk_log(l, JK_LOG_ERROR,
  +                               "Error ajp_unmarshal_response - "
  +                               "Null header name\n");
                           return JK_FALSE;
                       }
   #if defined(AS400) || defined(_OSD_POSIX)
  @@ -520,7 +561,9 @@
   
                   d->header_values[i] = (char *)jk_b_get_string(msg);
                   if (!d->header_values[i]) {
  -                    jk_log(l, JK_LOG_ERROR, "Error ajp_unmarshal_response - Null header value\n");
  +                    jk_log(l, JK_LOG_ERROR,
  +                           "Error ajp_unmarshal_response - "
  +                           "Null header value\n");
                       return JK_FALSE;
                   }
   
  @@ -529,7 +572,8 @@
                                strlen(d->header_values[i]));
   #endif
   
  -                jk_log(l, JK_LOG_DEBUG, "ajp_unmarshal_response: Header[%d] [%s] = [%s]\n", 
  +                jk_log(l, JK_LOG_DEBUG,
  +                       "ajp_unmarshal_response: Header[%d] [%s] = [%s]\n", 
                          i,
                          d->header_names[i],
                          d->header_values[i]);
  @@ -565,7 +609,9 @@
   
       if (ae->sd > 0) { 
           jk_close_socket(ae->sd);
  -        jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::ajp_close_endpoint, closed sd = %d\n", ae->sd);
  +        jk_log(l, JK_LOG_DEBUG,
  +               "In jk_endpoint_t::ajp_close_endpoint, closed sd = %d\n",
  +               ae->sd);
           ae->sd = -1; /* just to avoid twice close */
       }
   
  @@ -608,10 +654,14 @@
   {
       unsigned attempt;
   
  -    for(attempt = 0 ; attempt < ae->worker->connect_retry_attempts ; attempt++) {
  -        ae->sd = jk_open_socket(&ae->worker->worker_inet_addr, JK_TRUE, ae->worker->keepalive, l);
  +    for(attempt = 0; attempt < ae->worker->connect_retry_attempts; attempt++) {
  +        ae->sd = jk_open_socket(&ae->worker->worker_inet_addr, JK_TRUE,
  +                                ae->worker->keepalive, l);
           if(ae->sd >= 0) {
  -            jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::ajp_connect_to_endpoint, connected sd = %d\n", ae->sd);
  +            jk_log(l, JK_LOG_DEBUG,
  +                   "In jk_endpoint_t::ajp_connect_to_endpoint, "
  +                   "connected sd = %d\n",
  +                   ae->sd);
   
                /* set last_access */
                ae->last_access = time(NULL);
  @@ -624,7 +674,8 @@
       }
   
       jk_log(l, JK_LOG_INFO,
  -           "Error connecting to tomcat. Tomcat is probably not started or is listenning on the wrong port. Failed errno = %d\n",
  +           "Error connecting to tomcat. Tomcat is probably not started or is "
  +           "listenning on the wrong port. Failed errno = %d\n",
              errno);
       return JK_FALSE;
   }
  @@ -646,7 +697,10 @@
           jk_dump_buff(l, JK_LOG_DEBUG, "sending to ajp14", msg);
       }
       else {
  -        jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::ajp_connection_tcp_send_message, unknown protocol %d, supported are AJP13/AJP14\n", ae->proto);
  +        jk_log(l, JK_LOG_ERROR,
  +               "In jk_endpoint_t::ajp_connection_tcp_send_message, "
  +               "unknown protocol %d, supported are AJP13/AJP14\n",
  +               ae->proto);
           return JK_FALSE;
       }
   
  @@ -671,14 +725,20 @@
       unsigned int  header;
   
       if ((ae->proto != AJP13_PROTO) && (ae->proto != AJP14_PROTO)) {
  -        jk_log(l, JK_LOG_ERROR, "ajp_connection_tcp_get_message: Can't handle unknown protocol %d\n", ae->proto);
  +        jk_log(l, JK_LOG_ERROR,
  +               "ajp_connection_tcp_get_message: "
  +               "Can't handle unknown protocol %d\n",
  +               ae->proto);
           return JK_FALSE;
       }
   
       rc = jk_tcp_socket_recvfull(ae->sd, head, AJP_HEADER_LEN);
   
       if(rc < 0) {
  -        jk_log(l, JK_LOG_ERROR, "ERROR: can't receive the response message from tomcat, network problems or tomcat is down. err=%d\n", rc);
  +        jk_log(l, JK_LOG_ERROR,
  +               "ERROR: can't receive the response message from tomcat, "
  +               "network problems or tomcat is down. err=%d\n",
  +               rc);
           return JK_FALSE;
       }
   
  @@ -687,22 +747,32 @@
       if (ae->proto == AJP13_PROTO) {
           if (header != AJP13_SW_HEADER) {
   
  -            if (header == AJP14_SW_HEADER)
  -                jk_log(l, JK_LOG_ERROR, "ajp_connection_tcp_get_message: Error - received AJP14 reply on an AJP13 connection\n");
  -            else
  -                jk_log(l, JK_LOG_ERROR, "ajp_connection_tcp_get_message: Error - Wrong message format 0x%04x\n", header);
  -
  +            if (header == AJP14_SW_HEADER) {
  +                jk_log(l, JK_LOG_ERROR,
  +                       "ajp_connection_tcp_get_message: "
  +                       "Error - received AJP14 reply on an AJP13 connection\n");
  +            } else {
  +                jk_log(l, JK_LOG_ERROR,
  +                       "ajp_connection_tcp_get_message: "
  +                       "Error - Wrong message format 0x%04x\n",
  +                       header);
  +            }
               return JK_FALSE;
           }
       }
       else if (ae->proto == AJP14_PROTO) {
           if (header != AJP14_SW_HEADER) {
   
  -            if (header == AJP13_SW_HEADER)
  -                jk_log(l, JK_LOG_ERROR, "ajp_connection_tcp_get_message: Error - received AJP13 reply on an AJP14 connection\n");
  -            else
  -                jk_log(l, JK_LOG_ERROR, "ajp_connection_tcp_get_message: Error - Wrong message format 0x%04x\n", header);
  -
  +            if (header == AJP13_SW_HEADER) {
  +                jk_log(l, JK_LOG_ERROR,
  +                       "ajp_connection_tcp_get_message: "
  +                       "Error - received AJP13 reply on an AJP14 connection\n");
  +            } else {
  +                jk_log(l, JK_LOG_ERROR,
  +                       "ajp_connection_tcp_get_message: "
  +                       "Error - Wrong message format 0x%04x\n",
  +                       header);
  +            }
               return JK_FALSE;
           }
       }   
  @@ -711,7 +781,9 @@
       msglen += (head[3] & 0xFF);
   
       if(msglen > jk_b_get_size(msg)) {
  -        jk_log(l, JK_LOG_ERROR, "ajp_connection_tcp_get_message: Error - Wrong message size %d %d\n",
  +        jk_log(l, JK_LOG_ERROR,
  +               "ajp_connection_tcp_get_message: "
  +               "Error - Wrong message size %d %d\n",
                  msglen, jk_b_get_size(msg));
           return JK_FALSE;
       }
  @@ -721,23 +793,26 @@
   
       rc = jk_tcp_socket_recvfull(ae->sd, jk_b_get_buff(msg), msglen);
       if(rc < 0) {
  -        jk_log(l, JK_LOG_ERROR, "ERROR: can't receive the response message from tomcat, network problems or tomcat is down %d\n", rc);
  +        jk_log(l, JK_LOG_ERROR,
  +               "ERROR: can't receive the response message from tomcat, "
  +               "network problems or tomcat is down %d\n",
  +               rc);
           return JK_FALSE;
       }
   
  -    if (ae->proto == AJP13_PROTO) 
  +    if (ae->proto == AJP13_PROTO) {
           jk_dump_buff(l, JK_LOG_DEBUG, "received from ajp13", msg);
  -    else if (ae->proto == AJP14_PROTO)
  +    } else if (ae->proto == AJP14_PROTO) {
           jk_dump_buff(l, JK_LOG_DEBUG, "received from ajp14", msg);
  -    
  +    }
       return JK_TRUE;
   }
   
   /*
    * Read all the data from the socket.
    *
  - * Socket API didn't garanty all the data will be kept in a single 
  - * read, so we must loop up to all awaited data are received 
  + * Socket API doesn't guaranty that all the data will be kept in a
  + * single read, so we must loop until all awaited data is received 
    */
   
   static int ajp_read_fully_from_server(jk_ws_service_t *s,
  @@ -748,7 +823,7 @@
       unsigned padded_len = len;
   
       if (s->is_chunked && s->no_more_chunks) {
  -    return 0;
  +        return 0;
       }
       if (s->is_chunked) {
           /* Corner case: buf must be large enough to hold next
  @@ -763,13 +838,14 @@
       while(rdlen < padded_len) {
           unsigned this_time = 0;
           if(!s->read(s, buf + rdlen, len - rdlen, &this_time)) {
  -            return -1;
  +            /* Remote Client read failed. */
  +            return JK_CLIENT_ERROR;
           }
   
           if(0 == this_time) {
  -        if (s->is_chunked) {
  -        s->no_more_chunks = 1; /* read no more */
  -        }
  +            if (s->is_chunked) {
  +                s->no_more_chunks = 1; /* read no more */
  +            }
               break;
           }
           rdlen += this_time;
  @@ -799,12 +875,14 @@
   
       /* Pick the max size since we don't know the content_length */
       if (r->is_chunked && len == 0) {
  -    len = AJP13_MAX_SEND_BODY_SZ;
  +        len = AJP13_MAX_SEND_BODY_SZ;
       }
   
       if ((len = ajp_read_fully_from_server(r, read_buf, len)) < 0) {
  -        jk_log(l, JK_LOG_ERROR, "ERROR: receiving data from server failed, the client aborted the connection or network errors.\n");
  -        return -1;
  +        jk_log(l, JK_LOG_INFO,
  +               "ERROR: receiving data from client failed. "
  +               "Connection aborted or network problems\n");
  +        return JK_CLIENT_ERROR;
       }
   
       if (!r->is_chunked) {
  @@ -812,13 +890,13 @@
       }
   
       if (len > 0) {
  -    /* Recipient recognizes empty packet as end of stream, not
  -       an empty body packet */
  +        /* Recipient recognizes empty packet as end of stream, not
  +           an empty body packet */
           if(0 != jk_b_append_int(msg, (unsigned short)len)) {
  -            jk_log(l, JK_LOG_ERROR, 
  +            jk_log(l, JK_LOG_INFO, 
                      "read_into_msg_buff: Error - jk_b_append_int failed\n");
  -            return -1;
  -    }
  +            return JK_CLIENT_ERROR;
  +        }
       }
   
       jk_b_set_len(msg, jk_b_get_len(msg) + len);
  @@ -850,8 +928,10 @@
       /*
        * First try to reuse open connections...
       */
  -    while ((ae->sd > 0) && ! ajp_connection_tcp_send_message(ae, op->request, l)) {
  -        jk_log(l, JK_LOG_INFO, "Error sending request try another pooled connection\n");
  +    while ((ae->sd > 0) &&
  +           !ajp_connection_tcp_send_message(ae, op->request, l)) {
  +        jk_log(l, JK_LOG_INFO,
  +               "Error sending request try another pooled connection\n");
           jk_close_socket(ae->sd);
           ae->sd = -1;
           ajp_reuse_connection(ae, l);
  @@ -862,16 +942,18 @@
        */
       if (ae->sd < 0) {
           if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
  -        /*
  -         * After we are connected, each error that we are going to
  -         * have is probably unrecoverable
  -         */
  -        if (!ajp_connection_tcp_send_message(ae, op->request, l)) {
  -            jk_log(l, JK_LOG_INFO, "Error sending request on a fresh connection\n");
  -            return JK_FALSE;
  -        }
  +            /*
  +             * After we are connected, each error that we are going to
  +             * have is probably unrecoverable
  +             */
  +            if (!ajp_connection_tcp_send_message(ae, op->request, l)) {
  +                jk_log(l, JK_LOG_INFO,
  +                       "Error sending request on a fresh connection\n");
  +                return JK_FALSE;
  +            }
           } else {
  -            jk_log(l, JK_LOG_INFO, "Error connecting to the Tomcat process.\n");
  +            jk_log(l, JK_LOG_INFO, 
  +                   "Error connecting to the Tomcat process.\n");
               return JK_FALSE;
           }
       }
  @@ -881,8 +963,10 @@
        * or Tomcat crashed. In any case we cannot recover this.
        */
   
  -    jk_log(l, JK_LOG_DEBUG, "ajp_send_request 2: request body to send %d - request body to resend %d\n", 
  -        ae->left_bytes_to_send, jk_b_get_len(op->reply) - AJP_HEADER_LEN);
  +    jk_log(l, JK_LOG_DEBUG,
  +           "ajp_send_request 2: "
  +           "request body to send %d - request body to resend %d\n", 
  +           ae->left_bytes_to_send, jk_b_get_len(op->reply) - AJP_HEADER_LEN);
   
       /*
        * POST recovery job is done here.
  @@ -898,15 +982,15 @@
               return JK_FALSE;
           }
       }
  -    else
  -    {
  -        /* We never sent any POST data and we check it we have to send at
  -         * least of block of data (max 8k). These data will be kept in reply
  +    else {
  +        /* We never sent any POST data and we check if we have to send at
  +         * least one block of data (max 8k). These data will be kept in reply
            * for resend if the remote Tomcat is down, a fact we will learn only
            * doing a read (not yet) 
            */
  -	/* || s->is_chunked - this can't be done here. The original protocol sends the first
  -	   chunk of post data ( based on Content-Length ), and that's what the java side expects.
  +	/* || s->is_chunked - this can't be done here. The original protocol
  +           sends the first chunk of post data ( based on Content-Length ),
  +           and that's what the java side expects.
   	   Sending this data for chunked would break other ajp13 serers.
   
   	   Note that chunking will continue to work - using the normal read.
  @@ -914,12 +998,13 @@
   
           if (ae->left_bytes_to_send > 0) {
               int len = ae->left_bytes_to_send;
  -            if (len > AJP13_MAX_SEND_BODY_SZ) 
  +            if (len > AJP13_MAX_SEND_BODY_SZ) {
                   len = AJP13_MAX_SEND_BODY_SZ;
  -                    if ((len = ajp_read_into_msg_buff(ae, s, op->post, len, l)) < 0) {
  +            }
  +            if ((len = ajp_read_into_msg_buff(ae, s, op->post, len, l)) < 0) {
                   /* the browser stop sending data, no need to recover */
                   op->recoverable = JK_FALSE;
  -                return JK_FALSE;
  +                return JK_CLIENT_ERROR;
               }
               s->content_read = len;
               if (!ajp_connection_tcp_send_message(ae, op->post, l)) {
  @@ -948,18 +1033,15 @@
               {
                   jk_res_data_t res;
                   if (!ajp_unmarshal_response(msg, &res, ae, l)) {
  -                    jk_log(l, JK_LOG_ERROR, "Error ajp_process_callback - ajp_unmarshal_response failed\n");
  +                    jk_log(l, JK_LOG_ERROR,
  +                           "Error ajp_process_callback - "
  +                           "ajp_unmarshal_response failed\n");
                       return JK_AJP13_ERROR;
                   }
  -                if (!r->start_response(r, 
  -                                       res.status, 
  -                                       res.msg, 
  -                                       (const char * const *)res.header_names,
  -                                       (const char * const *)res.header_values,
  -                                       res.num_headers)) {
  -                    jk_log(l, JK_LOG_ERROR, "Error ajp_process_callback - start_response failed\n");
  -                    return JK_CLIENT_ERROR;
  -                }
  +                r->start_response(r, res.status, res.msg, 
  +                                  (const char * const *)res.header_names,
  +                                  (const char * const *)res.header_values,
  +                                  res.num_headers);
               }
           break;
   
  @@ -967,7 +1049,9 @@
               {
                   unsigned len = (unsigned)jk_b_get_int(msg);
                   if(!r->write(r, jk_b_get_buff(msg) + jk_b_get_pos(msg), len)) {
  -                    jk_log(l, JK_LOG_ERROR, "ERROR sending data to client. Connection aborted or network problems\n");
  +                    jk_log(l, JK_LOG_INFO,
  +                           "ERROR sending data to client. "
  +                           "Connection aborted or network problems\n");
                       return JK_CLIENT_ERROR;
                   }
               }
  @@ -993,9 +1077,10 @@
                       return JK_AJP13_HAS_RESPONSE;
                   }                  
   
  -                jk_log(l, JK_LOG_ERROR, "ERROR reading POST data from client. "
  -                                        "Connection aborted or network problems\n");
  -                return JK_INTERNAL_ERROR;       
  +                jk_log(l, JK_LOG_INFO,
  +                       "ERROR reading POST data from client. "
  +                       "Connection aborted or network problems\n");
  +                return JK_CLIENT_ERROR;       
               }
           break;
   
  @@ -1017,7 +1102,8 @@
           break;
   
           default:
  -            jk_log(l, JK_LOG_ERROR, "Error ajp_process_callback - Invalid code: %d\n", code);
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error ajp_process_callback - Invalid code: %d\n", code);
               return JK_AJP13_ERROR;
       }
       
  @@ -1048,7 +1134,9 @@
           int rc = 0;
   
           if(!ajp_connection_tcp_get_message(p, op->reply, l)) {
  -            jk_log(l, JK_LOG_ERROR, "Error reading reply from tomcat. Tomcat is down or network problems.\n");
  +            jk_log(l, JK_LOG_ERROR,
  +                   "Error reading reply from tomcat. "
  +                   "Tomcat is down or network problems.\n");
               /* we just can't recover, unset recover flag */
               return JK_FALSE;
           }
  @@ -1056,12 +1144,12 @@
           rc = ajp_process_callback(op->reply, op->post, p, s, l);
   
           /* no more data to be sent, fine we have finish here */
  -            if(JK_AJP13_END_RESPONSE == rc)
  -                return JK_TRUE;
  -            else if(JK_AJP13_HAS_RESPONSE == rc) {
  +        if(JK_AJP13_END_RESPONSE == rc) {
  +            return JK_TRUE;
  +        } else if(JK_AJP13_HAS_RESPONSE == rc) {
               /* 
                * in upload-mode there is no second chance since
  -             * we may have allready send part of uploaded data 
  +             * we may have allready sent part of the uploaded data 
                * to Tomcat.
                * In this case if Tomcat connection is broken we must 
                * abort request and indicate error.
  @@ -1070,26 +1158,29 @@
                */
               op->recoverable = JK_FALSE; 
               rc = ajp_connection_tcp_send_message(p, op->post, l);
  -                if (rc < 0) {
  -                jk_log(l, JK_LOG_ERROR, "Error sending request data %d. Tomcat is down or network problems.\n", rc);
  -                        return JK_FALSE;
  +            if (rc < 0) {
  +                jk_log(l, JK_LOG_ERROR,
  +                       "Error sending request data %d. "
  +                       "Tomcat is down or network problems.\n",
  +                       rc);
  +                return JK_FALSE;
               }
           } else if(JK_FATAL_ERROR == rc) {
  -          /*
  -           * we won't be able to gracefully recover from this so
  -           * set recoverable to false and get out.
  -           */
  +            /*
  +             * we won't be able to gracefully recover from this so
  +             * set recoverable to false and get out.
  +             */
               op->recoverable = JK_FALSE;
               return JK_FALSE;
           } else if(JK_CLIENT_ERROR == rc) {
  -                  /*
  -                   * Client has stop talking to us, so get out.
  -                   * We assume this isn't our fault, so just a normal exit.
  -                   * In most (all?)  cases, the ajp13_endpoint::reuse will still be
  -                   * false here, so this will be functionally the same as an
  -                   * un-recoverable error.  We just won't log it as such.
  -                   */
  -                return JK_TRUE;
  +            /*
  +             * Client has stop talking to us, so get out.
  +             * We assume this isn't our fault, so just a normal exit.
  +             * In most (all?)  cases, the ajp13_endpoint::reuse will still be
  +             * false here, so this will be functionally the same as an
  +             * un-recoverable error.  We just won't log it as such.
  +             */
  +            return JK_CLIENT_ERROR;
           } else if(rc < 0) {
               return (JK_FALSE); /* XXX error */
           }
  @@ -1110,7 +1201,7 @@
                   jk_logger_t     *l,
                   int             *is_recoverable_error)
   {
  -    int i;
  +    int i, err;
       ajp_operation_t oper;
       ajp_operation_t *op = &oper;
   
  @@ -1137,7 +1228,8 @@
           p->reuse = JK_FALSE;
           *is_recoverable_error = JK_TRUE;
   
  -                s->secret = p->worker->secret;
  +        s->secret = p->worker->secret;
  +
           /* 
            * We get here initial request (in reqmsg)
            */
  @@ -1150,21 +1242,25 @@
            * JK_RETRIES could be replaced by the number of workers in
            * a load-balancing configuration 
            */
  -        for (i = 0; i < JK_RETRIES; i++)
  -        {
  +        for (i = 0; i < JK_RETRIES; i++) {
               /*
                * We're using reqmsg which hold initial request
                * if Tomcat is stopped or restarted, we will pass reqmsg
                * to next valid tomcat. 
                */
  -            if (ajp_send_request(e, s, l, p, op)) {
  +            err = ajp_send_request(e, s, l, p, op);
  +            if (err == JK_TRUE) {
   
  -                /* If we have the no recoverable error, it's probably because the sender (browser)
  -                 * stop sending data before the end (certainly in a big post)
  +                /* If we have the no recoverable error, it's probably because
  +                 * the sender (browser) stopped sending data before the end
  +                 * (certainly in a big post)
                    */
                   if (! op->recoverable) {
                       *is_recoverable_error = JK_FALSE;
  -                    jk_log(l, JK_LOG_ERROR, "ERROR: sending request to tomcat failed without recovery in send loop %d\n", i);
  +                    jk_log(l, JK_LOG_ERROR,
  +                           "ERROR: sending request to tomcat failed "
  +                           "without recovery in send loop %d\n",
  +                           i);
                       return JK_FALSE;
                   }
   
  @@ -1172,38 +1268,65 @@
                   *is_recoverable_error = JK_TRUE;
                   op->recoverable = JK_TRUE;
   
  -                if (ajp_get_reply(e, s, l, p, op))
  +                err = ajp_get_reply(e, s, l, p, op);
  +                if (err > 0) {
                       return (JK_TRUE);
  +                }
   
  -                /* if we can't get reply, check if no recover flag was set 
  -                 * if is_recoverable_error is cleared, we have started received 
  -                 * upload data and we must consider that operation is no more recoverable
  -                 */
  -                if (! op->recoverable) {
  -                    *is_recoverable_error = JK_FALSE;
  -                    jk_log(l, JK_LOG_ERROR, "ERROR: receiving reply from tomcat failed without recovery in send loop %d\n", i);
  -                    return JK_FALSE;
  +                if (err != JK_CLIENT_ERROR) {
  +                    /* if we can't get reply, check if no recover flag was set 
  +                     * if is_recoverable_error is cleared, we have started
  +                     * receiving upload data and we must consider that
  +                     * operation is no more recoverable
  +                     */
  +                    if (! op->recoverable) {
  +                        *is_recoverable_error = JK_FALSE;
  +                        jk_log(l, JK_LOG_ERROR,
  +                               "ERROR: receiving reply from tomcat failed "
  +                               "without recovery in send loop %d\n",
  +                               i);
  +                        return JK_FALSE;
  +                    }
  +                    jk_log(l, JK_LOG_ERROR,
  +                           "ERROR: Receiving from tomcat failed, "
  +                           "recoverable operation. err=%d\n",
  +                           i);
                   }
  -                
  -                jk_log(l, JK_LOG_ERROR, "ERROR: Receiving from tomcat failed, recoverable operation. err=%d\n", i);
               }
  -            else
  -                jk_log(l, JK_LOG_INFO, "sending request to tomcat failed in send loop. err=%d\n", i);
  -        
  +
               jk_close_socket(p->sd);
  -            p->sd = -1;
  +            p->sd = -1;         
               ajp_reuse_connection(p, l);
  +
  +            if (err == JK_CLIENT_ERROR) {
  +                *is_recoverable_error = JK_FALSE;
  +                jk_log(l, JK_LOG_ERROR,
  +                       "ERROR: "
  +                       "Client connection aborted or network problems\n");
  +                return JK_CLIENT_ERROR;
  +            }
  +            else {
  +                jk_log(l, JK_LOG_INFO,
  +                       "sending request to tomcat failed in send loop. "
  +                       "err=%d\n",
  +                       i);
  +            }
  +
           }
           
           /* Log the error only once per failed request. */
  -        jk_log(l, JK_LOG_ERROR, "Error connecting to tomcat. Tomcat is probably not started or is listenning on the wrong port. Failed errno = %d\n", errno);
  +        jk_log(l, JK_LOG_ERROR,
  +               "Error connecting to tomcat. Tomcat is probably not started "
  +               "or is listening on the wrong port. Failed errno = %d\n",
  +               errno);
   
       } else {
  -            jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, NULL parameters\n");
  +        jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, NULL parameters\n");
       }
   
       return JK_FALSE;
   }
  +
   /*
    * Validate the worker (ajp13/ajp14)
    */
  @@ -1228,7 +1351,8 @@
           host = AJP14_DEF_HOST;
       }
       else {
  -        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::validate unknown protocol %d\n", proto);
  +        jk_log(l, JK_LOG_DEBUG,
  +               "In jk_worker_t::validate unknown protocol %d\n", proto);
           return JK_FALSE;
       } 
   
  @@ -1237,15 +1361,20 @@
           port = jk_get_worker_port(props, p->name, port);
           host = jk_get_worker_host(props, p->name, host);
   
  -        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::validate for worker %s contact is %s:%d\n", p->name, host, port);
  +        jk_log(l, JK_LOG_DEBUG,
  +              "In jk_worker_t::validate for worker %s contact is %s:%d\n",
  +               p->name, host, port);
   
           if(port > 1024 && host) {
               if(jk_resolve(host, (short)port, &p->worker_inet_addr)) {
                   return JK_TRUE;
               }
  -            jk_log(l, JK_LOG_ERROR, "ERROR: can't resolve tomcat address %s\n", host);
  +            jk_log(l, JK_LOG_ERROR,
  +                   "ERROR: can't resolve tomcat address %s\n", host);
           }
  -        jk_log(l, JK_LOG_ERROR, "ERROR: invalid host and port %s %d\n", (( host==NULL ) ? "NULL" : host ), port);
  +        jk_log(l, JK_LOG_ERROR,
  +               "ERROR: invalid host and port %s %d\n",
  +               (( host==NULL ) ? "NULL" : host ), port);
       } else {
           jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, NULL parameters\n");
       }
  @@ -1274,18 +1403,24 @@
           cache = AJP13_DEF_CACHE_SZ;
       }
       else {
  -        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::init, unknown protocol %d\n", proto);
  +        jk_log(l, JK_LOG_DEBUG,
  +               "In jk_worker_t::init, unknown protocol %d\n", proto);
           return JK_FALSE;
       }
   
       if (pThis && pThis->worker_private) {
           ajp_worker_t *p = pThis->worker_private;
           int cache_sz = jk_get_worker_cache_size(props, p->name, cache);
  -        int socket_timeout = jk_get_worker_socket_timeout(props, p->name, AJP13_DEF_TIMEOUT);
  -        int socket_keepalive = jk_get_worker_socket_keepalive(props, p->name, JK_FALSE);
  -        int cache_timeout = jk_get_worker_cache_timeout(props, p->name, AJP_DEF_CACHE_TIMEOUT);
  -
  -        jk_log(l, JK_LOG_DEBUG, "In jk_worker_t::init, setting socket timeout to %d\n", socket_timeout);
  +        int socket_timeout =
  +           jk_get_worker_socket_timeout(props, p->name, AJP13_DEF_TIMEOUT);
  +        int socket_keepalive =
  +            jk_get_worker_socket_keepalive(props, p->name, JK_FALSE);
  +        int cache_timeout =
  +            jk_get_worker_cache_timeout(props, p->name, AJP_DEF_CACHE_TIMEOUT);
  +
  +        jk_log(l, JK_LOG_DEBUG,
  +               "In jk_worker_t::init, setting socket timeout to %d\n",
  +               socket_timeout);
           p->socket_timeout = socket_timeout;
           p->keepalive = socket_keepalive;
           p->cache_timeout = cache_timeout;
  @@ -1298,7 +1433,8 @@
           p->ep_cache_sz = 0;
           p->ep_mincache_sz = 0;
           if (cache_sz > 0) {
  -            p->ep_cache = (ajp_endpoint_t **)malloc(sizeof(ajp_endpoint_t *) * cache_sz);
  +            p->ep_cache =
  +                (ajp_endpoint_t **)malloc(sizeof(ajp_endpoint_t *) * cache_sz);
               if(p->ep_cache) {
                   int i;
                   p->ep_cache_sz = cache_sz;
  @@ -1329,7 +1465,9 @@
   
           free(aw->name);
   
  -        jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::destroy up to %d endpoint to close\n", aw->ep_cache_sz);
  +        jk_log(l, JK_LOG_DEBUG,
  +               "Into jk_worker_t::destroy up to %d endpoint to close\n",
  +               aw->ep_cache_sz);
   
           if(aw->ep_cache_sz) {
               unsigned i;
  @@ -1380,13 +1518,16 @@
                       }
                       JK_LEAVE_CS(&w->cs, rc);
                       if(i < w->ep_cache_sz) {
  -                        jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done, recycling connection\n");
  +                        jk_log(l, JK_LOG_DEBUG,
  +                               "Into jk_endpoint_t::done, "
  +                               "recycling connection\n");
                           return JK_TRUE;
                       }
                   }
               }
           }
  -        jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done, closing connection %d\n", reuse_ep);
  +        jk_log(l, JK_LOG_DEBUG,
  +               "Into jk_endpoint_t::done, closing connection %d\n", reuse_ep);
           ajp_close_endpoint(p, l);
           *e = NULL;
   
  @@ -1428,7 +1569,7 @@
                   if (aw->cache_timeout) {
                       for ( ; i < aw->ep_cache_sz ; i++) {
                           if (aw->ep_cache[i]) {
  -                            unsigned elapsed = (unsigned)(now - ae->last_access);
  +                            unsigned elapsed = (unsigned)(now-ae->last_access);
                               if (elapsed > aw->cache_timeout) {
                                   jk_log(l, JK_LOG_DEBUG, 
                                       "In jk_endpoint_t::ajp_get_endpoint," \
  @@ -1446,11 +1587,17 @@
                           /* Handle timeouts for open sockets */
                           unsigned elapsed = (unsigned)(now - ae->last_access);
                           ae->last_access = now;
  -                        jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::ajp_get_endpoint, time elapsed since last request = %d seconds\n", elapsed);
  -                        if (aw->socket_timeout > 0 && elapsed > aw->socket_timeout) {
  +                        jk_log(l, JK_LOG_DEBUG,
  +                              "In jk_endpoint_t::ajp_get_endpoint, "
  +                              "time elapsed since last request = %d seconds\n",
  +                               elapsed);
  +                        if (aw->socket_timeout > 0 &&
  +                            elapsed > aw->socket_timeout) {
                               jk_close_socket(ae->sd);
                               jk_log(l, JK_LOG_DEBUG, 
  -                                   "In jk_endpoint_t::ajp_get_endpoint, reached socket timeout, closed sd = %d\n", ae->sd);
  +                                   "In jk_endpoint_t::ajp_get_endpoint, "
  +                                   "reached socket timeout, closed sd = %d\n",
  +                                    ae->sd);
                               ae->sd = -1; /* just to avoid twice close */
                           }
                       }
  @@ -1474,9 +1621,11 @@
               *je = &ae->endpoint;
               return JK_TRUE;
           }
  -        jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, malloc failed\n");
  +        jk_log(l, JK_LOG_ERROR,
  +              "In jk_worker_t::get_endpoint, malloc failed\n");
       } else {
  -        jk_log(l, JK_LOG_ERROR, "In jk_worker_t::get_endpoint, NULL parameters\n");
  +        jk_log(l, JK_LOG_ERROR,
  +               "In jk_worker_t::get_endpoint, NULL parameters\n");
       }
   
       return JK_FALSE;
  
  
  
  1.18      +2 -2      jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.h
  
  Index: jk_ajp_common.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.h,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- jk_ajp_common.h	4 Sep 2002 11:31:33 -0000	1.17
  +++ jk_ajp_common.h	14 Mar 2003 13:36:35 -0000	1.18
  @@ -302,7 +302,7 @@
    
   
   /*
  - * endpoint, the remote which will does the work
  + * endpoint, the remote connector which does the work
    */
   struct ajp_endpoint {
       ajp_worker_t *worker;
  
  
  

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


Re: cvs commit: jakarta-tomcat-connectors/jk/native/common jk_ajp_common.c jk_ajp_common.h

Posted by Glenn Nielsen <gl...@mail.more.net>.

Henri Gomez wrote:
> glenn@apache.org wrote:
> 
>> glenn       2003/03/14 05:36:35
>>
>>   Modified:    jk/native CHANGES.txt
>>                jk/native/apache-2.0 mod_jk.c
>>                jk/native/common jk_ajp_common.c jk_ajp_common.h
>>   Log:
>>   Traced through the code to clean up error handling for when a client
>>   aborts a request.
>>     * The retry loop would continue to retry processing the request even
>>     if the client aborted.  Fixed this.
>>     * If the client aborts set the aborted flag in the conn_rec
>>     * If the handler is invoked and the conn_rec aborted flag is set
>>     return an HTTP_INTERNAL_SERVER_ERROR instead of processing a
>>     request for an aborted client.
>>     * Setting the conn_rec aborted flag and checking it prevents mod_jk
>>     from passing on a request to Tomcat for processing when the
>>     client has aborted the connection. An HTML page could use SSI to
>>     invoke multiple servlet's or JSP pages during a single request.
>>     There is no need to continue processing these if the client has
>>     aborted the connection.
>>     There was a bug in get_content_length() which would cause a SSI of
>>   a page which gets procesed by Tomcat to fail if the original client
>>   request was a POST.
>>     Cleaned up and reformatted code to 80 columns in source code files
>>   I worked on.
> 
> 
> Great work (applause)
> 

Thanks. :-)

Kind of had to if I wanted to start upgrading our production systems to
Apache 2.0.

Glenn

----------------------------------------------------------------------
Glenn Nielsen             glenn@more.net | /* Spelin donut madder    |
MOREnet System Programming               |  * if iz ina coment.      |
Missouri Research and Education Network  |  */                       |
----------------------------------------------------------------------


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


Re: cvs commit: jakarta-tomcat-connectors/jk/native/common jk_ajp_common.c jk_ajp_common.h

Posted by Henri Gomez <hg...@apache.org>.
glenn@apache.org wrote:
> glenn       2003/03/14 05:36:35
> 
>   Modified:    jk/native CHANGES.txt
>                jk/native/apache-2.0 mod_jk.c
>                jk/native/common jk_ajp_common.c jk_ajp_common.h
>   Log:
>   Traced through the code to clean up error handling for when a client
>   aborts a request.
>   
>   * The retry loop would continue to retry processing the request even
>     if the client aborted.  Fixed this.
>   
>   * If the client aborts set the aborted flag in the conn_rec
>   
>   * If the handler is invoked and the conn_rec aborted flag is set
>     return an HTTP_INTERNAL_SERVER_ERROR instead of processing a
>     request for an aborted client.
>   
>   * Setting the conn_rec aborted flag and checking it prevents mod_jk
>     from passing on a request to Tomcat for processing when the
>     client has aborted the connection. An HTML page could use SSI to
>     invoke multiple servlet's or JSP pages during a single request.
>     There is no need to continue processing these if the client has
>     aborted the connection.
>   
>   There was a bug in get_content_length() which would cause a SSI of
>   a page which gets procesed by Tomcat to fail if the original client
>   request was a POST.
>   
>   Cleaned up and reformatted code to 80 columns in source code files
>   I worked on.

Great work (applause)



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