You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rj...@apache.org on 2011/07/29 23:41:02 UTC

svn commit: r1152379 - in /httpd/httpd/trunk: CHANGES modules/proxy/ajp.h modules/proxy/ajp_header.c modules/proxy/mod_proxy_ajp.c

Author: rjung
Date: Fri Jul 29 21:41:00 2011
New Revision: 1152379

URL: http://svn.apache.org/viewvc?rev=1152379&view=rev
Log:
mod_proxy_ajp: Respect "reuse" flag in END_REPONSE
packets.

Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/modules/proxy/ajp.h
    httpd/httpd/trunk/modules/proxy/ajp_header.c
    httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1152379&r1=1152378&r2=1152379&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Fri Jul 29 21:41:00 2011
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.3.14
 
+  *) mod_proxy_ajp: Respect "reuse" flag in END_REPONSE packets.
+     [Rainer Jung]
+
   *) mod_proxy: enable absolute URLs to be rewritten with ProxyPassReverse,
      e.g. to reverse proxy "Location: https://other-internal-server/login"
      [Nick Kew]

Modified: httpd/httpd/trunk/modules/proxy/ajp.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/ajp.h?rev=1152379&r1=1152378&r2=1152379&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/ajp.h (original)
+++ httpd/httpd/trunk/modules/proxy/ajp.h Fri Jul 29 21:41:00 2011
@@ -470,6 +470,17 @@ apr_status_t  ajp_parse_data(request_rec
                              apr_uint16_t *len, char **ptr);
 
 
+/**
+ * Check the reuse flag in CMD_AJP13_END_RESPONSE
+ * @param r         current request
+ * @param msg       AJP message
+ * @param reuse     returned reuse flag
+ * @return          APR_SUCCESS or error
+ */
+apr_status_t ajp_parse_reuse(request_rec *r, ajp_msg_t *msg,
+                             apr_byte_t *reuse);
+
+
 /** 
  * Handle the CPING/CPONG messages
  * @param sock      backend socket

Modified: httpd/httpd/trunk/modules/proxy/ajp_header.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/ajp_header.c?rev=1152379&r1=1152378&r2=1152379&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/ajp_header.c (original)
+++ httpd/httpd/trunk/modules/proxy/ajp_header.c Fri Jul 29 21:41:00 2011
@@ -712,7 +712,8 @@ apr_status_t ajp_parse_header(request_re
     }
     if (result != CMD_AJP13_SEND_HEADERS) {
         ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
-               "ajp_parse_headers: wrong type %02x expecting 0x04", result);
+               "ajp_parse_headers: wrong type 0x%02x expecting 0x%02x",
+               result, CMD_AJP13_SEND_HEADERS);
         return AJP_EBAD_HEADER;
     }
     return ajp_unmarshal_response(msg, r, conf);
@@ -734,7 +735,8 @@ apr_status_t  ajp_parse_data(request_rec
     }
     if (result != CMD_AJP13_SEND_BODY_CHUNK) {
         ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
-               "ajp_parse_data: wrong type %02x expecting 0x03", result);
+               "ajp_parse_data: wrong type 0x%02x expecting 0x%02x",
+               result, CMD_AJP13_SEND_BODY_CHUNK);
         return AJP_EBAD_HEADER;
     }
     rc = ajp_msg_get_uint16(msg, len);
@@ -762,6 +764,28 @@ apr_status_t  ajp_parse_data(request_rec
     return APR_SUCCESS;
 }
 
+/* Check the reuse flag in CMD_AJP13_END_RESPONSE */
+apr_status_t ajp_parse_reuse(request_rec *r, ajp_msg_t *msg,
+                             apr_byte_t *reuse)
+{
+    apr_byte_t result;
+    apr_status_t rc;
+
+    rc = ajp_msg_get_uint8(msg, &result);
+    if (rc != APR_SUCCESS) {
+        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
+               "ajp_parse_reuse: ajp_msg_get_byte failed");
+        return rc;
+    }
+    if (result != CMD_AJP13_END_RESPONSE) {
+        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
+               "ajp_parse_reuse: wrong type 0x%02x expecting 0x%02x",
+               result, CMD_AJP13_END_RESPONSE);
+        return AJP_EBAD_HEADER;
+    }
+    return ajp_msg_get_uint8(msg, reuse);
+}
+
 /*
  * Allocate a msg to send data
  */

Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c?rev=1152379&r1=1152378&r2=1152379&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c (original)
+++ httpd/httpd/trunk/modules/proxy/mod_proxy_ajp.c Fri Jul 29 21:41:00 2011
@@ -174,6 +174,7 @@ static int ap_proxy_ajp_request(apr_pool
     char *buff;
     char *send_body_chunk_buff;
     apr_uint16_t size;
+    apr_byte_t conn_reuse = 0;
     const char *tenc;
     int havebody = 1;
     int output_failed = 0;
@@ -527,6 +528,10 @@ static int ap_proxy_ajp_request(apr_pool
                  * the client, especially as the brigade already contains headers.
                  * So do nothing here, and it will be cleaned up below.
                  */
+                status = ajp_parse_reuse(r, conn->data, &conn_reuse);
+                if (status != APR_SUCCESS) {
+                    backend_failed = 1;
+                }
                 if (!conf->error_override || !ap_is_HTTP_ERROR(r->status)) {
                     e = apr_bucket_eos_create(r->connection->bucket_alloc);
                     APR_BRIGADE_INSERT_TAIL(output_brigade, e);
@@ -608,6 +613,10 @@ static int ap_proxy_ajp_request(apr_pool
             rv = DONE;
         }
     }
+    else if (!conn_reuse) {
+        /* Our backend signalled connection close */
+        conn->close++;
+    }
     else {
         ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
                      "proxy: got response from %pI (%s)",