From: Yann Ylavic Date: Tue, 1 Mar 2016 12:31:40 +0000 (+0000) Subject: mod_proxy: follow up to r1729826 + r1729847 + r1732986. X-Git-Tag: 2.5.0-alpha~1984 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3008b62535cd6c2bade3ed469bdcc8ebcb08a36;p=thirdparty%2Fapache%2Fhttpd.git mod_proxy: follow up to r1729826 + r1729847 + r1732986. 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 --- diff --git a/modules/filters/mod_reqtimeout.c b/modules/filters/mod_reqtimeout.c index 206e621796e..2fd44ba5e30 100644 --- a/modules/filters/mod_reqtimeout.c +++ b/modules/filters/mod_reqtimeout.c @@ -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. diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index c9eac3fdade..6af2457cbdd 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -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))) diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index add981f4a6b..30d8785a320 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -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';