Here is the patch to add acl support to range_offset_limit. It is being
parsed using the same data types as reply_body_max_size, which means the
limit value gets run through parseBytesLine64, and the acl is optional.
If people are using the old global style of range_offset_limit, they
shouldn't have to do anything to their configs.
As per Amos' request, getRangeOffsetLimit is now a member of
HttpRequest, and it caches it's value the same way reply_body_max_size does.
Sorry it has taken me so long! Thanks for being patient.
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [email protected]
# target_branch: file:///home/lytithwyn/squid-repo/trunk/
# testament_sha1: 3dd02084f513530143fd38f8c6c7558451c66956
# timestamp: 2010-02-10 10:38:13 -0500
# base_revision_id: [email protected]\
# m8d33xrr2dsfuqi9
#
# Begin patch
=== modified file 'src/HttpHdrRange.cc'
--- src/HttpHdrRange.cc 2009-01-31 17:23:17 +0000
+++ src/HttpHdrRange.cc 2009-10-13 21:10:05 +0000
@@ -530,17 +530,17 @@
* grabbing the needed range elements from the origin.
*/
bool
-HttpHdrRange::offsetLimitExceeded() const
+HttpHdrRange::offsetLimitExceeded(int64_t limit) const
{
if (NULL == this)
/* not a range request */
return false;
- if (Config.rangeOffsetLimit == 0)
+ if (limit == 0)
/* disabled */
return true;
- if (-1 == Config.rangeOffsetLimit)
+ if (-1 == limit)
/* forced */
return false;
@@ -548,7 +548,7 @@
/* tail request */
return true;
- if (Config.rangeOffsetLimit >= firstOffset())
+ if (limit >= firstOffset())
/* below the limit */
return false;
=== modified file 'src/HttpHeaderRange.h'
--- src/HttpHeaderRange.h 2009-03-31 12:39:30 +0000
+++ src/HttpHeaderRange.h 2009-10-13 21:10:05 +0000
@@ -103,7 +103,7 @@
bool willBeComplex() const;
int64_t firstOffset() const;
int64_t lowestOffset(int64_t) const;
- bool offsetLimitExceeded() const;
+ bool offsetLimitExceeded(int64_t) const;
bool contains(HttpHdrRangeSpec& r) const;
Vector<HttpHdrRangeSpec *> specs;
=== modified file 'src/HttpRequest.cc'
--- src/HttpRequest.cc 2009-11-04 12:08:08 +0000
+++ src/HttpRequest.cc 2010-02-05 21:47:50 +0000
@@ -43,6 +43,7 @@
#if ICAP_CLIENT
#include "adaptation/icap/icap_log.h"
#endif
+#include "acl/FilledChecklist.h"
HttpRequest::HttpRequest() : HttpMsg(hoRequest)
{
@@ -114,6 +115,7 @@
#if ICAP_CLIENT
icapHistory_ = NULL;
#endif
+ rangeOffsetLimit = -2; //a value of -2 means not checked yet
}
void
@@ -609,3 +611,30 @@
dnsWait = dns.wait;
}
}
+
+int64_t
+HttpRequest::getRangeOffsetLimit()
+{
+ /*-2 is the starting value of rangeOffsetLimit.
+ If it is -2, that means we haven't checked it yet.
+ Otherwise, return the current value */
+ if(rangeOffsetLimit != -2)
+ return rangeOffsetLimit;
+
+ rangeOffsetLimit = 0; //this is the default value for rangeOffsetLimit
+
+ ACLFilledChecklist ch(NULL, this, NULL);
+ ch.src_addr = client_addr;
+ ch.my_addr = my_addr;
+
+ for (acl_size_t *l = Config.rangeOffsetLimit; l; l = l -> next) {
+ /* if there is no ACL list or if the ACLs listed match use this limit value */
+ if (!l->aclList || ch.matchAclListFast(l->aclList)) {
+ debugs(58, 4, HERE << "rangeOffsetLimit=" << rangeOffsetLimit);
+ rangeOffsetLimit = l->size; // may be -1
+ break;
+ }
+ }
+
+ return rangeOffsetLimit;
+}
=== modified file 'src/HttpRequest.h'
--- src/HttpRequest.h 2009-11-04 12:08:08 +0000
+++ src/HttpRequest.h 2009-12-02 19:15:15 +0000
@@ -247,9 +247,13 @@
cbdataReferenceDone(pinned_connection);
}
+ int64_t getRangeOffsetLimit(); /* the result of this function gets cached in rangeOffsetLimit */
+
private:
const char *packableURI(bool full_uri) const;
+ mutable int64_t rangeOffsetLimit; /* caches the result of getRangeOffsetLimit */
+
protected:
virtual void packFirstLineInto(Packer * p, bool full_uri) const;
=== modified file 'src/cf.data.depend'
--- src/cf.data.depend 2010-02-07 03:38:46 +0000
+++ src/cf.data.depend 2010-02-08 19:24:05 +0000
@@ -43,6 +43,7 @@
peer_access cache_peer acl
QosConfig
refreshpattern
+rangeoffsetlimit
removalpolicy
size_t
IpAddress_list
=== modified file 'src/cf.data.pre'
--- src/cf.data.pre 2010-02-07 03:38:46 +0000
+++ src/cf.data.pre 2010-02-10 15:25:13 +0000
@@ -3545,28 +3545,41 @@
DOC_END
NAME: range_offset_limit
-COMMENT: (bytes)
-TYPE: b_int64_t
+COMMENT: size [acl acl...]
+TYPE: acl_b_size_t
LOC: Config.rangeOffsetLimit
-DEFAULT: 0 KB
+DEFAULT: none
DOC_START
- Sets a upper limit on how far into the the file a Range request
- may be to cause Squid to prefetch the whole file. If beyond this
- limit Squid forwards the Range request as it is and the result
- is NOT cached.
+ usage: (size) [units] [[!]aclname]
+
+ Sets an upper limit on how far (number of bytes) into the the file
+ a Range request may be to cause Squid to prefetch the whole file.
+ If beyond this limit, Squid forwards the Range request as it is and
+ the result is NOT cached.
This is to stop a far ahead range request (lets say start at 17MB)
from making Squid fetch the whole object up to that point before
sending anything to the client.
-
- A value of 0 causes Squid to never fetch more than the
+
+ Multiple range_offset_limit lines may be specified, and they will
+ be searched from top to bottom on each request until a match is found.
+ The first match found will be used. If no line matches a request, the
+ default limit of 0 bytes will be used.
+
+ 'size' is the limit specified as a number of units.
+
+ 'units' specifies whether to use bytes, KB, MB, etc.
+
+ A size of 0 causes Squid to never fetch more than the
client requested. (default)
- A value of -1 causes Squid to always fetch the object from the
+ A size of -1 causes Squid to always fetch the object from the
beginning so it may cache the result. (2.0 style)
+
+ 'aclname' is the name of a defined ACL.
- NP: Using -1 here will override any quick_abort settings that may
- otherwise apply to the range request. The range request will
+ NP: Using -1 as the byte value here will override any quick_abort settings
+ that may otherwise apply to the range request. The range request will
be fully fetched from start to finish regardless of the client
actions. This affects bandwidth usage.
DOC_END
=== modified file 'src/client_side.cc'
--- src/client_side.cc 2010-01-29 01:13:09 +0000
+++ src/client_side.cc 2010-02-08 19:24:05 +0000
@@ -1127,6 +1127,8 @@
assert(request->range);
/* check if we still want to do ranges */
+ int64_t roffLimit = request->getRangeOffsetLimit();
+
if (!rep)
range_err = "no [parse-able] reply";
else if ((rep->sline.status != HTTP_OK) && (rep->sline.status != HTTP_PARTIAL_CONTENT))
@@ -1147,7 +1149,7 @@
range_err = "canonization failed";
else if (http->request->range->isComplex())
range_err = "too complex range header";
- else if (!logTypeIsATcpHit(http->logType) && http->request->range->offsetLimitExceeded())
+ else if (!logTypeIsATcpHit(http->logType) && http->request->range->offsetLimitExceeded(roffLimit))
range_err = "range outside range_offset_limit";
/* get rid of our range specs on error */
=== modified file 'src/http.cc'
--- src/http.cc 2010-02-06 06:32:11 +0000
+++ src/http.cc 2010-02-08 19:24:05 +0000
@@ -1903,8 +1903,10 @@
* the server and fetch only the requested content)
*/
+ int64_t roffLimit = orig_request->getRangeOffsetLimit();
+
if (NULL == orig_request->range || !orig_request->flags.cachable
- || orig_request->range->offsetLimitExceeded() || orig_request->flags.connection_auth)
+ || orig_request->range->offsetLimitExceeded(roffLimit) || orig_request->flags.connection_auth)
result = false;
debugs(11, 8, "decideIfWeDoRanges: range specs: " <<
=== modified file 'src/store_client.cc'
--- src/store_client.cc 2009-08-23 09:30:49 +0000
+++ src/store_client.cc 2009-12-02 19:15:15 +0000
@@ -796,7 +796,9 @@
return 0;
}
- if ( Config.rangeOffsetLimit < 0 && mem->request && mem->request->range ) {
+ int64_t roffLimit = mem->request->getRangeOffsetLimit();
+
+ if ( roffLimit < 0 && mem->request && mem->request->range ) {
/* Don't abort if the admin has configured range_ofset -1 to download fully for caching. */
debugs(90, 3, "CheckQuickAbort2: NO admin configured range replies to full-download");
return 0;
=== modified file 'src/structs.h'
--- src/structs.h 2010-02-07 03:38:46 +0000
+++ src/structs.h 2010-02-08 19:24:05 +0000
@@ -553,7 +553,7 @@
} comm_incoming;
int max_open_disk_fds;
int uri_whitespace;
- int64_t rangeOffsetLimit;
+ acl_size_t *rangeOffsetLimit;
#if MULTICAST_MISS_STREAM
struct {
@@ -1321,4 +1321,5 @@
customlog_type type;
};
+
#endif /* SQUID_STRUCTS_H */
=== modified file 'src/typedefs.h'
--- src/typedefs.h 2009-11-22 20:37:27 +0000
+++ src/typedefs.h 2009-11-25 20:42:55 +0000
@@ -153,6 +153,8 @@
typedef struct _refresh_t refresh_t;
+typedef struct _range_offset_t range_offset_t;
+
typedef struct _CommWriteStateData CommWriteStateData;
typedef struct _StatCounters StatCounters;
# Begin bundle
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
sRVu//4u5IpwoSE+2z2I