From: Eric Covener
Date: Wed, 7 Sep 2011 17:29:49 +0000 (+0000)
Subject: take care of some MaxRanges feedback:
X-Git-Tag: 2.3.15~293
X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fe5f7b561d155833df8cfbe630fb26c4cf348cfd;p=thirdparty%2Fapache%2Fhttpd.git
take care of some MaxRanges feedback:
* allow "none" to be expressed in config
* send Accept-Ranges: none with MaxRanges none
* stop accepting confusing/ambiguous "0", start accepting "unlimited".
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1166282 13f79535-47bb-0310-9956-ffa450edef68
---
diff --git a/CHANGES b/CHANGES
index e0e54475d5d..a79db2f8c29 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,10 @@ Changes with Apache 2.3.15
the original file, ignore the ranges and send the complete file.
PR 51714. [Stefan Fritsch, Jim Jagielski, Ruediger Pluem, Eric Covener]
+ *) core: Allow MaxRanges none|unlimited|default and set 'Accept-Ranges: none'
+ in the case Ranges are being ignored with MaxRanges none.
+ [Eric Covener]
+
*) mod_ssl: revamp CRL-based revocation checking when validating
certificates of clients or proxied servers. Completely delegate
CRL processing to OpenSSL, and add a new [Proxy]CARevocationCheck
diff --git a/docs/manual/mod/core.xml b/docs/manual/mod/core.xml
index a6956be99b7..4c7bda7ce48 100644
--- a/docs/manual/mod/core.xml
+++ b/docs/manual/mod/core.xml
@@ -2869,7 +2869,7 @@ 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
@@ -2881,6 +2881,22 @@ 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.
+
diff --git a/include/http_core.h b/include/http_core.h
index cfd7cf08fb1..4c1da18cfec 100644
--- a/include/http_core.h
+++ b/include/http_core.h
@@ -605,7 +605,11 @@ typedef struct {
/** Table of directives allowed per AllowOverrideList */
apr_table_t *override_list;
- /** 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 de6c729fdfc..350017b0bda 100644
--- a/modules/http/byterange_filter.c
+++ b/modules/http/byterange_filter.c
@@ -192,7 +192,12 @@ typedef struct indexes_t {
static int get_max_ranges(request_rec *r) {
core_dir_config *core_conf = ap_get_core_module_config(r->per_dir_config);
- 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 DEFAULT_MAX_RANGES;
}
static apr_status_t send_416(ap_filter_t *f, apr_bucket_brigade *tmpbb)
@@ -257,7 +262,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 a6ac9c11efc..632b15d5d95 100644
--- a/server/core.c
+++ b/server/core.c
@@ -179,7 +179,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;
}
@@ -399,7 +399,7 @@ static void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv)
}
}
- 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;
}
@@ -3267,11 +3267,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)
@@ -4196,7 +4211,9 @@ static int default_handler(request_rec *r)
ap_update_mtime(r, r->finfo.mtime);
ap_set_last_modified(r);
ap_set_etag(r);
- apr_table_setn(r->headers_out, "Accept-Ranges", "bytes");
+ apr_table_setn(r->headers_out, "Accept-Ranges",
+ (d->max_ranges == AP_MAXRANGES_NORANGES) ? "none"
+ : "bytes");
ap_set_content_length(r, r->finfo.size);
if (bld_content_md5) {
apr_table_setn(r->headers_out, "Content-MD5",