# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: atcs.matthew@gmail.com-20100210152513-7a6iy11x0ianljs6 # target_branch: file:///home/lytithwyn/squid-repo/trunk/ # testament_sha1: 3dd02084f513530143fd38f8c6c7558451c66956 # timestamp: 2010-02-10 10:38:13 -0500 # base_revision_id: squid3@treenet.co.nz-20100207033846-\ # 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 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