# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20110912232555-fi4oz0o6sqygxdbs # target_branch: ../trunk/ # testament_sha1: 7233b109d20a61b640ebe857b9aabf47da27caca # timestamp: 2011-09-13 01:26:52 +0200 # base_revision_id: kinkie@squid-cache.org-20110912232115-\ # l1ygojvxm4gwciq1 # # Begin patch === modified file 'src/HttpHdrCc.cc' --- src/HttpHdrCc.cc 2010-12-27 20:25:30 +0000 +++ src/HttpHdrCc.cc 2011-09-12 23:24:54 +0000 @@ -1,9 +1,8 @@ /* - * $Id$ * * DEBUG: section 65 HTTP Cache Control Header - * AUTHOR: Alex Rousskov + * AUTHOR: Alex Rousskov, Francesco Chemolli * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- @@ -36,28 +35,42 @@ #include "squid.h" #include "Store.h" #include "HttpHeader.h" - -/* this table is used for parsing cache control header */ -static const HttpHeaderFieldAttrs CcAttrs[CC_ENUM_END] = { - {"public", (http_hdr_type)CC_PUBLIC}, - - {"private", (http_hdr_type)CC_PRIVATE}, - {"no-cache", (http_hdr_type)CC_NO_CACHE}, - {"no-store", (http_hdr_type)CC_NO_STORE}, - {"no-transform", (http_hdr_type)CC_NO_TRANSFORM}, - {"must-revalidate", (http_hdr_type)CC_MUST_REVALIDATE}, - {"proxy-revalidate", (http_hdr_type)CC_PROXY_REVALIDATE}, - {"only-if-cached", (http_hdr_type)CC_ONLY_IF_CACHED}, - {"max-age", (http_hdr_type)CC_MAX_AGE}, - {"s-maxage", (http_hdr_type)CC_S_MAXAGE}, - {"max-stale", (http_hdr_type)CC_MAX_STALE}, - {"stale-if-error", (http_hdr_type)CC_STALE_IF_ERROR}, - {"min-fresh", (http_hdr_type)CC_MIN_FRESH}, - {"Other,", (http_hdr_type)CC_OTHER} /* ',' will protect from matches */ +#include "HttpHdrCc.h" + +#if HAVE_MAP +#include +#endif + +/* this table is used for parsing cache control header and statistics */ +typedef struct { + const char *name; + http_hdr_cc_type id; + HttpHeaderFieldStat stat; +} HttpHeaderCcFields; + +/* order must match that of enum http_hdr_cc_type. The constraint is verified at initialization time */ +static HttpHeaderCcFields CcAttrs[CC_ENUM_END] = { + {"public", CC_PUBLIC}, + {"private", CC_PRIVATE}, + {"no-cache", CC_NO_CACHE}, + {"no-store", CC_NO_STORE}, + {"no-transform", CC_NO_TRANSFORM}, + {"must-revalidate", CC_MUST_REVALIDATE}, + {"proxy-revalidate", CC_PROXY_REVALIDATE}, + {"max-age", CC_MAX_AGE}, + {"s-maxage", CC_S_MAXAGE}, + {"max-stale", CC_MAX_STALE}, + {"min-fresh", CC_MIN_FRESH}, + {"only-if-cached", CC_ONLY_IF_CACHED}, + {"stale-if-error", CC_STALE_IF_ERROR}, + {"Other,", CC_OTHER} /* ',' will protect from matches */ }; -HttpHeaderFieldInfo *CcFieldsInfo = NULL; +/// Map an header name to its type, to expedite parsing +typedef std::map HdrCcNameToIdMap_t; +static HdrCcNameToIdMap_t HdrCcNameToIdMap; +/// iterate over a table of http_header_cc_type structs http_hdr_cc_type &operator++ (http_hdr_cc_type &aHeader) { int tmp = (int)aHeader; @@ -66,52 +79,41 @@ } -/* local prototypes */ -static int httpHdrCcParseInit(HttpHdrCc * cc, const String * str); - - -/* module initialization */ - +/// Module initialization hook void httpHdrCcInitModule(void) { - CcFieldsInfo = httpHeaderBuildFieldsInfo(CcAttrs, CC_ENUM_END); + int32_t i; + /* build lookup and accounting structures */ + for (i=0;imax_age = cc->s_maxage = cc->max_stale = cc->min_fresh = -1; - return cc; -} - -/* creates an cc object from a 0-terminating string */ -HttpHdrCc * -httpHdrCcParseCreate(const String * str) -{ - HttpHdrCc *cc = httpHdrCcCreate(); - - if (!httpHdrCcParseInit(cc, str)) { - httpHdrCcDestroy(cc); - cc = NULL; - } - - return cc; -} - -/* parses a 0-terminating string and inits cc */ -static int -httpHdrCcParseInit(HttpHdrCc * cc, const String * str) + // HdrCcNameToIdMap is self-cleaning +} + +void +HttpHdrCc::clear() +{ + mask=0; + max_age=-1; + mask=0; + max_age=-1; + s_maxage=-1; + max_stale=-1; + stale_if_error=0; + min_fresh=-1; + other.clean(); +} + +bool +HttpHdrCc::parseInit(const String & str) { const char *item; const char *p; /* '=' parameter */ @@ -119,11 +121,11 @@ http_hdr_cc_type type; int ilen; int nlen; - assert(cc && str); /* iterate through comma separated list */ - while (strListGetItem(str, ',', &item, &ilen, &pos)) { + while (strListGetItem(&str, ',', &item, &ilen, &pos)) { + String tmpstr; /* isolate directive name */ if ((p = (const char *)memchr(item, '=', ilen)) && (p - item < ilen)) @@ -132,23 +134,23 @@ nlen = ilen; /* find type */ - type = (http_hdr_cc_type ) httpHeaderIdByName(item, nlen, - CcFieldsInfo, CC_ENUM_END); - - if (type < 0) { - debugs(65, 2, "hdr cc: unknown cache-directive: near '" << item << "' in '" << str << "'"); - type = CC_OTHER; - } + tmpstr.limitInit(item,nlen); + HdrCcNameToIdMap_t::iterator i; + i=HdrCcNameToIdMap.find(tmpstr); + if (i==HdrCcNameToIdMap.end()) + type=CC_OTHER; + else + type=i->second; // ignore known duplicate directives - if (EBIT_TEST(cc->mask, type)) { + if (EBIT_TEST(mask, type)) { if (type != CC_OTHER) { debugs(65, 2, "hdr cc: ignoring duplicate cache-directive: near '" << item << "' in '" << str << "'"); - CcFieldsInfo[type].stat.repCount++; + CcAttrs[type].stat.repCount++; continue; } } else { - EBIT_SET(cc->mask, type); + EBIT_SET(mask, type); } /* post-processing special cases */ @@ -156,57 +158,57 @@ case CC_MAX_AGE: - if (!p || !httpHeaderParseInt(p, &cc->max_age)) { + if (!p || !httpHeaderParseInt(p, &max_age)) { debugs(65, 2, "cc: invalid max-age specs near '" << item << "'"); - cc->max_age = -1; - EBIT_CLR(cc->mask, type); + max_age = -1; + EBIT_CLR(mask, type); } break; case CC_S_MAXAGE: - if (!p || !httpHeaderParseInt(p, &cc->s_maxage)) { + if (!p || !httpHeaderParseInt(p, &s_maxage)) { debugs(65, 2, "cc: invalid s-maxage specs near '" << item << "'"); - cc->s_maxage = -1; - EBIT_CLR(cc->mask, type); + s_maxage = -1; + EBIT_CLR(mask, type); } break; case CC_MAX_STALE: - if (!p || !httpHeaderParseInt(p, &cc->max_stale)) { + if (!p || !httpHeaderParseInt(p, &max_stale)) { debugs(65, 2, "cc: max-stale directive is valid without value"); - cc->max_stale = -1; + max_stale = -1; } break; case CC_MIN_FRESH: - if (!p || !httpHeaderParseInt(p, &cc->min_fresh)) { + if (!p || !httpHeaderParseInt(p, &min_fresh)) { debugs(65, 2, "cc: invalid min-fresh specs near '" << item << "'"); - cc->min_fresh = -1; - EBIT_CLR(cc->mask, type); + min_fresh = -1; + EBIT_CLR(mask, type); } break; case CC_STALE_IF_ERROR: - if (!p || !httpHeaderParseInt(p, &cc->stale_if_error)) { + if (!p || !httpHeaderParseInt(p, &stale_if_error)) { debugs(65, 2, "cc: invalid stale-if-error specs near '" << item << "'"); - cc->stale_if_error = -1; - EBIT_CLR(cc->mask, type); + stale_if_error = -1; + EBIT_CLR(mask, type); } break; case CC_OTHER: - if (cc->other.size()) - cc->other.append(", "); + if (other.size()) + other.append(", "); - cc->other.append(item, ilen); + other.append(item, ilen); break; @@ -216,32 +218,7 @@ } } - return cc->mask != 0; -} - -void -httpHdrCcDestroy(HttpHdrCc * cc) -{ - assert(cc); - - if (cc->other.defined()) - cc->other.clean(); - - memFree(cc, MEM_HTTP_HDR_CC); -} - -HttpHdrCc * -httpHdrCcDup(const HttpHdrCc * cc) -{ - HttpHdrCc *dup; - assert(cc); - dup = httpHdrCcCreate(); - dup->mask = cc->mask; - dup->max_age = cc->max_age; - dup->s_maxage = cc->s_maxage; - dup->max_stale = cc->max_stale; - dup->min_fresh = cc->min_fresh; - return dup; + return (mask != 0); } void @@ -255,8 +232,7 @@ if (EBIT_TEST(cc->mask, flag) && flag != CC_OTHER) { /* print option name */ - packerPrintf(p, (pcount ? ", " SQUIDSTRINGPH : SQUIDSTRINGPH), - SQUIDSTRINGPRINT(CcFieldsInfo[flag].name)); + packerPrintf(p, (pcount ? ", %s": "%s") , CcAttrs[flag].name); /* handle options with values */ @@ -281,30 +257,26 @@ SQUIDSTRINGPRINT(cc->other)); } -/* negative max_age will clean old max_Age setting */ void -httpHdrCcSetMaxAge(HttpHdrCc * cc, int max_age) +HttpHdrCc::setMaxAge(int max_age_) { - assert(cc); - cc->max_age = max_age; + max_age = max_age_; - if (max_age >= 0) - EBIT_SET(cc->mask, CC_MAX_AGE); + if (max_age_ >= 0) + EBIT_SET(mask, CC_MAX_AGE); else - EBIT_CLR(cc->mask, CC_MAX_AGE); + EBIT_CLR(mask, CC_MAX_AGE); } -/* negative s_maxage will clean old s-maxage setting */ void -httpHdrCcSetSMaxAge(HttpHdrCc * cc, int s_maxage) +HttpHdrCc::setSMaxAge(int s_maxage_) { - assert(cc); - cc->s_maxage = s_maxage; + s_maxage = s_maxage_; - if (s_maxage >= 0) - EBIT_SET(cc->mask, CC_S_MAXAGE); + if (s_maxage_ >= 0) + EBIT_SET(mask, CC_S_MAXAGE); else - EBIT_CLR(cc->mask, CC_S_MAXAGE); + EBIT_CLR(mask, CC_S_MAXAGE); } void @@ -324,7 +296,7 @@ extern const HttpHeaderStat *dump_stat; /* argh! */ const int id = (int) val; const int valid_id = id >= 0 && id < CC_ENUM_END; - const char *name = valid_id ? CcFieldsInfo[id].name.termedBuf() : "INVALID"; + const char *name = valid_id ? CcAttrs[id].name : "INVALID"; if (count || valid_id) storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n", === added file 'src/HttpHdrCc.h' --- src/HttpHdrCc.h 1970-01-01 00:00:00 +0000 +++ src/HttpHdrCc.h 2011-09-12 22:54:38 +0000 @@ -0,0 +1,91 @@ +/* + * HttpHdrCc.h + * + * Created on: Sep 2, 2011 + * Author: Francesco Chemolli + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#ifndef SQUID_HTTPHEADERCACHECONTROL_H_ +#define SQUID_HTTPHEADERCACHECONTROL_H_ + +#include "config.h" +#include "MemPool.h" +#include "SquidString.h" + +/** Http Cache-control header representation + * + * Store, parse and output the Cache-control HTTP header. + */ +class HttpHdrCc +{ + +public: + int32_t mask; + int32_t max_age; + int32_t s_maxage; + int32_t max_stale; + int32_t stale_if_error; + int32_t min_fresh; + String other; + + HttpHdrCc(int32_t max_age_=-1, int32_t s_maxage_=-1, + int32_t max_stale_=-1, int32_t min_fresh_=-1) : + mask(0), max_age(max_age_), s_maxage(s_maxage_), + max_stale(max_stale_), stale_if_error(0), + min_fresh(min_fresh_) {} + + /** reset the structure to a clear state. + * + */ + void clear(); + /**parses the supplied string filling in HttpHdrCc's fields. + * + * \note: internal structures are not cleaned-up beforehand. + * caller must explicitly clear() beforehand if he wants that + */ + bool parseInit(const String &s); + /** set the max_age value + * + * \param max_age the new max age. Values <0 clear it. + */ + void setMaxAge(int32_t max_age); + + /** set the s-maxage + * + * \param s_maxage the new max age. Values <0 clear it. + */ + void setSMaxAge(int32_t s_maxage); + + MEMPROXY_CLASS(HttpHdrCc); + +}; + +MEMPROXY_CLASS_INLINE(HttpHdrCc); + +#endif /* SQUID_HTTPHEADERCACHECONTROL_H_ */ === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2011-08-29 03:47:54 +0000 +++ src/HttpHeader.cc 2011-09-12 16:07:03 +0000 @@ -1319,7 +1319,11 @@ getList(HDR_CACHE_CONTROL, &s); - cc = httpHdrCcParseCreate(&s); + cc=new HttpHdrCc(); + if (!cc->parseInit(s)) { + delete cc; + cc = NULL; + } HttpHeaderStats[owner].ccParsedCount++; === modified file 'src/HttpHeader.h' --- src/HttpHeader.h 2011-06-23 08:31:56 +0000 +++ src/HttpHeader.h 2011-09-12 22:54:38 +0000 @@ -37,6 +37,7 @@ #include "HttpHeaderRange.h" /* HttpHeader holds a HttpHeaderMask */ #include "HttpHeaderMask.h" +#include "HttpHdrCc.h" /* class forward declarations */ === modified file 'src/HttpReply.cc' --- src/HttpReply.cc 2011-07-16 15:21:48 +0000 +++ src/HttpReply.cc 2011-09-12 17:45:26 +0000 @@ -402,7 +402,7 @@ content_type.clean(); if (cache_control) { - httpHdrCcDestroy(cache_control); + delete cache_control; cache_control = NULL; } === modified file 'src/HttpRequest.cc' --- src/HttpRequest.cc 2011-08-04 03:21:06 +0000 +++ src/HttpRequest.cc 2011-09-12 17:45:26 +0000 @@ -145,7 +145,7 @@ header.clean(); if (cache_control) { - httpHdrCcDestroy(cache_control); + delete cache_control; cache_control = NULL; } === modified file 'src/Makefile.am' --- src/Makefile.am 2011-08-23 13:27:51 +0000 +++ src/Makefile.am 2011-09-12 22:54:38 +0000 @@ -341,6 +341,7 @@ HttpStatusCode.h \ HttpStatusLine.cc \ HttpStatusLine.h \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrRange.cc \ HttpHdrSc.cc \ @@ -1015,6 +1016,7 @@ cbdata.h \ ETag.cc \ HttpBody.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrContRange.h \ @@ -1072,7 +1074,7 @@ tests_testHttpReply_DEPENDENCIES= $(SQUID_CPPUNIT_LA) ## Tests for the ACLMaxUserIP class -## acl needs wordlist. wordlist needs MemBug +## acl needs wordlist. wordlist needs MemBuf ## MemBuf needs mem, MemBuf needs event, ## event needs cbdata. ## ACLMaxUserUP needs $(AUTH_LIBS) @@ -1108,6 +1110,7 @@ HttpHeaderTools.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrSc.cc \ HttpHdrScTarget.cc \ @@ -1268,6 +1271,7 @@ HttpBody.cc \ HttpHeader.cc \ HttpHeaderTools.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ @@ -1399,6 +1403,7 @@ fd.cc \ filemap.cc \ HttpBody.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrSc.cc \ @@ -1571,6 +1576,7 @@ HttpBody.cc \ HttpHeader.cc \ HttpHeaderTools.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ @@ -1749,6 +1755,7 @@ HttpBody.cc \ HttpHeader.cc \ HttpHeaderTools.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ @@ -1923,6 +1930,7 @@ $(HTCPSOURCE) \ http.cc \ HttpBody.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ @@ -2140,6 +2148,7 @@ HttpBody.cc \ HttpHeader.cc \ HttpHeaderTools.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ @@ -2270,6 +2279,7 @@ event.cc \ EventLoop.cc \ filemap.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ @@ -2504,6 +2514,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrSc.cc \ HttpHdrScTarget.cc \ @@ -2634,6 +2645,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrSc.cc \ HttpHdrScTarget.cc \ @@ -2758,6 +2770,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrSc.cc \ HttpHdrScTarget.cc \ @@ -2860,6 +2873,7 @@ $(HTCPSOURCE) \ http.cc \ HttpBody.cc \ + HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ === modified file 'src/client_side_request.cc' --- src/client_side_request.cc 2011-09-02 12:35:57 +0000 +++ src/client_side_request.cc 2011-09-12 23:25:55 +0000 @@ -67,6 +67,7 @@ #include "compat/inet_pton.h" #include "fde.h" #include "format/Tokens.h" +#include "HttpHdrCc.h" #include "HttpReply.h" #include "HttpRequest.h" #include "ip/QosConfig.h" === modified file 'src/http.cc' --- src/http.cc 2011-08-29 03:47:54 +0000 +++ src/http.cc 2011-09-12 19:05:57 +0000 @@ -1758,7 +1758,7 @@ HttpHdrCc *cc = hdr_in->getCc(); if (!cc) - cc = httpHdrCcCreate(); + cc = new HttpHdrCc(); #if 0 /* see bug 2330 */ /* Set no-cache if determined needed but not found */ @@ -1770,7 +1770,7 @@ if (!EBIT_TEST(cc->mask, CC_MAX_AGE) && !EBIT_TEST(cc->mask, CC_NO_CACHE)) { const char *url = entry ? entry->url() : urlCanonical(request); - httpHdrCcSetMaxAge(cc, getMaxAge(url)); + cc->setMaxAge(getMaxAge(url)); } @@ -1780,7 +1780,7 @@ hdr_out->putCc(cc); - httpHdrCcDestroy(cc); + delete cc; } /* maybe append Connection: keep-alive */ === modified file 'src/mime.cc' --- src/mime.cc 2011-01-28 07:58:53 +0000 +++ src/mime.cc 2011-09-12 19:05:57 +0000 @@ -462,9 +462,9 @@ reply->setHeaders(HTTP_OK, NULL, mimeGetContentType(icon), sb.st_size, sb.st_mtime, -1); - reply->cache_control = httpHdrCcCreate(); + reply->cache_control = new HttpHdrCc(); - httpHdrCcSetMaxAge(reply->cache_control, 86400); + reply->cache_control->setMaxAge(86400); reply->header.putCc(reply->cache_control); === modified file 'src/protos.h' --- src/protos.h 2011-08-26 16:50:49 +0000 +++ src/protos.h 2011-09-12 19:20:37 +0000 @@ -237,13 +237,7 @@ /* Http Cache Control Header Field */ SQUIDCEXTERN void httpHdrCcInitModule(void); SQUIDCEXTERN void httpHdrCcCleanModule(void); -SQUIDCEXTERN HttpHdrCc *httpHdrCcCreate(void); -SQUIDCEXTERN HttpHdrCc *httpHdrCcParseCreate(const String * str); -SQUIDCEXTERN void httpHdrCcDestroy(HttpHdrCc * cc); -SQUIDCEXTERN HttpHdrCc *httpHdrCcDup(const HttpHdrCc * cc); SQUIDCEXTERN void httpHdrCcPackInto(const HttpHdrCc * cc, Packer * p); -SQUIDCEXTERN void httpHdrCcSetMaxAge(HttpHdrCc * cc, int max_age); -SQUIDCEXTERN void httpHdrCcSetSMaxAge(HttpHdrCc * cc, int s_maxage); SQUIDCEXTERN void httpHdrCcUpdateStats(const HttpHdrCc * cc, StatHist * hist); void httpHdrCcStatDumper(StoreEntry * sentry, int idx, double val, double size, int count); === modified file 'src/structs.h' --- src/structs.h 2011-08-26 16:50:49 +0000 +++ src/structs.h 2011-09-02 10:54:19 +0000 @@ -696,21 +696,6 @@ String value; /* field-value from HTTP/1.1 */ }; -/* http cache control header field */ - -class HttpHdrCc -{ - -public: - int mask; - int max_age; - int s_maxage; - int max_stale; - int stale_if_error; - int min_fresh; - String other; -}; - /* per field statistics */ class HttpHeaderFieldStat # Begin bundle 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 wYMLHrF2jC8R6hw2k6/8XckU4UJBMXSuzA==