-*- coding: utf-8 -*-
Changes with Apache 2.2.21
+ *) core: Add MaxRanges directive to control the number of ranges permitted
+ before returning the entire resource, with a default limit of 200.
+ [Eric Covener]
Changes with Apache 2.2.20
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
+#
+# MaxRanges: Maximum number of Ranges in a request before
+# returning the entire resource, or 0 for unlimited
+# Default setting is to accept 200 Ranges
+#MaxRanges 0
+
#
# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall is used to deliver
</example>
</usage>
</directivesynopsis>
+<directivesynopsis>
+<name>MaxRanges</name>
+<description>Number of ranges allowed before returning the complete
+resource </description>
+<syntax>MaxRanges <var>number</var> (0 = no limit)</syntax>
+<default>MaxRanges 200</default>
+<contextlist><context>server config</context><context>virtual host</context>
+<context>directory</context>
+</contextlist>
+<compatibility>Available in Apache HTTP Server 2.3.15 and later</compatibility>
+
+<usage>
+ <p>The <directive>MaxRanges</directive> directive
+ 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.</p>
+</usage>
+</directivesynopsis>
<directivesynopsis>
<name>NameVirtualHost</name>
* Add core_dir_config.decode_encoded_slashes.
* 20051115.28 (2.2.19) Restore ap_unescape_url_keep2f(char *url) signature
* altered in 2.2.18. Add ap_unescape_url_keep2f_ex().
+ * 20051115.29 (2.2.21) add max_ranges to core_dir_config
*/
#define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20051115
#endif
-#define MODULE_MAGIC_NUMBER_MINOR 28 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 29 /* 0...n */
/**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
unsigned int decode_encoded_slashes : 1; /* whether to decode encoded slashes in URLs */
+
+ /** Number of Ranges before returning HTTP_OK, 0/unlimited -1/unset. **/
+ int max_ranges;
+
} core_dir_config;
/* Per-server core configuration */
#include <unistd.h>
#endif
+#ifndef DEFAULT_MAX_RANGES
+#define DEFAULT_MAX_RANGES 200
+#endif
+
static int ap_set_byterange(request_rec *r, apr_off_t clength,
apr_array_header_t **indexes);
apr_off_t end;
} 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;
+}
+
AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f,
apr_bucket_brigade *bb)
{
indexes_t *idx;
int original_status;
int i;
+ int max_ranges = get_max_ranges(r);
/*
* Iterate through the brigade until reaching EOS or a bucket with
num_ranges = ap_set_byterange(r, clength, &indexes);
/* We have nothing to do, get out of the way. */
- if (num_ranges == 0) {
+ 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);
conf->enable_sendfile = ENABLE_SENDFILE_UNSET;
conf->allow_encoded_slashes = 0;
conf->decode_encoded_slashes = 0;
+
+ conf->max_ranges = -1;
return (void *)conf;
}
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;
+
return (void*)conf;
}
return NULL;
}
+static const char *set_max_ranges(cmd_parms *cmd, void *conf_, const char *arg)
+{
+ core_dir_config *conf = conf_;
+
+ conf->max_ranges = atoi(arg);
+ if (conf->max_ranges < 0)
+ return "MaxRanges requires a non-negative integer (0 = unlimited)";
+
+ return NULL;
+}
AP_DECLARE(size_t) ap_get_limit_xml_body(const request_rec *r)
{
core_dir_config *conf;
"Limit (in bytes) on maximum size of an XML-based request "
"body"),
+AP_INIT_TAKE1("MaxRanges", set_max_ranges, NULL, RSRC_CONF|ACCESS_CONF,
+ "Maximum number of Ranges in a request before returning the entire "
+ "resource, or 0 for unlimited"),
/* System Resource Controls */
#ifdef RLIMIT_CPU
AP_INIT_TAKE12("RLimitCPU", set_limit_cpu,