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)