]> granicus.if.org Git - apache/commitdiff
mod_proxy: follow up to r1729826 + r1729847 + r1732986.
authorYann Ylavic <ylavic@apache.org>
Tue, 1 Mar 2016 12:31:40 +0000 (12:31 +0000)
committerYann Ylavic <ylavic@apache.org>
Tue, 1 Mar 2016 12:31:40 +0000 (12:31 +0000)
Don't use magic constants.

Reverted by r1733055, re-commited without spurious changes in r1733056.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1733054 13f79535-47bb-0310-9956-ffa450edef68

modules/filters/mod_reqtimeout.c
modules/proxy/mod_proxy.h
modules/proxy/proxy_util.c

index 206e621796eadd1ab9a7b2b33d565d0a5f90c00a..2fd44ba5e3090abf5cc804654588f1a32b81a22b 100644 (file)
@@ -352,6 +352,15 @@ out:
     return rv;
 }
 
+static apr_status_t reqtimeout_pause(ap_filter_t *f, apr_bucket_brigade *bb)
+{
+    if (!APR_BRIGADE_EMPTY(bb) && AP_BUCKET_IS_EOR(APR_BRIGADE_LAST(bb))) {
+        reqtimeout_con_cfg *ccfg = f->ctx;
+        ccfg->timeout_at = 0;
+    }
+    return ap_pass_brigade(f->next, bb);
+}
+
 static int reqtimeout_init(conn_rec *c)
 {
     reqtimeout_con_cfg *ccfg;
@@ -369,6 +378,7 @@ static int reqtimeout_init(conn_rec *c)
     if (ccfg == NULL) {
         ccfg = apr_pcalloc(c->pool, sizeof(reqtimeout_con_cfg));
         ap_set_module_config(c->conn_config, &reqtimeout_module, ccfg);
+        ap_add_output_filter(reqtimeout_filter_name, ccfg, NULL, c);
         ap_add_input_filter(reqtimeout_filter_name, ccfg, NULL, c);
     }
 
@@ -606,6 +616,14 @@ static void reqtimeout_hooks(apr_pool_t *pool)
     ap_register_input_filter(reqtimeout_filter_name, reqtimeout_filter, NULL,
                              AP_FTYPE_CONNECTION + 8);
 
+    /*
+     * We need to pause timeout detection in between requests, for
+     * speculative and non-blocking reads, so between each outgoing EOR
+     * and the next pre_read_request call.
+     */
+    ap_register_output_filter(reqtimeout_filter_name, reqtimeout_pause, NULL,
+                              AP_FTYPE_CONNECTION);
+
     /*
      * mod_reqtimeout needs to be called before ap_process_http_request (which
      * is run at APR_HOOK_REALLY_LAST) but after all other protocol modules.
index c9eac3fdade63072350ec59a9cae21a5ea469ff2..6af2457cbdd4cf052642686fa54c115d22179fad 100644 (file)
@@ -349,6 +349,11 @@ PROXY_WORKER_HC_FAIL )
 #define PROXY_BALANCER_MAX_HOSTNAME_SIZE 64
 #define PROXY_BALANCER_MAX_STICKY_SIZE   64
 
+/* RFC-1035 mentions limits of 255 for host-names and 253 for domain-names,
+ * dotted together(?) this would fit the below size (+ trailing NUL).
+ */
+#define PROXY_WORKER_RFC1035_NAME_SIZE   512
+
 #define PROXY_MAX_PROVIDER_NAME_SIZE     16
 
 #define PROXY_STRNCPY(dst, src) ap_proxy_strncpy((dst), (src), (sizeof(dst)))
index add981f4a6bc09db5887b381e907b4fb4b28b360..30d8785a3200254c9aab09e507303102814b9b4c 100644 (file)
@@ -2721,7 +2721,7 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
              * restore any ssl_hostname for this connection set earlier by
              * ap_proxy_determine_connection().
              */
-            char ssl_hostname[512]; /* host+domain names max (rfc1035-2.3.4) */
+            char ssl_hostname[PROXY_WORKER_RFC1035_NAME_SIZE];
             if (!conn->ssl_hostname || PROXY_STRNCPY(ssl_hostname,
                                                      conn->ssl_hostname)) {
                 ssl_hostname[0] = '\0';