From: Eric Covener Date: Thu, 8 Sep 2011 10:41:15 +0000 (+0000) Subject: backport r1166282 (minus Accept-Ranges: none change) from trunk: X-Git-Tag: 2.2.21~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d32c004e61c57c954b31580a8735ec1aac479d00;p=thirdparty%2Fapache%2Fhttpd.git backport r1166282 (minus Accept-Ranges: none change) from trunk: take care of some MaxRanges feedback: * allow "none" to be expressed in config * stop accepting confusing/ambiguous "0", start accepting "unlimited". Reviewed By: covener, wrowe, rpluem git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@1166612 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/STATUS b/STATUS index b3e27ae2170..4eec5572e05 100644 --- a/STATUS +++ b/STATUS @@ -93,16 +93,8 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * core: MaxRanges syntax change to allow unlimited|none|n>0 and prefix - compile-time macro with AP_. - Trunk version of patch: - http://svn.apache.org/viewvc?rev=1166282&view=rev (minus Accept-Range change) - 2.2.x verson of patch: - http://people.apache.org/~covener/patches/httpd-2.2.x-maxranges-followon.diff - (Accept-Range: changeset in separate proposal below) - +1: covener, wrowe, rpluem - PATCHES PROPOSED TO BACKPORT FROM TRUNK: +PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] * mod_cache: Realign the cache_quick_handler() to behave identically diff --git a/docs/manual/mod/core.xml b/docs/manual/mod/core.xml index 0c76c6b77be..1844f48bdfc 100644 --- a/docs/manual/mod/core.xml +++ b/docs/manual/mod/core.xml @@ -2298,11 +2298,12 @@ connection + MaxRanges Number of ranges allowed before returning the complete resource -MaxRanges number (0 = no limit) +MaxRanges default | unlimited | none | number-of-ranges MaxRanges 200 server configvirtual host directory @@ -2314,9 +2315,26 @@ resource limits the number of HTTP ranges the server is willing to return to the client. If more ranges then permitted are requested, the complete resource is returned instead.

+ +
+
default
+
Limits the number of ranges to a compile-time default of 200.
+ +
none
+
Range headers are ignored.
+ +
unlimited
+
The server does not limit the number of ranges it is + willing to satisfy.
+ +
number-of-ranges
+
A positive number representing the maximum number of ranges the + server is willing to satisfy.
+
+ NameVirtualHost Designates an IP address for name-virtual diff --git a/include/http_core.h b/include/http_core.h index 9d78e081b5f..7be9d5dcab6 100644 --- a/include/http_core.h +++ b/include/http_core.h @@ -571,7 +571,11 @@ typedef struct { unsigned int decode_encoded_slashes : 1; /* whether to decode encoded slashes in URLs */ - /** Number of Ranges before returning HTTP_OK, 0/unlimited -1/unset. **/ +#define AP_MAXRANGES_UNSET -1 +#define AP_MAXRANGES_DEFAULT -2 +#define AP_MAXRANGES_UNLIMITED -3 +#define AP_MAXRANGES_NORANGES 0 + /** Number of Ranges before returning HTTP_OK. **/ int max_ranges; } core_dir_config; diff --git a/modules/http/byterange_filter.c b/modules/http/byterange_filter.c index 28ad8217cdf..ef3c79f7ee5 100644 --- a/modules/http/byterange_filter.c +++ b/modules/http/byterange_filter.c @@ -55,8 +55,8 @@ #include #endif -#ifndef DEFAULT_MAX_RANGES -#define DEFAULT_MAX_RANGES 200 +#ifndef AP_DEFAULT_MAX_RANGES +#define AP_DEFAULT_MAX_RANGES 200 #endif static int ap_set_byterange(request_rec *r, apr_off_t clength, @@ -186,7 +186,12 @@ typedef struct indexes_t { static int get_max_ranges(request_rec *r) { core_dir_config *core_conf = ap_get_module_config(r->per_dir_config, &core_module); - return core_conf->max_ranges == -1 ? DEFAULT_MAX_RANGES : core_conf->max_ranges; + if (core_conf->max_ranges >= 0 || core_conf->max_ranges == AP_MAXRANGES_UNLIMITED) { + return core_conf->max_ranges; + } + + /* Any other negative val means the default */ + return AP_DEFAULT_MAX_RANGES; } static apr_status_t send_416(ap_filter_t *f, apr_bucket_brigade *tmpbb) @@ -251,7 +256,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, num_ranges = ap_set_byterange(r, clength, &indexes); /* We have nothing to do, get out of the way. */ - if (num_ranges == 0 || (max_ranges > 0 && num_ranges > max_ranges)) { + if (num_ranges == 0 || (max_ranges >= 0 && num_ranges > max_ranges)) { r->status = original_status; ap_remove_output_filter(f); return ap_pass_brigade(f->next, bb); diff --git a/server/core.c b/server/core.c index d21e2924040..f2cfd48ebcd 100644 --- a/server/core.c +++ b/server/core.c @@ -166,7 +166,7 @@ static void *create_core_dir_config(apr_pool_t *a, char *dir) conf->allow_encoded_slashes = 0; conf->decode_encoded_slashes = 0; - conf->max_ranges = -1; + conf->max_ranges = AP_MAXRANGES_UNSET; return (void *)conf; } @@ -455,7 +455,7 @@ static void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv) conf->allow_encoded_slashes = new->allow_encoded_slashes; conf->decode_encoded_slashes = new->decode_encoded_slashes; - conf->max_ranges = new->max_ranges != -1 ? new->max_ranges : base->max_ranges; + conf->max_ranges = new->max_ranges != AP_MAXRANGES_UNSET ? new->max_ranges : base->max_ranges; return (void*)conf; } @@ -2985,11 +2985,26 @@ static const char *set_limit_xml_req_body(cmd_parms *cmd, void *conf_, static const char *set_max_ranges(cmd_parms *cmd, void *conf_, const char *arg) { core_dir_config *conf = conf_; + int val = 0; - conf->max_ranges = atoi(arg); - if (conf->max_ranges < 0) - return "MaxRanges requires a non-negative integer (0 = unlimited)"; + if (!strcasecmp(arg, "none")) { + val = AP_MAXRANGES_NORANGES; + } + else if (!strcasecmp(arg, "default")) { + val = AP_MAXRANGES_DEFAULT; + } + else if (!strcasecmp(arg, "unlimited")) { + val = AP_MAXRANGES_UNLIMITED; + } + else { + val = atoi(arg); + if (val <= 0) + return "MaxRanges requires 'none', 'default', 'unlimited' or " + "a positive integer"; + } + conf->max_ranges = val; + return NULL; } AP_DECLARE(size_t) ap_get_limit_xml_body(const request_rec *r)