# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20120917133137-ubvw5xsnuaiovh3m # target_branch: ../trunk/ # testament_sha1: 90015ea1680ca3dc7c8cae47c1d85aeed302b466 # timestamp: 2012-09-17 15:32:13 +0200 # base_revision_id: kinkie@squid-cache.org-20120913113930-\ # cyu8k2mwqhyfy55e # # Begin patch === modified file 'src/AccessLogEntry.cc' --- src/AccessLogEntry.cc 2012-08-28 13:00:30 +0000 +++ src/AccessLogEntry.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "AccessLogEntry.h" #include "HttpReply.h" #include "HttpRequest.h" +#include "SquidConfig.h" #include "ssl/support.h" #if USE_SSL === modified file 'src/AccessLogEntry.h' --- src/AccessLogEntry.h 2012-08-28 13:00:30 +0000 +++ src/AccessLogEntry.h 2012-09-06 12:47:15 +0000 @@ -35,6 +35,7 @@ #include "HttpVersion.h" #include "HttpRequestMethod.h" #include "HierarchyLogEntry.h" +#include "icp_opcode.h" #include "ip/Address.h" #include "HttpRequestMethod.h" #if ICAP_CLIENT @@ -274,7 +275,7 @@ class StoreEntry; /* Should be in 'AccessLog.h' as the driver */ -extern void accessLogLogTo(customlog* log, AccessLogEntry::Pointer &al, ACLChecklist* checklist = NULL); +extern void accessLogLogTo(CustomLog* log, AccessLogEntry::Pointer &al, ACLChecklist* checklist = NULL); extern void accessLogLog(AccessLogEntry::Pointer &, ACLChecklist * checklist); extern void accessLogRotate(void); extern void accessLogClose(void); === modified file 'src/AuthReg.h' --- src/AuthReg.h 2012-08-31 16:28:10 +0000 +++ src/AuthReg.h 2012-09-17 13:31:37 +0000 @@ -1,8 +1,7 @@ #ifndef SQUID_AUTHREG_H_ #define SQUID_AUTHREG_H_ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 29 Authenticator * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/CacheDigest.h' --- src/CacheDigest.h 2012-08-29 00:12:28 +0000 +++ src/CacheDigest.h 2012-09-06 14:48:49 +0000 @@ -1,3 +1,5 @@ +#ifndef SQUID_CACHEDIGEST_H_ +#define SQUID_CACHEDIGEST_H_ /* * DEBUG: section 70 Cache Digest * AUTHOR: Alex Rousskov @@ -30,13 +32,23 @@ * */ -#ifndef SQUID_CACHEDIGEST_H_ -#define SQUID_CACHEDIGEST_H_ - +/* for cache_key */ #include "typedefs.h" + class CacheDigestGuessStats; class StoreEntry; +class CacheDigest { +public: + /* public, read-only */ + char *mask; /* bit mask */ + int mask_size; /* mask size in bytes */ + int capacity; /* expected maximum for .count, not a hard limit */ + int bits_per_entry; /* number of bits allocated for each entry from capacity */ + int count; /* number of digested entries */ + int del_count; /* number of deletions performed so far */ +}; + extern CacheDigest *cacheDigestCreate(int capacity, int bpe); extern void cacheDigestDestroy(CacheDigest * cd); extern CacheDigest *cacheDigestClone(const CacheDigest * cd); === modified file 'src/CacheManager.h' --- src/CacheManager.h 2012-09-01 14:38:36 +0000 +++ src/CacheManager.h 2012-09-10 09:44:06 +0000 @@ -48,6 +48,7 @@ */ class HttpRequest; +class CacheMgrPasswd; /** \ingroup CacheManagerAPI * a CacheManager - the menu system for interacting with squid. @@ -83,7 +84,7 @@ Mgr::CommandPointer ParseUrl(const char *url); void ParseHeaders(const HttpRequest * request, Mgr::ActionParams ¶ms); int CheckPassword(const Mgr::Command &cmd); - char *PasswdGet(cachemgr_passwd *, const char *); + char *PasswdGet(CacheMgrPasswd *, const char *); void registerProfile(const Mgr::ActionProfilePointer &profile); === added file 'src/CacheMgrPasswd.cc' --- src/CacheMgrPasswd.cc 1970-01-01 00:00:00 +0000 +++ src/CacheMgrPasswd.cc 2012-09-17 13:31:37 +0000 @@ -0,0 +1,33 @@ +/* + * 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. + * + */ + +#include "squid.h" +#include "CacheMgrPasswd.h" + + === added file 'src/CacheMgrPasswd.h' --- src/CacheMgrPasswd.h 1970-01-01 00:00:00 +0000 +++ src/CacheMgrPasswd.h 2012-09-17 13:31:37 +0000 @@ -0,0 +1,44 @@ +#ifndef SQUID_CACHEMGRPASSWD_H_ +#define SQUID_CACHEMGRPASSWD_H_ +/* + * 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. + * + */ + +class wordlist; + +//TODO: this class is misnamed and C-ish. Split into CacheMgrPasswd and +// CacheMgrPasswdList (std::list-derived) +class CacheMgrPasswd { +public: + char *passwd; + wordlist *actions; + CacheMgrPasswd *next; +}; + + +#endif /* SQUID_CACHEMGRPASSWD_H_ */ === added file 'src/CachePeer.h' --- src/CachePeer.h 1970-01-01 00:00:00 +0000 +++ src/CachePeer.h 2012-09-04 15:15:51 +0000 @@ -0,0 +1,206 @@ +#ifndef SQUID_CACHEPEER_H_ +#define SQUID_CACHEPEER_H_ +/* + * 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. + * + */ + +#include "enums.h" +#include "icp_opcode.h" +#include "ip/Address.h" + +#if USE_SSL +#include +#endif + +class domain_ping; +class domain_type; +class acl_access; +class PeerDigest; + +class CachePeer { +public: + u_int index; + char *name; + char *host; + peer_t type; + + Ip::Address in_addr; + + struct { + int pings_sent; + int pings_acked; + int fetches; + int rtt; + int ignored_replies; + int n_keepalives_sent; + int n_keepalives_recv; + time_t probe_start; + time_t last_query; + time_t last_reply; + time_t last_connect_failure; + time_t last_connect_probe; + int logged_state; /* so we can print dead/revived msgs */ + int conn_open; /* current opened connections */ + } stats; + + struct { + int version; + int counts[ICP_END+1]; + unsigned short port; + } icp; + +#if USE_HTCP + struct { + double version; + int counts[2]; + unsigned short port; + } htcp; +#endif + + unsigned short http_port; + domain_ping *peer_domain; + domain_type *typelist; + acl_access *access; + + struct { + unsigned int proxy_only:1; + unsigned int no_query:1; + unsigned int background_ping:1; + unsigned int no_digest:1; + unsigned int default_parent:1; + unsigned int roundrobin:1; + unsigned int weighted_roundrobin:1; + unsigned int mcast_responder:1; + unsigned int closest_only:1; +#if USE_HTCP + unsigned int htcp:1; + unsigned int htcp_oldsquid:1; + unsigned int htcp_no_clr:1; + unsigned int htcp_no_purge_clr:1; + unsigned int htcp_only_clr:1; + unsigned int htcp_forward_clr:1; +#endif + unsigned int no_netdb_exchange:1; +#if USE_DELAY_POOLS + unsigned int no_delay:1; +#endif + unsigned int allow_miss:1; + unsigned int carp:1; + struct { + unsigned int set:1; //If false, whole url is to be used. Overrides others + unsigned int scheme:1; + unsigned int host:1; + unsigned int port:1; + unsigned int path:1; + unsigned int params:1; + } carp_key; +#if USE_AUTH + unsigned int userhash:1; +#endif + unsigned int sourcehash:1; + unsigned int originserver:1; + unsigned int no_tproxy:1; +#if PEER_MULTICAST_SIBLINGS + unsigned int mcast_siblings:1; +#endif + } options; + + int weight; + int basetime; + + struct { + double avg_n_members; + int n_times_counted; + int n_replies_expected; + int ttl; + int id; + + struct { + unsigned int count_event_pending:1; + unsigned int counting:1; + } flags; + } mcast; +#if USE_CACHE_DIGESTS + + PeerDigest *digest; + char *digest_url; +#endif + + int tcp_up; /* 0 if a connect() fails */ + + Ip::Address addresses[10]; + int n_addresses; + int rr_count; + CachePeer *next; + int testing_now; + + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } carp; +#if USE_AUTH + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } userhash; +#endif + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } sourcehash; + + char *login; /* Proxy authorization */ + time_t connect_timeout; + int connect_fail_limit; + int max_conn; + char *domain; /* Forced domain */ +#if USE_SSL + + int use_ssl; + char *sslcert; + char *sslkey; + int sslversion; + char *ssloptions; + char *sslcipher; + char *sslcafile; + char *sslcapath; + char *sslcrlfile; + char *sslflags; + char *ssldomain; + SSL_CTX *sslContext; + SSL_SESSION *sslSession; +#endif + + int front_end_https; + int connection_auth; +}; + +#endif /* SQUID_CACHEPEER_H_ */ === modified file 'src/CpuAffinity.cc' --- src/CpuAffinity.cc 2012-08-31 16:57:39 +0000 +++ src/CpuAffinity.cc 2012-09-04 09:10:20 +0000 @@ -9,6 +9,7 @@ #include "CpuAffinitySet.h" #include "Debug.h" #include "globals.h" +#include "SquidConfig.h" #include "structs.h" #include "tools.h" === modified file 'src/DelayBucket.cc' --- src/DelayBucket.cc 2012-09-01 14:38:36 +0000 +++ src/DelayBucket.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #if USE_DELAY_POOLS #include "DelayBucket.h" #include "DelaySpec.h" +#include "SquidConfig.h" #include "Store.h" void === modified file 'src/DelayId.cc' --- src/DelayId.cc 2012-09-01 14:38:36 +0000 +++ src/DelayId.cc 2012-09-04 09:10:20 +0000 @@ -48,6 +48,7 @@ #include "DelayPool.h" #include "DelayPools.h" #include "HttpRequest.h" +#include "SquidConfig.h" DelayId::DelayId () : pool_ (0), compositeId(NULL), markedAsNoDelay(false) {} === modified file 'src/DiskIO/DiskDaemon/DiskdIOStrategy.cc' --- src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-08-31 16:57:39 +0000 +++ src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "fd.h" #include "Store.h" #include "StatCounters.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" #include "unlinkd.h" === modified file 'src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc' --- src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2012-09-04 09:10:20 +0000 @@ -38,8 +38,8 @@ #include "DiskThreadsIOStrategy.h" #include "fde.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "StatCounters.h" -/* for statfs */ #include "Store.h" void === modified file 'src/DiskIO/DiskThreads/aiops.cc' --- src/DiskIO/DiskThreads/aiops.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/aiops.cc 2012-09-04 09:10:20 +0000 @@ -36,16 +36,17 @@ #include "squid.h" #include "DiskThreads.h" +#include "SquidConfig.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if HAVE_SCHED_H -#include +#include #endif #include "DiskIO/DiskThreads/CommIO.h" #include "SquidTime.h" === modified file 'src/DiskIO/DiskThreads/aiops_win32.cc' --- src/DiskIO/DiskThreads/aiops_win32.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/aiops_win32.cc 2012-09-04 09:10:20 +0000 @@ -36,15 +36,16 @@ #include "squid_windows.h" #include "DiskIO/DiskThreads/CommIO.h" #include "DiskThreads.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define RIDICULOUS_LENGTH 4096 === modified file 'src/DiskIO/IpcIo/IpcIoFile.cc' --- src/DiskIO/IpcIo/IpcIoFile.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/IpcIo/IpcIoFile.cc 2012-09-04 09:10:20 +0000 @@ -18,6 +18,7 @@ #include "ipc/Queue.h" #include "ipc/StrandSearch.h" #include "ipc/UdsOp.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "tools.h" === modified file 'src/HttpHdrCc.cc' --- src/HttpHdrCc.cc 2012-08-31 16:57:39 +0000 +++ src/HttpHdrCc.cc 2012-09-04 11:58:36 +0000 @@ -33,6 +33,7 @@ #include "squid.h" #include "base/StringArea.h" #include "HttpHeader.h" +#include "HttpHeaderFieldStat.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "HttpHdrCc.h" === modified file 'src/HttpHdrSc.cc' --- src/HttpHdrSc.cc 2012-09-01 14:38:36 +0000 +++ src/HttpHdrSc.cc 2012-09-04 13:09:04 +0000 @@ -37,6 +37,8 @@ #include "squid.h" #include "HttpHdrSc.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" +#include "HttpHeaderFieldStat.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "Store.h" @@ -64,6 +66,7 @@ {"Other,", (http_hdr_type)SC_OTHER} /* ',' will protect from matches */ }; +class HttpHeaderFieldInfo; HttpHeaderFieldInfo *ScFieldsInfo = NULL; http_hdr_sc_type &operator++ (http_hdr_sc_type &aHeader) === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2012-08-31 16:57:39 +0000 +++ src/HttpHeader.cc 2012-09-04 13:09:04 +0000 @@ -36,6 +36,7 @@ #include "HttpHdrContRange.h" #include "HttpHdrSc.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "MemBuf.h" @@ -45,6 +46,7 @@ #include "StatHist.h" #include "Store.h" #include "StrList.h" +#include "SquidConfig.h" #include "SquidString.h" #include "TimeOrTag.h" @@ -161,6 +163,7 @@ {"Other:", HDR_OTHER, ftStr} /* ':' will not allow matches */ }; +class HttpHeaderFieldInfo; static HttpHeaderFieldInfo *Headers = NULL; http_hdr_type &operator++ (http_hdr_type &aHeader) === modified file 'src/HttpHeader.h' --- src/HttpHeader.h 2012-09-03 09:02:20 +0000 +++ src/HttpHeader.h 2012-09-09 19:41:47 +0000 @@ -178,7 +178,8 @@ hoEnd } http_hdr_owner_type; -struct _HttpHeaderFieldAttrs { +class HttpHeaderFieldAttrs { +public: const char *name; http_hdr_type id; field_type type; === added file 'src/HttpHeaderFieldInfo.h' --- src/HttpHeaderFieldInfo.h 1970-01-01 00:00:00 +0000 +++ src/HttpHeaderFieldInfo.h 2012-09-04 13:09:04 +0000 @@ -0,0 +1,49 @@ +#ifndef SQUID_HTTPHEADERFIELDINFO_H_ +#define SQUID_HTTPHEADERFIELDINFO_H_ +/* + * 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. + * + */ + +#include "SquidString.h" +#include "HttpHeaderFieldStat.h" + +/* compiled version of HttpHeaderFieldAttrs plus stats */ +class HttpHeaderFieldInfo +{ +public: + HttpHeaderFieldInfo() : id (HDR_ACCEPT), type (ftInvalid) {} + + http_hdr_type id; + String name; + field_type type; + HttpHeaderFieldStat stat; +}; + + + +#endif /* SQUID_HTTPHEADERFIELDINFO_H_ */ === added file 'src/HttpHeaderFieldStat.h' --- src/HttpHeaderFieldStat.h 1970-01-01 00:00:00 +0000 +++ src/HttpHeaderFieldStat.h 2012-09-17 13:31:37 +0000 @@ -0,0 +1,48 @@ +#ifndef SQUID_HTTPHEADERFIELDSTAT_H_ +#define SQUID_HTTPHEADERFIELDSTAT_H_ +/* + * 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. + * + */ + +/// per field statistics +class HttpHeaderFieldStat +{ +public: + HttpHeaderFieldStat() : aliveCount(0), seenCount(0), parsCount(0), errCount(0), repCount(0) {} + + int aliveCount; /* created but not destroyed (count) */ + int seenCount; /* #fields we've seen */ + int parsCount; /* #parsing attempts */ + int errCount; /* #pasring errors */ + int repCount; /* #repetitons */ +}; + + + + +#endif /* SQUID_HTTPHEADERFIELDSTAT_H_ */ === modified file 'src/HttpHeaderTools.cc' --- src/HttpHeaderTools.cc 2012-09-03 09:02:20 +0000 +++ src/HttpHeaderTools.cc 2012-09-09 19:41:47 +0000 @@ -40,9 +40,11 @@ #include "fde.h" #include "HttpHdrContRange.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" #include "HttpHeaderTools.h" #include "HttpRequest.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "Store.h" #include "StrList.h" === modified file 'src/HttpHeaderTools.h' --- src/HttpHeaderTools.h 2012-09-03 09:02:20 +0000 +++ src/HttpHeaderTools.h 2012-09-09 19:41:47 +0000 @@ -19,11 +19,11 @@ typedef std::list HeaderWithAclList; class acl_access; -struct _header_mangler { +class header_mangler { +public: acl_access *access_list; char *replacement; }; -typedef struct _header_mangler header_mangler; class StoreEntry; @@ -94,10 +94,10 @@ extern int httpHeaderParseOffset(const char *start, int64_t * off); -class HttpHeaderFieldInfo; class String; class HttpHeader; class HttpRequest; +class HttpHeaderFieldInfo; extern HttpHeaderFieldInfo *httpHeaderBuildFieldsInfo(const HttpHeaderFieldAttrs * attrs, int count); extern void httpHeaderDestroyFieldsInfo(HttpHeaderFieldInfo * info, int count); === modified file 'src/HttpMsg.cc' --- src/HttpMsg.cc 2012-09-01 14:38:36 +0000 +++ src/HttpMsg.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "MemBuf.h" #include "mime_header.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" HttpMsg::HttpMsg(http_hdr_owner_type owner): header(owner), cache_control(NULL), hdr_sz(0), content_length(0), protocol(AnyP::PROTO_NONE), === modified file 'src/HttpParser.cc' --- src/HttpParser.cc 2012-08-28 13:00:30 +0000 +++ src/HttpParser.cc 2012-09-04 09:10:20 +0000 @@ -1,8 +1,9 @@ #include "squid.h" #include "Debug.h" #include "HttpParser.h" +#include "profiler/Profiler.h" +#include "SquidConfig.h" #include "structs.h" -#include "profiler/Profiler.h" void HttpParser::clear() === modified file 'src/HttpReply.cc' --- src/HttpReply.cc 2012-09-01 14:38:36 +0000 +++ src/HttpReply.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "HttpReply.h" #include "HttpRequest.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StrList.h" === modified file 'src/HttpRequest.cc' --- src/HttpRequest.cc 2012-08-31 16:57:39 +0000 +++ src/HttpRequest.cc 2012-09-13 16:20:41 +0000 @@ -45,6 +45,7 @@ #include "HttpRequest.h" #include "log/Config.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" @@ -419,27 +420,6 @@ range = header.getRange(); } -/* request_flags */ -bool -request_flags::resetTCP() const -{ - return reset_tcp != 0; -} - -void -request_flags::setResetTCP() -{ - debugs(73, 9, "request_flags::setResetTCP"); - reset_tcp = 1; -} - -void -request_flags::clearResetTCP() -{ - debugs(73, 9, "request_flags::clearResetTCP"); - reset_tcp = 0; -} - #if ICAP_CLIENT Adaptation::Icap::History::Pointer HttpRequest::icapHistory() const @@ -492,27 +472,6 @@ return (range && range->specs.count > 1); } -void -request_flags::destinationIPLookupCompleted() -{ - destinationIPLookedUp_ = true; -} - -bool -request_flags::destinationIPLookedUp() const -{ - return destinationIPLookedUp_; -} - -request_flags -request_flags::cloneAdaptationImmune() const -{ - // At the time of writing, all flags where either safe to copy after - // adaptation or were not set at the time of the adaptation. If there - // are flags that are different, they should be cleared in the clone. - return *this; -} - bool HttpRequest::bodyNibbled() const { @@ -622,7 +581,7 @@ // Because it failed verification, or someone bypassed the security tests // we cannot cache the reponse for sharing between clients. // TODO: update cache to store for particular clients only (going to same Host: and destination IP) - if (!flags.hostVerified && (flags.intercepted || flags.spoof_client_ip)) + if (!flags.hostVerified() && (flags.intercepted() || flags.spoofClientIp())) return false; if (protocol == AnyP::PROTO_HTTP) @@ -652,7 +611,7 @@ bool HttpRequest::conditional() const { - return flags.ims || + return flags.hasIMS() || header.has(HDR_IF_MATCH) || header.has(HDR_IF_NONE_MATCH); } === modified file 'src/HttpRequest.h' --- src/HttpRequest.h 2012-09-01 14:38:36 +0000 +++ src/HttpRequest.h 2012-09-14 11:35:12 +0000 @@ -33,9 +33,11 @@ #include "base/CbcPointer.h" #include "Debug.h" +#include "err_type.h" #include "HierarchyLogEntry.h" #include "HttpMsg.h" #include "HttpRequestMethod.h" +#include "RequestFlags.h" #if USE_AUTH #include "auth/UserRequest.h" @@ -161,7 +163,7 @@ char *canonical; - request_flags flags; + RequestFlags flags; HttpHdrRange *range; === modified file 'src/HttpRequestMethod.h' --- src/HttpRequestMethod.h 2012-09-01 14:38:36 +0000 +++ src/HttpRequestMethod.h 2012-09-04 09:10:20 +0000 @@ -34,6 +34,8 @@ #include "SquidString.h" #include "structs.h" +class SquidConfig; + #include enum _method_t { === modified file 'src/ICP.h' --- src/ICP.h 2012-09-01 14:38:36 +0000 +++ src/ICP.h 2012-09-01 21:00:18 +0000 @@ -76,6 +76,8 @@ icp_opcode getOpCode() const; #endif }; +typedef struct _icp_common_t icp_common_t; + #ifdef __cplusplus === modified file 'src/Makefile.am' --- src/Makefile.am 2012-09-01 14:24:50 +0000 +++ src/Makefile.am 2012-09-10 12:49:35 +0000 @@ -258,6 +258,7 @@ CommCalls.h \ DescriptorSet.cc \ DescriptorSet.h \ + SquidConfig.h \ SquidConfig.cc squid_SOURCES = \ @@ -268,10 +269,16 @@ AsyncEngine.h \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ + CacheMgrPasswd.h \ + CacheMgrPasswd.cc \ cache_cf.cc \ CacheDigest.h \ CacheDigest.cc \ cache_manager.cc \ + CachePeer.h \ CacheManager.h \ carp.h \ carp.cc \ @@ -362,6 +369,7 @@ HttpStatusCode.h \ HttpStatusLine.cc \ HttpStatusLine.h \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -377,6 +385,7 @@ HttpHeader.cc \ HttpHeaderMask.h \ HttpHeaderRange.h \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpBody.h \ @@ -388,6 +397,8 @@ HttpParser.h \ HttpReply.cc \ HttpReply.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequest.h \ HttpRequestMethod.cc \ @@ -1106,6 +1117,7 @@ ETag.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1119,6 +1131,7 @@ HttpHeader.h \ HttpHeader.cc \ HttpHeaderMask.h \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpControlMsg.h \ @@ -1131,6 +1144,8 @@ HttpStatusLine.h \ Mem.h \ mem.cc \ + RegexList.h \ + RegexList.cc \ MemBuf.cc \ MemBuf.h \ mime_header.h \ @@ -1145,6 +1160,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -1207,10 +1223,12 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1253,6 +1271,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_debug.cc \ tests/stub_DelayId.cc \ @@ -1349,6 +1368,8 @@ debug.cc \ HttpParser.cc \ HttpParser.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ Mem.h \ @@ -1365,6 +1386,11 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ + CacheMgrPasswd.h \ + CacheMgrPasswd.cc \ cache_cf.cc \ CacheDigest.h \ CacheDigest.cc \ @@ -1420,8 +1446,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1593,6 +1621,7 @@ filemap.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1600,6 +1629,7 @@ HttpHdrSc.cc \ HttpHdrScTarget.cc \ HttpHdrRange.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -1622,6 +1652,8 @@ refresh.h \ refresh.cc \ RemovalPolicy.cc \ + RequestFlags.h \ + RequestFlags.cc \ StatCounters.h \ StatCounters.cc \ StatHist.h \ @@ -1653,6 +1685,7 @@ tests/stub_access_log.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_client_db.cc \ @@ -1748,6 +1781,11 @@ CacheDigest.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ + CacheMgrPasswd.h \ + CacheMgrPasswd.cc \ cache_cf.cc \ cache_manager.cc \ carp.h \ @@ -1806,8 +1844,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1819,6 +1859,8 @@ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -1981,6 +2023,11 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ + CacheMgrPasswd.h \ + CacheMgrPasswd.cc \ cache_cf.cc \ carp.h \ carp.cc \ @@ -2038,8 +2085,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2051,6 +2100,8 @@ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -2209,6 +2260,11 @@ BodyPipe.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ + CacheMgrPasswd.h \ + CacheMgrPasswd.cc \ cache_cf.cc \ cache_manager.cc \ CacheDigest.h \ @@ -2265,6 +2321,7 @@ http.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2274,12 +2331,15 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -2440,6 +2500,7 @@ String.cc \ structs.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -2473,6 +2534,8 @@ $(ACL_REGISTRATION_SOURCES) \ HttpParser.cc \ HttpParser.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ Mem.h \ @@ -2492,6 +2555,11 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ + CacheMgrPasswd.h \ + CacheMgrPasswd.cc \ cache_cf.cc \ debug.cc \ CacheDigest.h \ @@ -2544,8 +2612,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2712,6 +2782,7 @@ EventLoop.cc \ FileMap.h \ filemap.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2719,12 +2790,15 @@ HttpHdrRange.cc \ HttpHdrSc.cc \ HttpHdrScTarget.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ HttpHeader.cc \ HttpMsg.cc \ HttpRequestMethod.cc \ + RequestFlags.cc \ + RequestFlags.h \ int.h \ int.cc \ SquidList.h \ @@ -2769,6 +2843,7 @@ tests/stub_access_log.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_client_side_request.cc \ @@ -2867,6 +2942,7 @@ tests/testString.cc \ tests/testString.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -2943,6 +3019,8 @@ HttpStatusLine.cc \ int.h \ int.cc \ + RequestFlags.h \ + RequestFlags.cc \ SquidList.h \ SquidList.cc \ MemObject.cc \ @@ -2980,6 +3058,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -2991,6 +3070,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3001,6 +3081,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3090,6 +3171,7 @@ fd.cc \ FileMap.h \ filemap.cc \ + HttpHeaderFieldStat.h \ HttpBody.h \ HttpBody.cc \ HttpHdrCc.cc \ @@ -3099,6 +3181,7 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ @@ -3117,6 +3200,8 @@ Packer.cc \ Parsing.cc \ RemovalPolicy.cc \ + RequestFlags.cc \ + RequestFlags.h \ StatCounters.h \ StatCounters.cc \ StatHist.h \ @@ -3152,6 +3237,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ client_db.h \ @@ -3288,6 +3374,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -3298,6 +3385,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3308,6 +3396,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3439,6 +3528,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -3451,6 +3541,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3461,6 +3552,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3530,6 +3622,11 @@ BodyPipe.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ + CacheMgrPasswd.h \ + CacheMgrPasswd.cc \ cache_cf.cc \ cache_manager.cc \ CacheDigest.h \ @@ -3585,6 +3682,7 @@ http.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3594,12 +3692,15 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -3681,8 +3782,8 @@ StoreMetaVary.cc \ StoreSwapLogData.cc \ String.cc \ - StrList.h \ - StrList.cc \ + StrList.h \ + StrList.cc \ SwapDir.cc \ MemStore.cc \ tests/stub_debug.cc \ @@ -3765,6 +3866,7 @@ tests/testConfigParser.cc \ tests/testConfigParser.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ === modified file 'src/MemObject.cc' --- src/MemObject.cc 2012-09-01 14:38:36 +0000 +++ src/MemObject.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "MemBuf.h" #include "MemObject.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreClient.h" === modified file 'src/MemStore.cc' --- src/MemStore.cc 2012-09-01 14:38:36 +0000 +++ src/MemStore.cc 2012-09-04 09:10:20 +0000 @@ -11,6 +11,7 @@ #include "MemObject.h" #include "MemStore.h" #include "mime_header.h" +#include "SquidConfig.h" #include "StoreStats.h" #include "tools.h" === modified file 'src/PeerDigest.h' --- src/PeerDigest.h 2012-09-01 14:38:36 +0000 +++ src/PeerDigest.h 2012-09-04 14:38:44 +0000 @@ -38,7 +38,8 @@ /* for CacheDigestGuessStats */ #include "StatCounters.h" -struct _Version { +class Version { +public: short int current; /* current version */ short int required; /* minimal version that can safely handle current version */ }; @@ -59,7 +60,8 @@ int reserved[32 - 6]; }; -struct _DigestFetchState { +class DigestFetchState { +public: PeerDigest *pd; StoreEntry *entry; StoreEntry *old_entry; @@ -90,7 +92,7 @@ void *operator new (size_t); void operator delete(void *); - struct peer *peer; /**< pointer back to peer structure, argh */ + CachePeer *peer; /**< pointer back to peer structure, argh */ CacheDigest *cd; /**< actual digest structure */ String host; /**< copy of peer->host */ const char *req_result; /**< text status of the last request */ @@ -129,7 +131,7 @@ extern const Version CacheDigestVer; -extern PeerDigest *peerDigestCreate(peer * p); +extern PeerDigest *peerDigestCreate(CachePeer * p); extern void peerDigestNeeded(PeerDigest * pd); extern void peerDigestNotePeerGone(PeerDigest * pd); extern void peerDigestStatsReport(const PeerDigest * pd, StoreEntry * e); === modified file 'src/PeerSelectState.h' --- src/PeerSelectState.h 2012-08-28 13:00:30 +0000 +++ src/PeerSelectState.h 2012-09-04 14:38:44 +0000 @@ -51,18 +51,18 @@ SQUIDCEXTERN void peerSelectInit(void); /** - * A peer which has been selected as a possible destination. + * A CachePeer which has been selected as a possible destination. * Listed as pointers here so as to prevent duplicates being added but will * be converted to a set of IP address path options before handing back out * to the caller. * * Certain connection flags and outgoing settings will also be looked up and - * set based on the received request and peer settings before handing back. + * set based on the received request and CachePeer settings before handing back. */ class FwdServer { public: - peer *_peer; /* NULL --> origin server */ + CachePeer *_peer; /* NULL --> origin server */ hier_code code; FwdServer *next; }; @@ -86,21 +86,21 @@ FwdServer *servers; ///< temporary linked list of peers we will pass back. /* - * Why are these Ip::Address instead of peer *? Because a - * peer structure can become invalid during the peer selection + * Why are these Ip::Address instead of CachePeer *? Because a + * CachePeer structure can become invalid during the CachePeer selection * phase, specifically after a reconfigure. Thus we need to lookup - * the peer * based on the address when we are finally ready to - * reference the peer structure. + * the CachePeer * based on the address when we are finally ready to + * reference the CachePeer structure. */ Ip::Address first_parent_miss; Ip::Address closest_parent_miss; /* - * ->hit can be peer* because it should only be + * ->hit can be CachePeer* because it should only be * accessed during the thread when it is set */ - peer *hit; + CachePeer *hit; peer_t hit_type; ping_data ping; ACLChecklist *acl_checklist; === added file 'src/RefreshPattern.h' --- src/RefreshPattern.h 1970-01-01 00:00:00 +0000 +++ src/RefreshPattern.h 2012-09-10 07:59:18 +0000 @@ -0,0 +1,60 @@ +#ifndef SQUID_REFRESHPATTERN_H_ +#define SQUID_REFRESHPATTERN_H_ +/* + * 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. + * + */ + +class RefreshPattern { +public: + const char *pattern; + regex_t compiled_pattern; + time_t min; + double pct; + time_t max; + RefreshPattern *next; + + struct { + unsigned int icase:1; + unsigned int refresh_ims:1; + unsigned int store_stale:1; +#if USE_HTTP_VIOLATIONS + unsigned int override_expire:1; + unsigned int override_lastmod:1; + unsigned int reload_into_ims:1; + unsigned int ignore_reload:1; + unsigned int ignore_no_cache:1; + unsigned int ignore_no_store:1; + unsigned int ignore_must_revalidate:1; + unsigned int ignore_private:1; + unsigned int ignore_auth:1; +#endif + } flags; + int max_stale; +}; + +#endif /* SQUID_REFRESHPATTERN_H_ */ === added file 'src/RegexList.cc' --- src/RegexList.cc 1970-01-01 00:00:00 +0000 +++ src/RegexList.cc 2012-09-06 11:56:46 +0000 @@ -0,0 +1,32 @@ +/* + * 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. + * + */ + +#include "squid.h" +#include "RegexList.h" + === added file 'src/RegexList.h' --- src/RegexList.h 1970-01-01 00:00:00 +0000 +++ src/RegexList.h 2012-09-17 13:31:37 +0000 @@ -0,0 +1,40 @@ +#ifndef SQUID_REGEXLIST_H_ +#define SQUID_REGEXLIST_H_ +/* + * 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. + * + */ + +class RegexList { +public: + int flags; + char *pattern; + regex_t regex; + RegexList *next; +}; + +#endif /* SQUID_REGEXLIST_H_ */ === added file 'src/RequestFlags.cc' --- src/RequestFlags.cc 1970-01-01 00:00:00 +0000 +++ src/RequestFlags.cc 2012-09-10 12:49:35 +0000 @@ -0,0 +1,97 @@ +/* + * DEBUG: section 73 HTTP Request + * AUTHOR: Duane Wessels + * + * 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. + * + */ + +#include "squid.h" +#include "Debug.h" +#include "RequestFlags.h" + +// TODO: move to .cci +/* RequestFlags */ +bool +RequestFlags::resetTCP() const +{ + return resetTCP_; +} + +void +RequestFlags::setResetTCP() +{ + debugs(73, 9, "request_flags::setResetTCP"); + resetTCP_ = true; +} + +void +RequestFlags::clearResetTCP() +{ + debugs(73, 9, "request_flags::clearResetTCP"); + resetTCP_ = false; +} + +void +RequestFlags::destinationIPLookupCompleted() +{ + destinationIPLookedUp_ = true; +} + +bool +RequestFlags::destinationIPLookedUp() const +{ + return destinationIPLookedUp_; +} + +bool +RequestFlags::isRanged() const +{ + return isRanged_; +} + +void +RequestFlags::setRanged() +{ + isRanged_ = true; +} + +void +RequestFlags::clearRanged() +{ + isRanged_ = false; +} + + +RequestFlags +RequestFlags::cloneAdaptationImmune() const +{ + // At the time of writing, all flags where either safe to copy after + // adaptation or were not set at the time of the adaptation. If there + // are flags that are different, they should be cleared in the clone. + return *this; +} === added file 'src/RequestFlags.h' --- src/RequestFlags.h 1970-01-01 00:00:00 +0000 +++ src/RequestFlags.h 2012-09-13 16:20:41 +0000 @@ -0,0 +1,232 @@ +#ifndef SQUID_REQUESTFLAGS_H_ +#define SQUID_REQUESTFLAGS_H_ +/* + * DEBUG: section 73 HTTP Request + * AUTHOR: Duane Wessels + * + * 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. + * + */ + +class RequestFlags { +public: + RequestFlags(): + nocache(false), ims(false), auth_(false), cachable(false), + hierarchical_(false), loopdetect(false), proxy_keepalive(false), proxying_(false), + refresh_(false), redirected(false), need_validation(false), + fail_on_validation_err(false), stale_if_hit(false), nocache_hack(false), accelerated_(false), + ignore_cc(false), intercepted_(false), hostVerified_(false), spoof_client_ip(false), + internal(false), internalclient(false), must_keepalive(false), connection_auth_wanted(false), connection_auth_disabled(false), connection_proxy_auth(false), pinned_(false), + canRePin_(false), authSent_(false), noDirect_(false), chunkedReply_(false), + streamError_(false), sslPeek_(false), + doneFollowXForwardedFor(!FOLLOW_X_FORWARDED_FOR), + sslBumped_(false), destinationIPLookedUp_(false), resetTCP_(false), + isRanged_(false) + {} + + // When adding new flags, please update cloneAdaptationImmune() as needed. + bool resetTCP() const; + void setResetTCP(); + void clearResetTCP(); + void destinationIPLookupCompleted(); + bool destinationIPLookedUp() const; + // returns a partial copy of the flags that includes only those flags + // that are safe for a related (e.g., ICAP-adapted) request to inherit + RequestFlags cloneAdaptationImmune() const; + + bool isRanged() const; + void setRanged(); + void clearRanged(); + + bool sslBumped() const { return sslBumped_; } + void setSslBumped(bool newValue=true) { sslBumped_=newValue; } + void clearSslBumpeD() { sslBumped_=false; } + + bool doneFollowXFF() const { return doneFollowXForwardedFor; } + void setDoneFollowXFF() { + doneFollowXForwardedFor = true; + } + void clearDoneFollowXFF() { + /* do not allow clearing if FOLLOW_X_FORWARDED_FOR is unset */ + doneFollowXForwardedFor = false || !FOLLOW_X_FORWARDED_FOR; + } + + bool sslPeek() const { return sslPeek_; } + void setSslPeek() { sslPeek_=true; } + void clearSslPeek() { sslPeek_=false; } + + bool hadStreamError() const { return streamError_; } + void setStreamError() { streamError_ = true; } + void clearStreamError() { streamError_ = false; } + + bool isReplyChunked() const { return chunkedReply_; } + void markReplyChunked() { chunkedReply_ = true; } + + void setNoDirect() { noDirect_=true; } + bool noDirect() const{ return noDirect_; } + + bool authSent() const { return authSent_; } + void markAuthSent() { authSent_=true;} + + bool canRePin() const { return canRePin_; } + void allowRepinning() { canRePin_=true; } + + void markPinned() { pinned_ = true; } + void clearPinned() { pinned_ = false; } + bool pinned() const { return pinned_; } + + //XXX: oddly this is set in client_side_request.cc, but never checked. + bool wantConnectionProxyAuth() const { return connection_proxy_auth; } + void requestConnectionProxyAuth() { connection_proxy_auth=true; } + + void disableConnectionAuth() { connection_auth_disabled=true; } + bool connectionAuthDisabled() const { return connection_auth_disabled; } + + void wantConnectionAuth() { connection_auth_wanted=true; } + bool connectionAuthWanted() const { return connection_auth_wanted; } + + void setMustKeepalive() { must_keepalive = true; } + bool mustKeepalive() const { return must_keepalive; } + + //XXX: oddly this is set in client_side_request.cc but never checked. + void setInternalClient() { internalclient=true;} + + void markInternal() { internal=true; } + bool isInternal() const { return internal; } + + bool spoofClientIp() const { return spoof_client_ip; } + void setSpoofClientIp() { spoof_client_ip = true; } + + bool hostVerified() const { return hostVerified_; } + void markHostVerified() { hostVerified_=true; } + + bool intercepted() const { return intercepted_; } + void markIntercepted() { intercepted_=true; } + + bool ignoringCacheControl() const { return ignore_cc; } + void ignoreCacheControl() { ignore_cc=true; } + + bool accelerated() const { return accelerated_; } + void markAccelerated() { accelerated_ = true; } + + /* nocache_hack is only enabled if USE_HTTP_VIOLATIONS is set at build-time. + * Compilers will have an easy time optimizing to a NOP otherwise. */ + void hackNocache() { if (USE_HTTP_VIOLATIONS) nocache_hack=true; } + bool noCacheHackEnabled() const { return USE_HTTP_VIOLATIONS && nocache_hack; } + + void setStaleIfHit() { stale_if_hit=true; } + void clearStaleIfHit() { stale_if_hit=false; } + bool staleIfHit() const { return stale_if_hit; } + + void setFailOnValidationError() { fail_on_validation_err=true; } + bool failOnValidationError() const { return fail_on_validation_err; } + + bool validationNeeded() const { return need_validation; } + void setNeedValidation() { need_validation=true; } + + bool isRedirected() const { return redirected; } + void markRedirected() { redirected=true; } + + bool refresh() const { return refresh_; } + void setRefresh() { refresh_ = true; } + + bool proxying() const { return proxying_; } + void setProxying() { proxying_ = true; } + void clearProxying() { proxying_ = false; } + + bool proxyKeepalive() const { return proxy_keepalive; } + void setProxyKeepalive() { proxy_keepalive=true;} + void clearProxyKeepalive() { proxy_keepalive=false; } + + bool loopDetect() const { return loopdetect; } + void setLoopDetect() { loopdetect = 1; } + + bool hierarchical() const { return hierarchical_; } + void setHierarchical() { hierarchical_=true; } + void clearHierarchical() { hierarchical_=true; } + + bool isCachable() const { return cachable; } + void setCachable(bool newValue=true) { cachable = newValue; } + void setNotCachable() { cachable = false; } + + bool hasAuth() const { return auth_; } + void markAuth() { auth_=true; } + + bool hasIMS() const { return ims; } + void setIMS() { ims=true; } + void clearIMS() { ims=false; } + + bool noCache() const { return nocache; } + void setNocache() { nocache=true;} +private: + bool nocache :1; ///< whether the response to this request may be READ from cache + bool ims :1; + bool auth_ :1; + bool cachable :1; ///< whether the response to thie request may be stored in the cache + bool hierarchical_ :1; + bool loopdetect :1; + bool proxy_keepalive :1; + bool proxying_ :1; /* this should be killed, also in httpstateflags */ + bool refresh_ :1; + bool redirected :1; + bool need_validation :1; + bool fail_on_validation_err :1; ///< whether we should fail if validation fails + bool stale_if_hit :1; ///< reply is stale if it is a hit + /* for changing/ignoring no-cache requests. Unused unless USE_HTTP_VIOLATIONS */ + bool nocache_hack :1; + bool accelerated_ :1; /// +#endif + +class acl_access; +class acl_size_t; +class AclDenyInfoList; +class CacheMgrPasswd; +class HeaderManglers; +class RefreshPattern; +class RemovalPolicySettings; +class SwapDir; + +namespace AnyP { +class PortCfg; +} + +class SquidConfig { +public: + struct { + /* These should be for the Store::Root instance. + * this needs pluggable parsing to be done smoothly. + */ + int highWaterMark; + int lowWaterMark; + } Swap; + + YesNoNone memShared; ///< whether the memory cache is shared among workers + size_t memMaxSize; + + struct { + int64_t min; + int pct; + int64_t max; + } quickAbort; + int64_t readAheadGap; + RemovalPolicySettings *replPolicy; + RemovalPolicySettings *memPolicy; +#if USE_HTTP_VIOLATIONS + time_t negativeTtl; +#endif + time_t maxStale; + time_t negativeDnsTtl; + time_t positiveDnsTtl; + time_t shutdownLifetime; + time_t backgroundPingRate; + + struct { + time_t read; + time_t write; + time_t lifetime; + time_t connect; + time_t forward; + time_t peer_connect; + time_t request; + time_t clientIdlePconn; + time_t serverIdlePconn; + time_t siteSelect; + time_t deadPeer; + int icp_query; /* msec */ + int icp_query_max; /* msec */ + int icp_query_min; /* msec */ + int mcast_icp_query; /* msec */ + +#if !USE_DNSHELPER + time_msec_t idns_retransmit; + time_msec_t idns_query; +#endif + + } Timeout; + size_t maxRequestHeaderSize; + int64_t maxRequestBodySize; + int64_t maxChunkedRequestBodySize; + size_t maxRequestBufferSize; + size_t maxReplyHeaderSize; + acl_size_t *ReplyBodySize; + + struct { + unsigned short icp; +#if USE_HTCP + + unsigned short htcp; +#endif +#if SQUID_SNMP + + unsigned short snmp; +#endif + } Port; + + struct { + AnyP::PortCfg *http; +#if USE_SSL + AnyP::PortCfg *https; +#endif + } Sockaddr; +#if SQUID_SNMP + + struct { + char *configFile; + char *agentInfo; + } Snmp; +#endif +#if USE_WCCP + + struct { + Ip::Address router; + Ip::Address address; + int version; + } Wccp; +#endif +#if USE_WCCPv2 + + struct { + Ip::Address_list *router; + Ip::Address address; + int forwarding_method; + int return_method; + int assignment_method; + int weight; + int rebuildwait; + void *info; + } Wccp2; +#endif + +#if USE_ICMP + IcmpConfig pinger; +#endif + + char *as_whois_server; + + struct { + char *store; + char *swap; + CustomLog *accesslogs; +#if ICAP_CLIENT + CustomLog *icaplogs; +#endif + int rotateNumber; + } Log; + char *adminEmail; + char *EmailFrom; + char *EmailProgram; + char *effectiveUser; + char *visible_appname_string; + char *effectiveGroup; + + struct { +#if USE_DNSHELPER + char *dnsserver; +#endif + + wordlist *redirect; +#if USE_UNLINKD + + char *unlinkd; +#endif + + char *diskd; +#if USE_SSL + + char *ssl_password; +#endif + + } Program; +#if USE_DNSHELPER + HelperChildConfig dnsChildren; +#endif + + HelperChildConfig redirectChildren; + time_t authenticateGCInterval; + time_t authenticateTTL; + time_t authenticateIpTTL; + + struct { + char *surrogate_id; + } Accel; + char *appendDomain; + size_t appendDomainLen; + char *pidFilename; + char *netdbFilename; + char *mimeTablePathname; + char *etcHostsPath; + char *visibleHostname; + char *uniqueHostname; + wordlist *hostnameAliases; + char *errHtmlText; + + struct { + char *host; + char *file; + time_t period; + unsigned short port; + } Announce; + + struct { + + Ip::Address udp_incoming; + Ip::Address udp_outgoing; +#if SQUID_SNMP + Ip::Address snmp_incoming; + Ip::Address snmp_outgoing; +#endif + /* FIXME INET6 : this should really be a CIDR value */ + Ip::Address client_netmask; + } Addrs; + size_t tcpRcvBufsz; + size_t udpMaxHitObjsz; + wordlist *hierarchy_stoplist; + wordlist *mcast_group_list; + wordlist *dns_nameservers; + CachePeer *peers; + int npeers; + + struct { + int size; + int low; + int high; + } ipcache; + + struct { + int size; + } fqdncache; + int minDirectHops; + int minDirectRtt; + CacheMgrPasswd *passwd_list; + + struct { + int objectsPerBucket; + int64_t avgObjectSize; + int64_t maxObjectSize; + int64_t minObjectSize; + size_t maxInMemObjSize; + } Store; + + struct { + int high; + int low; + time_t period; + } Netdb; + + struct { + int log_udp; + int res_defnames; + int anonymizer; + int client_db; + int query_icmp; + int icp_hit_stale; + int buffered_logs; + int common_log; + int log_mime_hdrs; + int log_fqdn; + int announce; + int mem_pools; + int test_reachability; + int half_closed_clients; + int refresh_all_ims; +#if USE_HTTP_VIOLATIONS + + int reload_into_ims; +#endif + + int offline; + int redir_rewrites_host; + int prefer_direct; + int nonhierarchical_direct; + int strip_query_terms; + int redirector_bypass; + int ignore_unknown_nameservers; + int client_pconns; + int server_pconns; + int error_pconns; +#if USE_CACHE_DIGESTS + + int digest_generation; +#endif + + int ie_refresh; + int vary_ignore_expire; + int pipeline_prefetch; + int surrogate_is_remote; + int request_entities; + int detect_broken_server_pconns; + int balance_on_multiple_ip; + int relaxed_header_parser; + int check_hostnames; + int allow_underscore; + int via; + int emailErrData; + int httpd_suppress_version_string; + int global_internal_static; + +#if FOLLOW_X_FORWARDED_FOR + int acl_uses_indirect_client; + int delay_pool_uses_indirect_client; + int log_uses_indirect_client; +#if LINUX_NETFILTER + int tproxy_uses_indirect_client; +#endif +#endif /* FOLLOW_X_FORWARDED_FOR */ + + int WIN32_IpAddrChangeMonitor; + int memory_cache_first; + int memory_cache_disk; + int hostStrictVerify; + int client_dst_passthru; + } onoff; + + int forward_max_tries; + int connect_retries; + + class ACL *aclList; + + struct { + acl_access *http; + acl_access *adapted_http; + acl_access *icp; + acl_access *miss; + acl_access *NeverDirect; + acl_access *AlwaysDirect; + acl_access *ASlists; + acl_access *noCache; + acl_access *log; +#if SQUID_SNMP + + acl_access *snmp; +#endif +#if USE_HTTP_VIOLATIONS + acl_access *brokenPosts; +#endif + acl_access *redirector; + acl_access *reply; + AclAddress *outgoing_address; +#if USE_HTCP + + acl_access *htcp; + acl_access *htcp_clr; +#endif + +#if USE_SSL + acl_access *ssl_bump; +#endif +#if FOLLOW_X_FORWARDED_FOR + acl_access *followXFF; +#endif /* FOLLOW_X_FORWARDED_FOR */ + +#if ICAP_CLIENT + acl_access* icap; +#endif + } accessList; + AclDenyInfoList *denyInfoList; + + struct { + size_t list_width; + int list_wrap; + char *anon_user; + int passive; + int epsv_all; + int epsv; + int eprt; + int sanitycheck; + int telnet; + } Ftp; + RefreshPattern *Refresh; + + struct _cacheSwap { + RefCount *swapDirs; + int n_allocated; + int n_configured; + /// number of disk processes required to support all cache_dirs + int n_strands; + } cacheSwap; + /* + * I'm sick of having to keep doing this .. + */ +#define INDEXSD(i) (Config.cacheSwap.swapDirs[(i)].getRaw()) + + struct { + char *directory; + int use_short_names; + } icons; + char *errorDirectory; +#if USE_ERR_LOCALES + char *errorDefaultLanguage; + int errorLogMissingLanguages; +#endif + char *errorStylesheet; + + struct { + int onerror; + } retry; + + struct { + int64_t limit; + } MemPools; +#if USE_DELAY_POOLS + + DelayConfig Delay; + ClientDelayConfig ClientDelay; +#endif + + struct { + struct { + int average; + int min_poll; + } dns, udp, tcp; + } comm_incoming; + int max_open_disk_fds; + int uri_whitespace; + acl_size_t *rangeOffsetLimit; +#if MULTICAST_MISS_STREAM + + struct { + + Ip::Address addr; + int ttl; + unsigned short port; + char *encode_key; + } mcast_miss; +#endif + + /// request_header_access and request_header_replace + HeaderManglers *request_header_access; + /// reply_header_access and reply_header_replace + HeaderManglers *reply_header_access; + ///request_header_add access list + HeaderWithAclList *request_header_add; + char *coredump_dir; + char *chroot_dir; +#if USE_CACHE_DIGESTS + + struct { + int bits_per_entry; + time_t rebuild_period; + time_t rewrite_period; + size_t swapout_chunk_size; + int rebuild_chunk_percentage; + } digest; +#endif +#if USE_SSL + + struct { + int unclean_shutdown; + char *ssl_engine; + } SSL; +#endif + + wordlist *ext_methods; + + struct { + int high_rptm; + int high_pf; + size_t high_memory; + } warnings; + char *store_dir_select_algorithm; + int sleep_after_fork; /* microseconds */ + time_t minimum_expiry_time; /* seconds */ + external_acl *externalAclHelperList; + +#if USE_SSL + + struct { + char *cert; + char *key; + int version; + char *options; + char *cipher; + char *cafile; + char *capath; + char *crlfile; + char *flags; + acl_access *cert_error; + SSL_CTX *sslContext; + sslproxy_cert_sign *cert_sign; + sslproxy_cert_adapt *cert_adapt; + } ssl_client; +#endif + + char *accept_filter; + int umask; + int max_filedescriptors; + int workers; + CpuAffinityMap *cpuAffinityMap; + +#if USE_LOADABLE_MODULES + wordlist *loadable_module_names; +#endif + + int client_ip_max_connections; + + struct { + int v4_first; ///< Place IPv4 first in the order of DNS results. + ssize_t packet_max; ///< maximum size EDNS advertised for DNS replies. + } dns; + +}; + +extern SquidConfig Config; + + +struct SquidConfig2 { + struct { + int enable_purge; + int mangle_request_headers; + } onoff; + uid_t effectiveUserID; + gid_t effectiveGroupID; +}; + +extern SquidConfig2 Config2; + +#endif /* SQUID_SQUIDCONFIG_H_ */ === modified file 'src/Store.h' --- src/Store.h 2012-09-01 14:38:36 +0000 +++ src/Store.h 2012-09-10 12:49:35 +0000 @@ -42,6 +42,7 @@ #include "Range.h" #include "RefCount.h" #include "RemovalPolicy.h" +#include "RequestFlags.h" #include "StoreIOBuffer.h" #include "StoreStats.h" @@ -378,7 +379,8 @@ SQUIDCEXTERN StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method); /// \ingroup StoreAPI -SQUIDCEXTERN StoreEntry *storeCreateEntry(const char *, const char *, request_flags, const HttpRequestMethod&); +class RequestFlags; +extern StoreEntry *storeCreateEntry(const char *, const char *, const RequestFlags &, const HttpRequestMethod&); /// \ingroup StoreAPI SQUIDCEXTERN void storeInit(void); === modified file 'src/SwapDir.cc' --- src/SwapDir.cc 2012-08-31 16:57:39 +0000 +++ src/SwapDir.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "ConfigOption.h" #include "globals.h" #include "Parsing.h" +#include "SquidConfig.h" #include "StoreFileSystem.h" #include "SwapDir.h" #include "tools.h" === modified file 'src/SwapDir.h' --- src/SwapDir.h 2012-09-01 14:38:36 +0000 +++ src/SwapDir.h 2012-09-04 09:10:20 +0000 @@ -30,6 +30,7 @@ #ifndef SQUID_SWAPDIR_H #define SQUID_SWAPDIR_H +#include "SquidConfig.h" #include "Store.h" #include "StoreIOState.h" === added file 'src/YesNoNone.cc' --- src/YesNoNone.cc 1970-01-01 00:00:00 +0000 +++ src/YesNoNone.cc 2012-09-04 11:13:13 +0000 @@ -0,0 +1,43 @@ +/* + * 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. + * + */ + +#include "squid.h" +#include "YesNoNone.h" + +YesNoNone::operator void*() const +{ + assert(option != 0); // must call configure() first + return option > 0 ? (void*)this : NULL; +} + +void +YesNoNone::configure(bool beSet) +{ + option = beSet ? +1 : -1; +} === added file 'src/YesNoNone.h' --- src/YesNoNone.h 1970-01-01 00:00:00 +0000 +++ src/YesNoNone.h 2012-09-04 11:13:13 +0000 @@ -0,0 +1,56 @@ +#ifndef SQUID_YESNONONE_H_ +#define SQUID_YESNONONE_H_ +/* + * 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. + * + */ + +/// Used for boolean enabled/disabled options with complex default logic. +/// Allows Squid to compute the right default after configuration. +/// Checks that not-yet-defined option values are not used. +class YesNoNone +{ +// TODO: generalize to non-boolean option types +public: + YesNoNone(): option(0) {} + + /// returns true iff enabled; asserts if the option has not been configured + operator void *() const; // TODO: use a fancy/safer version of the operator + + /// enables or disables the option; + void configure(bool beSet); + + /// whether the option was enabled or disabled, by user or Squid + bool configured() const { return option != 0; } + +private: + enum { optUnspecified = -1, optDisabled = 0, optEnabled = 1 }; + int option; ///< configured value or zero +}; + + +#endif /* SQUID_YESNONONE_H_ */ === modified file 'src/acl/Acl.cc' --- src/acl/Acl.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Acl.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "Debug.h" #include "dlink.h" #include "globals.h" +#include "SquidConfig.h" const char *AclMatchedName = NULL; === added file 'src/acl/AclAddress.cc' --- src/acl/AclAddress.cc 1970-01-01 00:00:00 +0000 +++ src/acl/AclAddress.cc 2012-09-05 19:54:09 +0000 @@ -0,0 +1,32 @@ +/* + * 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. + */ + +#include "squid.h" +#include "AclAddress.h" + +//TODO: fill in === added file 'src/acl/AclAddress.h' --- src/acl/AclAddress.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclAddress.h 2012-09-05 19:54:09 +0000 @@ -0,0 +1,42 @@ +#ifndef ACLADDRESS_H_ +#define ACLADDRESS_H_ +#include "Acl.h" +/* + * 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. + */ + +#include "ip/Address.h" +#include "acl/Acl.h" + +struct AclAddress { + AclAddress *next; + ACLList *aclList; + + Ip::Address addr; +}; + +#endif /* ACLADDRESS_H_ */ === added file 'src/acl/AclDenyInfoList.h' --- src/acl/AclDenyInfoList.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclDenyInfoList.h 2012-09-17 13:31:37 +0000 @@ -0,0 +1,44 @@ +#ifndef SQUID_ACLDENYINFOLIST_H_ +#define SQUID_ACLDENYINFOLIST_H_ +/* + * 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. + * + */ + +#include "err_type.h" +#include "acl/AclNameList.h" + +class AclDenyInfoList { +public: + err_type err_page_id; + char *err_page_name; + AclNameList *acl_list; + AclDenyInfoList *next; +}; + + +#endif /* SQUID_ACLDENYINFOLIST_H_ */ === added file 'src/acl/AclNameList.h' --- src/acl/AclNameList.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclNameList.h 2012-09-05 13:45:53 +0000 @@ -0,0 +1,40 @@ +#ifndef SQUID_ACL_ACLNAMELIST_H_ +#define SQUID_ACL_ACLNAMELIST_H_ +/* + * 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. + * + */ + +#include "defines.h" +//TODO: convert to a std::list +class AclNameList { +public: + char name[ACL_NAME_SZ]; + AclNameList *next; +}; + +#endif /* SQUID_ACLNAMELIST_H_ */ === modified file 'src/acl/Asn.cc' --- src/acl/Asn.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Asn.cc 2012-09-10 12:49:35 +0000 @@ -32,21 +32,23 @@ */ #include "squid.h" -#include "mgr/Registration.h" -#include "radix.h" -#include "HttpRequest.h" -#include "StoreClient.h" -#include "Store.h" #include "acl/Acl.h" #include "acl/Asn.h" #include "acl/Checklist.h" -#include "acl/SourceAsn.h" #include "acl/DestinationAsn.h" #include "acl/DestinationIp.h" +#include "acl/SourceAsn.h" #include "cache_cf.h" +#include "forward.h" #include "HttpReply.h" +#include "HttpRequest.h" #include "ipcache.h" -#include "forward.h" +#include "mgr/Registration.h" +#include "radix.h" +#include "RequestFlags.h" +#include "SquidConfig.h" +#include "Store.h" +#include "StoreClient.h" #include "StoreClient.h" #include "wordlist.h" @@ -247,7 +249,7 @@ asState->request = HTTPMSGLOCK(req); if ((e = storeGetPublic(asres, METHOD_GET)) == NULL) { - e = storeCreateEntry(asres, asres, request_flags(), METHOD_GET); + e = storeCreateEntry(asres, asres, RequestFlags(), METHOD_GET); asState->sc = storeClientListAdd(e, asState); FwdState::fwdStart(Comm::ConnectionPointer(), e, asState->request); } else { === modified file 'src/acl/DestinationIp.cc' --- src/acl/DestinationIp.cc 2012-09-01 14:38:36 +0000 +++ src/acl/DestinationIp.cc 2012-09-12 16:06:56 +0000 @@ -37,6 +37,7 @@ #include "client_side.h" #include "comm/Connection.h" #include "HttpRequest.h" +#include "SquidConfig.h" #include "structs.h" char const * @@ -55,7 +56,7 @@ // To resolve this we will force DIRECT and only to the original client destination. // In which case, we also need this ACL to accurately match the destination if (Config.onoff.client_dst_passthru && checklist->request && - (checklist->request->flags.intercepted || checklist->request->flags.spoof_client_ip)) { + (checklist->request->flags.intercepted() || checklist->request->flags.spoofClientIp())) { assert(checklist->conn() && checklist->conn()->clientConnection != NULL); return ACLIP::match(checklist->conn()->clientConnection->local); } === modified file 'src/acl/FilledChecklist.cc' --- src/acl/FilledChecklist.cc 2012-08-31 00:13:14 +0000 +++ src/acl/FilledChecklist.cc 2012-09-09 19:41:47 +0000 @@ -5,6 +5,7 @@ #include "comm/forward.h" #include "HttpReply.h" #include "HttpRequest.h" +#include "SquidConfig.h" #if USE_AUTH #include "auth/UserRequest.h" #include "auth/AclProxyAuth.h" === modified file 'src/acl/FilledChecklist.h' --- src/acl/FilledChecklist.h 2012-08-14 11:53:07 +0000 +++ src/acl/FilledChecklist.h 2012-09-04 15:15:51 +0000 @@ -9,8 +9,9 @@ #include "ssl/support.h" #endif +class CachePeer; +class ConnStateData; class ExternalACLEntry; -class ConnStateData; class HttpRequest; /** \ingroup ACLAPI @@ -52,7 +53,7 @@ Ip::Address src_addr; Ip::Address dst_addr; Ip::Address my_addr; - struct peer *dst_peer; + CachePeer *dst_peer; char *dst_rdns; HttpRequest *request; === modified file 'src/acl/Gadgets.cc' --- src/acl/Gadgets.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Gadgets.cc 2012-09-05 14:49:29 +0000 @@ -38,6 +38,8 @@ #include "squid.h" #include "acl/Acl.h" +#include "acl/AclNameList.h" +#include "acl/AclDenyInfoList.h" #include "acl/Checklist.h" #include "acl/Strategised.h" #include "acl/Gadgets.h" @@ -49,14 +51,14 @@ /* does name lookup, returns page_id */ err_type -aclGetDenyInfoPage(acl_deny_info_list ** head, const char *name, int redirect_allowed) +aclGetDenyInfoPage(AclDenyInfoList ** head, const char *name, int redirect_allowed) { - acl_deny_info_list *A = NULL; + AclDenyInfoList *A = NULL; debugs(28, 8, HERE << "got called for " << name); for (A = *head; A; A = A->next) { - acl_name_list *L = NULL; + AclNameList *L = NULL; if (!redirect_allowed && strchr(A->err_page_name, ':') ) { debugs(28, 8, HERE << "Skip '" << A->err_page_name << "' 30x redirects not allowed as response here."); @@ -106,14 +108,14 @@ */ void -aclParseDenyInfoLine(acl_deny_info_list ** head) +aclParseDenyInfoLine(AclDenyInfoList ** head) { char *t = NULL; - acl_deny_info_list *A = NULL; - acl_deny_info_list *B = NULL; - acl_deny_info_list **T = NULL; - acl_name_list *L = NULL; - acl_name_list **Tail = NULL; + AclDenyInfoList *A = NULL; + AclDenyInfoList *B = NULL; + AclDenyInfoList **T = NULL; + AclNameList *L = NULL; + AclNameList **Tail = NULL; /* first expect a page name */ @@ -123,15 +125,15 @@ return; } - A = (acl_deny_info_list *)memAllocate(MEM_ACL_DENY_INFO_LIST); + A = (AclDenyInfoList *)memAllocate(MEM_ACL_DENY_INFO_LIST); A->err_page_id = errorReservePageId(t); A->err_page_name = xstrdup(t); - A->next = (acl_deny_info_list *) NULL; + A->next = (AclDenyInfoList *) NULL; /* next expect a list of ACL names */ Tail = &A->acl_list; while ((t = strtok(NULL, w_space))) { - L = (acl_name_list *)memAllocate(MEM_ACL_NAME_LIST); + L = (AclNameList *)memAllocate(MEM_ACL_NAME_LIST); xstrncpy(L->name, t, ACL_NAME_SZ); *Tail = L; Tail = &L->next; @@ -280,15 +282,15 @@ } /* maex@space.net (06.09.1996) - * destroy an acl_deny_info_list */ + * destroy an AclDenyInfoList */ void -aclDestroyDenyInfoList(acl_deny_info_list ** list) +aclDestroyDenyInfoList(AclDenyInfoList ** list) { - acl_deny_info_list *a = NULL; - acl_deny_info_list *a_next = NULL; - acl_name_list *l = NULL; - acl_name_list *l_next = NULL; + AclDenyInfoList *a = NULL; + AclDenyInfoList *a_next = NULL; + AclNameList *l = NULL; + AclNameList *l_next = NULL; debugs(28, 8, "aclDestroyDenyInfoList: invoked"); === modified file 'src/acl/Gadgets.h' --- src/acl/Gadgets.h 2011-10-28 19:43:45 +0000 +++ src/acl/Gadgets.h 2012-09-05 14:49:29 +0000 @@ -4,12 +4,12 @@ #include "err_type.h" struct dlink_list; -class StoreEntry; -class ConfigParser; class acl_access; class ACL; +class AclDenyInfoList; class ACLList; -struct acl_deny_info_list; +class ConfigParser; +class StoreEntry; class wordlist; /// \ingroup ACLAPI @@ -25,11 +25,11 @@ /// \ingroup ACLAPI extern int aclIsProxyAuth(const char *name); /// \ingroup ACLAPI -extern err_type aclGetDenyInfoPage(acl_deny_info_list ** head, const char *name, int redirect_allowed); -/// \ingroup ACLAPI -extern void aclParseDenyInfoLine(acl_deny_info_list **); -/// \ingroup ACLAPI -extern void aclDestroyDenyInfoList(acl_deny_info_list **); +extern err_type aclGetDenyInfoPage(AclDenyInfoList ** head, const char *name, int redirect_allowed); +/// \ingroup ACLAPI +extern void aclParseDenyInfoLine(AclDenyInfoList **); +/// \ingroup ACLAPI +extern void aclDestroyDenyInfoList(AclDenyInfoList **); /// \ingroup ACLAPI extern wordlist *aclDumpGeneric(const ACL *); /// \ingroup ACLAPI === modified file 'src/acl/Makefile.am' --- src/acl/Makefile.am 2011-06-20 08:51:32 +0000 +++ src/acl/Makefile.am 2012-09-05 19:54:09 +0000 @@ -19,7 +19,9 @@ Strategised.h \ \ FilledChecklist.cc \ - FilledChecklist.h + FilledChecklist.h \ + AclAddress.h \ + AclAddress.cc ## data-specific ACLs libacls_la_SOURCES = \ @@ -105,6 +107,8 @@ UserData.cc \ UserData.h \ \ + AclNameList.h \ + AclDenyInfoList.h \ Gadgets.cc \ Gadgets.h === modified file 'src/acl/MaxConnection.cc' --- src/acl/MaxConnection.cc 2012-08-31 16:57:39 +0000 +++ src/acl/MaxConnection.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "cache_cf.h" #include "client_db.h" #include "Debug.h" +#include "SquidConfig.h" #include "wordlist.h" ACL * === modified file 'src/acl/PeerName.cc' --- src/acl/PeerName.cc 2012-08-28 13:00:30 +0000 +++ src/acl/PeerName.cc 2012-09-04 15:15:51 +0000 @@ -3,6 +3,7 @@ #include "acl/RegexData.h" #include "acl/StringData.h" #include "acl/Checklist.h" +#include "CachePeer.h" int ACLPeerNameStrategy::match (ACLData * &data, ACLFilledChecklist *checklist) === modified file 'src/acl/RegexData.cc' --- src/acl/RegexData.cc 2012-09-01 14:38:36 +0000 +++ src/acl/RegexData.cc 2012-09-06 11:56:46 +0000 @@ -41,12 +41,13 @@ #include "ConfigParser.h" #include "Debug.h" #include "Mem.h" +#include "RegexList.h" #include "wordlist.h" static void -aclDestroyRegexList(relist * data) +aclDestroyRegexList(RegexList * data) { - relist *next = NULL; + RegexList *next = NULL; for (; data; data = next) { next = data->next; @@ -69,13 +70,13 @@ debugs(28, 3, "aclRegexData::match: checking '" << word << "'"); - relist *first, *prev; + RegexList *first, *prev; first = data; prev = NULL; - relist *current = first; + RegexList *current = first; while (current) { debugs(28, 3, "aclRegexData::match: looking for '" << current->pattern << "'"); @@ -104,7 +105,7 @@ ACLRegexData::dump() { wordlist *W = NULL; - relist *temp = data; + RegexList *temp = data; int flags = REG_EXTENDED | REG_NOSUB; while (temp != NULL) { @@ -152,11 +153,11 @@ return t; } -static relist ** -compileRE(relist **Tail, char * RE, int flags) +static RegexList ** +compileRE(RegexList **Tail, char * RE, int flags) { int errcode; - relist *q; + RegexList *q; regex_t comp; if (RE == NULL || *RE == '\0') @@ -171,7 +172,7 @@ } debugs(28, 2, "compileRE: compiled '" << RE << "' with flags " << flags ); - q = (relist *) memAllocate(MEM_RELIST); + q = (RegexList *) memAllocate(MEM_RELIST); q->pattern = xstrdup(RE); q->regex = comp; q->flags = flags; @@ -186,11 +187,11 @@ * called only once per ACL. */ static int -compileOptimisedREs(relist **curlist, wordlist * wl) +compileOptimisedREs(RegexList **curlist, wordlist * wl) { - relist **Tail; - relist *newlist; - relist **newlistp; + RegexList **Tail; + RegexList *newlist; + RegexList **newlistp; int numREs = 0; int flags = REG_EXTENDED | REG_NOSUB; int largeREindex = 0; @@ -288,10 +289,10 @@ } static void -compileUnoptimisedREs(relist **curlist, wordlist * wl) +compileUnoptimisedREs(RegexList **curlist, wordlist * wl) { - relist **Tail; - relist **newTail; + RegexList **Tail; + RegexList **newTail; int flags = REG_EXTENDED | REG_NOSUB; for (Tail = curlist; *Tail != NULL; Tail = &((*Tail)->next)) @@ -314,7 +315,7 @@ } static void -aclParseRegexList(relist **curlist) +aclParseRegexList(RegexList **curlist) { char *t; wordlist *wl = NULL; === modified file 'src/acl/RegexData.h' --- src/acl/RegexData.h 2012-09-01 14:38:36 +0000 +++ src/acl/RegexData.h 2012-09-06 11:56:46 +0000 @@ -35,8 +35,7 @@ #include "acl/Data.h" #include "MemPool.h" -/** \todo CLEANUP: break out relist, we don't need the rest. */ -#include "structs.h" +class RegexList; class ACLRegexData : public ACLData { @@ -52,7 +51,7 @@ virtual ACLData *clone() const; private: - relist *data; + RegexList *data; }; MEMPROXY_CLASS_INLINE(ACLRegexData); === modified file 'src/adaptation/icap/Config.cc' --- src/adaptation/icap/Config.cc 2012-09-01 14:38:36 +0000 +++ src/adaptation/icap/Config.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "adaptation/icap/ServiceRep.h" #include "HttpRequest.h" #include "HttpReply.h" +#include "SquidConfig.h" #include "wordlist.h" Adaptation::Icap::Config Adaptation::Icap::TheConfig; === modified file 'src/adaptation/icap/ServiceRep.cc' --- src/adaptation/icap/ServiceRep.cc 2012-08-31 16:57:39 +0000 +++ src/adaptation/icap/ServiceRep.cc 2012-09-04 09:10:20 +0000 @@ -17,6 +17,7 @@ #include "globals.h" #include "HttpReply.h" #include "ip/tools.h" +#include "SquidConfig.h" #include "SquidTime.h" CBDATA_NAMESPACED_CLASS_INIT(Adaptation::Icap, ServiceRep); === modified file 'src/adaptation/icap/Xaction.cc' --- src/adaptation/icap/Xaction.cc 2012-08-31 16:57:39 +0000 +++ src/adaptation/icap/Xaction.cc 2012-09-04 09:10:20 +0000 @@ -24,6 +24,7 @@ #include "ipcache.h" #include "Mem.h" #include "pconn.h" +#include "SquidConfig.h" #include "SquidTime.h" //CBDATA_NAMESPACED_CLASS_INIT(Adaptation::Icap, Xaction); === modified file 'src/adaptation/icap/icap_log.cc' --- src/adaptation/icap/icap_log.cc 2012-08-14 11:53:07 +0000 +++ src/adaptation/icap/icap_log.cc 2012-09-06 13:29:14 +0000 @@ -1,15 +1,17 @@ #include "squid.h" #include "icap_log.h" #include "AccessLogEntry.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" int IcapLogfileStatus = LOG_DISABLE; void icapLogOpen() { - customlog *log; + CustomLog *log; for (log = Config.Log.icaplogs; log; log = log->next) { if (log->type == Log::Format::CLF_NONE) @@ -24,7 +26,7 @@ void icapLogClose() { - customlog *log; + CustomLog *log; for (log = Config.Log.icaplogs; log; log = log->next) { if (log->logfile) { @@ -37,7 +39,7 @@ void icapLogRotate() { - for (customlog* log = Config.Log.icaplogs; log; log = log->next) { + for (CustomLog* log = Config.Log.icaplogs; log; log = log->next) { if (log->logfile) { logfileRotate(log->logfile); } === modified file 'src/auth/Acl.cc' --- src/auth/Acl.cc 2012-08-14 11:53:07 +0000 +++ src/auth/Acl.cc 2012-09-12 17:01:17 +0000 @@ -24,17 +24,17 @@ if (NULL == request) { fatal ("requiresRequest SHOULD have been true for this ACL!!"); return ACCESS_DENIED; - } else if (request->flags.sslBumped) { + } else if (request->flags.sslBumped()) { debugs(28, 5, "SslBumped request: It is an encapsulated request do not authenticate"); checklist->auth_user_request = checklist->conn() != NULL ? checklist->conn()->auth_user_request : request->auth_user_request; if (checklist->auth_user_request != NULL) return ACCESS_ALLOWED; else return ACCESS_DENIED; - } else if (request->flags.accelerated) { + } else if (request->flags.accelerated()) { /* WWW authorization on accelerated requests */ headertype = HDR_AUTHORIZATION; - } else if (request->flags.intercepted || request->flags.spoof_client_ip) { + } else if (request->flags.intercepted() || request->flags.spoofClientIp()) { debugs(28, DBG_IMPORTANT, "NOTICE: Authentication not applicable on intercepted requests."); return ACCESS_DENIED; } else { === modified file 'src/auth/User.cc' --- src/auth/User.cc 2012-09-01 14:38:36 +0000 +++ src/auth/User.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "acl/Gadgets.h" #include "event.h" #include "globals.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/auth/basic/User.cc' --- src/auth/basic/User.cc 2012-08-14 11:53:07 +0000 +++ src/auth/basic/User.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "auth/basic/auth_basic.h" #include "auth/basic/User.h" #include "Debug.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "structs.h" === modified file 'src/auth/digest/User.cc' --- src/auth/digest/User.cc 2012-08-14 11:53:07 +0000 +++ src/auth/digest/User.cc 2012-09-04 09:10:20 +0000 @@ -3,6 +3,7 @@ #include "auth/digest/User.h" #include "Debug.h" #include "dlink.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "structs.h" === modified file 'src/auth/digest/auth_digest.cc' --- src/auth/digest/auth_digest.cc 2012-09-01 14:38:36 +0000 +++ src/auth/digest/auth_digest.cc 2012-09-04 13:09:04 +0000 @@ -91,6 +91,7 @@ {"response", (http_hdr_type)DIGEST_RESPONSE}, }; +class HttpHeaderFieldInfo; static HttpHeaderFieldInfo *DigestFieldsInfo = NULL; /* === modified file 'src/auth/negotiate/UserRequest.cc' --- src/auth/negotiate/UserRequest.cc 2012-08-31 16:57:39 +0000 +++ src/auth/negotiate/UserRequest.cc 2012-09-13 11:40:32 +0000 @@ -286,8 +286,8 @@ ++arg; } safe_free(lm_request->server_blob); - lm_request->request->flags.must_keepalive = 1; - if (lm_request->request->flags.proxy_keepalive) { + lm_request->request->flags.setMustKeepalive(); + if (lm_request->request->flags.proxyKeepalive()) { lm_request->server_blob = xstrdup(blob); auth_user_request->user()->credentials(Auth::Handshake); auth_user_request->denyMessage("Authentication in progress"); === modified file 'src/auth/negotiate/auth_negotiate.cc' --- src/auth/negotiate/auth_negotiate.cc 2012-09-01 14:38:36 +0000 +++ src/auth/negotiate/auth_negotiate.cc 2012-09-13 11:40:32 +0000 @@ -218,7 +218,7 @@ return; /* Need keep-alive */ - if (!request->flags.proxy_keepalive && request->flags.must_keepalive) + if (!request->flags.proxyKeepalive() && request->flags.mustKeepalive()) return; /* New request, no user details */ @@ -229,7 +229,7 @@ if (!keep_alive) { /* drop the connection */ rep->header.delByName("keep-alive"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } } else { Auth::Negotiate::UserRequest *negotiate_request = dynamic_cast(auth_user_request.getRaw()); @@ -241,7 +241,7 @@ /* here it makes sense to drop the connection, as auth is * tied to it, even if MAYBE the client could handle it - Kinkie */ rep->header.delByName("keep-alive"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); /* fall through */ case Auth::Ok: === modified file 'src/auth/ntlm/UserRequest.cc' --- src/auth/ntlm/UserRequest.cc 2012-08-14 11:53:07 +0000 +++ src/auth/ntlm/UserRequest.cc 2012-09-13 11:40:32 +0000 @@ -269,8 +269,8 @@ if (strncasecmp(reply, "TT ", 3) == 0) { /* we have been given a blob to send to the client */ safe_free(lm_request->server_blob); - lm_request->request->flags.must_keepalive = 1; - if (lm_request->request->flags.proxy_keepalive) { + lm_request->request->flags.setMustKeepalive(); + if (lm_request->request->flags.proxyKeepalive()) { lm_request->server_blob = xstrdup(blob); auth_user_request->user()->credentials(Auth::Handshake); auth_user_request->denyMessage("Authentication in progress"); === modified file 'src/auth/ntlm/auth_ntlm.cc' --- src/auth/ntlm/auth_ntlm.cc 2012-09-01 14:38:36 +0000 +++ src/auth/ntlm/auth_ntlm.cc 2012-09-13 11:40:32 +0000 @@ -205,7 +205,7 @@ return; /* Need keep-alive */ - if (!request->flags.proxy_keepalive && request->flags.must_keepalive) + if (!request->flags.proxyKeepalive() && request->flags.mustKeepalive()) return; /* New request, no user details */ @@ -215,7 +215,7 @@ if (!keep_alive) { /* drop the connection */ - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } } else { Auth::Ntlm::UserRequest *ntlm_request = dynamic_cast(auth_user_request.getRaw()); @@ -226,7 +226,7 @@ case Auth::Failed: /* here it makes sense to drop the connection, as auth is * tied to it, even if MAYBE the client could handle it - Kinkie */ - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); /* fall through */ case Auth::Ok: === modified file 'src/cache_cf.cc' --- src/cache_cf.cc 2012-09-01 14:38:36 +0000 +++ src/cache_cf.cc 2012-09-10 09:44:06 +0000 @@ -32,11 +32,16 @@ #include "squid.h" #include "acl/Acl.h" +#include "acl/AclAddress.h" +#include "acl/AclDenyInfoList.h" +#include "acl/AclNameList.h" #include "acl/Gadgets.h" #include "acl/MethodData.h" #include "anyp/PortCfg.h" #include "AuthReg.h" #include "base/RunnersRegistry.h" +#include "CacheMgrPasswd.h" +#include "CachePeer.h" #include "cache_cf.h" #include "ConfigParser.h" #include "CpuAffinityMap.h" @@ -53,12 +58,15 @@ #include "ip/tools.h" #include "ipc/Kids.h" #include "log/Config.h" +#include "log/CustomLog.h" #include "Mem.h" #include "MemBuf.h" #include "mgr/Registration.h" #include "Parsing.h" #include "PeerDigest.h" +#include "RefreshPattern.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "Store.h" #include "StoreFileSystem.h" @@ -148,7 +156,7 @@ static peer_t parseNeighborType(const char *s); -CBDATA_TYPE(peer); +CBDATA_TYPE(CachePeer); static const char *const T_MILLISECOND_STR = "millisecond"; static const char *const T_SECOND_STR = "second"; @@ -168,14 +176,14 @@ static const char *const list_sep = ", \t\n\r"; -static void parse_access_log(customlog ** customlog_definitions); -static int check_null_access_log(customlog *customlog_definitions); -static void dump_access_log(StoreEntry * entry, const char *name, customlog * definitions); -static void free_access_log(customlog ** definitions); +static void parse_access_log(CustomLog ** customlog_definitions); +static int check_null_access_log(CustomLog *customlog_definitions); +static void dump_access_log(StoreEntry * entry, const char *name, CustomLog * definitions); +static void free_access_log(CustomLog ** definitions); static void update_maxobjsize(void); static void configDoConfigure(void); -static void parse_refreshpattern(refresh_t **); +static void parse_refreshpattern(RefreshPattern **); static uint64_t parseTimeUnits(const char *unit, bool allowMsec); static void parseTimeLine(time_msec_t * tptr, const char *units, bool allowMsec); static void parse_u_short(unsigned short * var); @@ -208,9 +216,9 @@ static void dump_HeaderWithAclList(StoreEntry * entry, const char *name, HeaderWithAclList *headers); static void parse_HeaderWithAclList(HeaderWithAclList **header); static void free_HeaderWithAclList(HeaderWithAclList **header); -static void parse_denyinfo(acl_deny_info_list ** var); -static void dump_denyinfo(StoreEntry * entry, const char *name, acl_deny_info_list * var); -static void free_denyinfo(acl_deny_info_list ** var); +static void parse_denyinfo(AclDenyInfoList ** var); +static void dump_denyinfo(StoreEntry * entry, const char *name, AclDenyInfoList * var); +static void free_denyinfo(AclDenyInfoList ** var); #if USE_WCCPv2 static void parse_IpAddress_list(Ip::Address_list **); @@ -759,7 +767,7 @@ #if USE_HTTP_VIOLATIONS { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (!R->flags.override_expire) @@ -918,7 +926,7 @@ Config.ssl_client.sslContext = sslCreateClientContext(Config.ssl_client.cert, Config.ssl_client.key, Config.ssl_client.version, Config.ssl_client.cipher, Config.ssl_client.options, Config.ssl_client.flags, Config.ssl_client.cafile, Config.ssl_client.capath, Config.ssl_client.crlfile); - for (peer *p = Config.peers; p != NULL; p = p->next) { + for (CachePeer *p = Config.peers; p != NULL; p = p->next) { if (p->use_ssl) { debugs(3, DBG_IMPORTANT, "Initializing cache_peer " << p->name << " SSL context"); p->sslContext = sslCreateClientContext(p->sslcert, p->sslkey, p->sslversion, p->sslcipher, p->ssloptions, p->sslflags, p->sslcafile, p->sslcapath, p->sslcrlfile); @@ -1360,13 +1368,13 @@ addr->SetEmpty(); } -CBDATA_TYPE(acl_address); +CBDATA_TYPE(AclAddress); static void -dump_acl_address(StoreEntry * entry, const char *name, acl_address * head) +dump_acl_address(StoreEntry * entry, const char *name, AclAddress * head) { char buf[MAX_IPSTRLEN]; - acl_address *l; + AclAddress *l; for (l = head; l; l = l->next) { if (!l->addr.IsAnyAddr()) @@ -1383,17 +1391,17 @@ static void freed_acl_address(void *data) { - acl_address *l = static_cast(data); + AclAddress *l = static_cast(data); aclDestroyAclList(&l->aclList); } static void -parse_acl_address(acl_address ** head) +parse_acl_address(AclAddress ** head) { - acl_address *l; - acl_address **tail = head; /* sane name below */ - CBDATA_INIT_TYPE_FREECB(acl_address, freed_acl_address); - l = cbdataAlloc(acl_address); + AclAddress *l; + AclAddress **tail = head; /* sane name below */ + CBDATA_INIT_TYPE_FREECB(AclAddress, freed_acl_address); + l = cbdataAlloc(AclAddress); parse_address(&l->addr); aclParseAclList(LegacyParser, &l->aclList); @@ -1404,10 +1412,10 @@ } static void -free_acl_address(acl_address ** head) +free_acl_address(AclAddress ** head) { while (*head) { - acl_address *l = *head; + AclAddress *l = *head; *head = l->next; cbdataFree(l); } @@ -1965,7 +1973,7 @@ } static void -dump_peer(StoreEntry * entry, const char *name, peer * p) +dump_peer(StoreEntry * entry, const char *name, CachePeer * p) { domain_ping *d; domain_type *t; @@ -2065,12 +2073,12 @@ } static void -parse_peer(peer ** head) +parse_peer(CachePeer ** head) { char *token = NULL; - peer *p; - CBDATA_INIT_TYPE_FREECB(peer, peerDestroy); - p = cbdataAlloc(peer); + CachePeer *p; + CBDATA_INIT_TYPE_FREECB(CachePeer, peerDestroy); + p = cbdataAlloc(CachePeer); p->http_port = CACHE_HTTP_PORT; p->icp.port = CACHE_ICP_PORT; p->weight = 1; @@ -2344,9 +2352,9 @@ } static void -free_peer(peer ** P) +free_peer(CachePeer ** P) { - peer *p; + CachePeer *p; while ((p = *P) != NULL) { *P = p->next; @@ -2362,7 +2370,7 @@ } static void -dump_cachemgrpasswd(StoreEntry * entry, const char *name, cachemgr_passwd * list) +dump_cachemgrpasswd(StoreEntry * entry, const char *name, CacheMgrPasswd * list) { wordlist *w; @@ -2382,15 +2390,15 @@ } static void -parse_cachemgrpasswd(cachemgr_passwd ** head) +parse_cachemgrpasswd(CacheMgrPasswd ** head) { char *passwd = NULL; wordlist *actions = NULL; - cachemgr_passwd *p; - cachemgr_passwd **P; + CacheMgrPasswd *p; + CacheMgrPasswd **P; parse_string(&passwd); parse_wordlist(&actions); - p = static_cast(xcalloc(1, sizeof(cachemgr_passwd))); + p = new CacheMgrPasswd; p->passwd = passwd; p->actions = actions; @@ -2399,7 +2407,7 @@ * See if any of the actions from this line already have a * password from previous lines. The password checking * routines in cache_manager.c take the the password from - * the first cachemgr_passwd struct that contains the + * the first CacheMgrPasswd struct that contains the * requested action. Thus, we should warn users who might * think they can have two passwords for the same action. */ @@ -2420,9 +2428,9 @@ } static void -free_cachemgrpasswd(cachemgr_passwd ** head) +free_cachemgrpasswd(CacheMgrPasswd ** head) { - cachemgr_passwd *p; + CacheMgrPasswd *p; while ((p = *head) != NULL) { *head = p->next; @@ -2433,9 +2441,9 @@ } static void -dump_denyinfo(StoreEntry * entry, const char *name, acl_deny_info_list * var) +dump_denyinfo(StoreEntry * entry, const char *name, AclDenyInfoList * var) { - acl_name_list *a; + AclNameList *a; while (var != NULL) { storeAppendPrintf(entry, "%s %s", name, var->err_page_name); @@ -2450,18 +2458,18 @@ } static void -parse_denyinfo(acl_deny_info_list ** var) +parse_denyinfo(AclDenyInfoList ** var) { aclParseDenyInfoLine(var); } void -free_denyinfo(acl_deny_info_list ** list) +free_denyinfo(AclDenyInfoList ** list) { - acl_deny_info_list *a = NULL; - acl_deny_info_list *a_next = NULL; - acl_name_list *l = NULL; - acl_name_list *l_next = NULL; + AclDenyInfoList *a = NULL; + AclDenyInfoList *a_next = NULL; + AclNameList *l = NULL; + AclNameList *l_next = NULL; for (a = *list; a; a = a_next) { for (l = a->acl_list; l; l = l_next) { @@ -2482,7 +2490,7 @@ parse_peer_access(void) { char *host = NULL; - peer *p; + CachePeer *p; if (!(host = strtok(NULL, w_space))) self_destruct(); @@ -2507,7 +2515,7 @@ while ((domain = strtok(NULL, list_sep))) { domain_ping *l = NULL; domain_ping **L = NULL; - peer *p; + CachePeer *p; if ((p = peerFindByName(host)) == NULL) { debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); @@ -2545,7 +2553,7 @@ while ((domain = strtok(NULL, list_sep))) { domain_type *l = NULL; domain_type **L = NULL; - peer *p; + CachePeer *p; if ((p = peerFindByName(host)) == NULL) { debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); @@ -2637,7 +2645,7 @@ #define free_tristate free_int static void -dump_refreshpattern(StoreEntry * entry, const char *name, refresh_t * head) +dump_refreshpattern(StoreEntry * entry, const char *name, RefreshPattern * head) { while (head != NULL) { storeAppendPrintf(entry, "%s%s %s %d %d%% %d", @@ -2695,7 +2703,7 @@ } static void -parse_refreshpattern(refresh_t ** head) +parse_refreshpattern(RefreshPattern ** head) { char *token; char *pattern; @@ -2720,7 +2728,7 @@ #endif int i; - refresh_t *t; + RefreshPattern *t; regex_t comp; int errcode; int flags = REG_EXTENDED | REG_NOSUB; @@ -2825,7 +2833,7 @@ pct = pct < 0.0 ? 0.0 : pct; max = max < 0 ? 0 : max; - t = static_cast(xcalloc(1, sizeof(refresh_t))); + t = static_cast(xcalloc(1, sizeof(RefreshPattern))); t->pattern = (char *) xstrdup(pattern); t->compiled_pattern = comp; t->min = min; @@ -2885,9 +2893,9 @@ } static void -free_refreshpattern(refresh_t ** head) +free_refreshpattern(RefreshPattern ** head) { - refresh_t *t; + RefreshPattern *t; while ((t = *head) != NULL) { *head = t->next; @@ -3294,18 +3302,6 @@ storeAppendPrintf(entry, "\n"); } -void -YesNoNone::configure(bool beSet) -{ - option = beSet ? +1 : -1; -} - -YesNoNone::operator void*() const -{ - assert(option != 0); // must call configure() first - return option > 0 ? (void*)this : NULL; -} - inline void free_YesNoNone(YesNoNone *) { @@ -3981,11 +3977,11 @@ #include "AccessLogEntry.h" static void -parse_access_log(customlog ** logs) +parse_access_log(CustomLog ** logs) { const char *filename, *logdef_name; - customlog *cl = (customlog *)xcalloc(1, sizeof(*cl)); + CustomLog *cl = (CustomLog *)xcalloc(1, sizeof(*cl)); if ((filename = strtok(NULL, w_space)) == NULL) { self_destruct(); @@ -4055,15 +4051,15 @@ } static int -check_null_access_log(customlog *customlog_definitions) +check_null_access_log(CustomLog *customlog_definitions) { return customlog_definitions == NULL; } static void -dump_access_log(StoreEntry * entry, const char *name, customlog * logs) +dump_access_log(StoreEntry * entry, const char *name, CustomLog * logs) { - customlog *log; + CustomLog *log; for (log = logs; log; log = log->next) { storeAppendPrintf(entry, "%s ", name); @@ -4115,10 +4111,10 @@ } static void -free_access_log(customlog ** definitions) +free_access_log(CustomLog ** definitions) { while (*definitions) { - customlog *log = *definitions; + CustomLog *log = *definitions; *definitions = log->next; log->logFormat = NULL; === modified file 'src/cache_manager.cc' --- src/cache_manager.cc 2012-09-03 08:42:58 +0000 +++ src/cache_manager.cc 2012-09-10 09:44:06 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "base/TextException.h" +#include "CacheMgrPasswd.h" #include "CacheManager.h" #include "comm/Connection.h" #include "Debug.h" @@ -49,6 +50,7 @@ #include "mgr/QueryParams.h" #include "protos.h" #include "tools.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "wordlist.h" @@ -458,12 +460,12 @@ } /* - \ingroup CacheManagerInternal + * \ingroup CacheManagerInternal * gets from the global Config the password the user would need to supply * for the action she queried */ char * -CacheManager::PasswdGet(cachemgr_passwd * a, const char *action) +CacheManager::PasswdGet(CacheMgrPasswd * a, const char *action) { wordlist *w; === modified file 'src/carp.cc' --- src/carp.cc 2012-09-01 14:38:36 +0000 +++ src/carp.cc 2012-09-04 15:15:51 +0000 @@ -33,9 +33,11 @@ */ #include "squid.h" +#include "CachePeer.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" #include "URLScheme.h" @@ -47,14 +49,14 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_carp_peers = 0; -static peer **carp_peers = NULL; +static CachePeer **carp_peers = NULL; static OBJH carpCachemgr; static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -71,8 +73,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -105,7 +107,7 @@ if (n_carp_peers == 0) return; - carp_peers = (peer **)xcalloc(n_carp_peers, sizeof(*carp_peers)); + carp_peers = (CachePeer **)xcalloc(n_carp_peers, sizeof(*carp_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = carp_peers, p = Config.peers; p; p = p->next) { @@ -167,12 +169,12 @@ } } -peer * +CachePeer * carpSelectParent(HttpRequest * request) { int k; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -184,7 +186,7 @@ /* calculate hash key */ debugs(39, 2, "carpSelectParent: Calculating hash for " << urlCanonical(request)); - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_carp_peers; ++k) { String key; tp = carp_peers[k]; @@ -250,7 +252,7 @@ static void carpCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/carp.h' --- src/carp.h 2012-08-29 00:12:28 +0000 +++ src/carp.h 2012-09-04 14:38:44 +0000 @@ -33,10 +33,10 @@ #ifndef SQUID_CARP_H_ #define SQUID_CARP_H_ -class peer; +class CachePeer; class HttpRequest; extern void carpInit(void); -extern peer *carpSelectParent(HttpRequest *); +extern CachePeer *carpSelectParent(HttpRequest *); #endif /* SQUID_CARP_H_ */ === modified file 'src/client_db.cc' --- src/client_db.cc 2012-09-01 14:38:36 +0000 +++ src/client_db.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "log/access_log.h" #include "Mem.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/client_side.cc' --- src/client_side.cc 2012-09-09 17:13:42 +0000 +++ src/client_side.cc 2012-09-13 11:40:32 +0000 @@ -83,6 +83,7 @@ #include "anyp/PortCfg.h" #include "base/Subscription.h" #include "base/TextException.h" +#include "CachePeer.h" #include "ChunkedCodingParser.h" #include "client_db.h" #include "client_side_reply.h" @@ -120,6 +121,7 @@ #include "mime_header.h" #include "profiler/Profiler.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "StatHist.h" @@ -847,7 +849,10 @@ RequestMethodStr(request->method)); // TODO: move to HttpRequest::hdrCacheInit, just like HttpReply. - request->flags.proxy_keepalive = request->persistent() ? 1 : 0; + if (request->persistent()) + request->flags.setProxyKeepalive(); + else + request->flags.clearProxyKeepalive(); } static int @@ -983,7 +988,7 @@ { assert(rep == NULL); - if (!multipartRangeRequest() && !http->request->flags.chunked_reply) { + if (!multipartRangeRequest() && !http->request->flags.isReplyChunked()) { size_t length = lengthToSend(bodyData.range()); noteSentBodyBytes (length); AsyncCall::Pointer call = commCbCall(33, 5, "clientWriteBodyComplete", @@ -1267,7 +1272,7 @@ else if (rep->content_length != http->memObject()->getReply()->content_length) range_err = "INCONSISTENT length"; /* a bug? */ - /* hits only - upstream peer determines correct behaviour on misses, and client_side_reply determines + /* hits only - upstream CachePeer determines correct behaviour on misses, and client_side_reply determines * hits candidates */ else if (logTypeIsATcpHit(http->logType) && http->request->header.has(HDR_IF_RANGE) && !clientIfRangeMatch(http, rep)) @@ -1392,7 +1397,7 @@ if (bodyData.data && bodyData.length) { if (multipartRangeRequest()) packRange(bodyData, mb); - else if (http->request->flags.chunked_reply) { + else if (http->request->flags.isReplyChunked()) { packChunk(bodyData, *mb); } else { size_t length = lengthToSend(bodyData.range()); @@ -1447,8 +1452,9 @@ // After sending Transfer-Encoding: chunked (at least), always send // the last-chunk if there was no error, ignoring responseFinishedOrFailed. - const bool mustSendLastChunk = http->request->flags.chunked_reply && - !http->request->flags.stream_error && !context->startOfOutput(); + const bool mustSendLastChunk = http->request->flags.isReplyChunked() && + !http->request->flags.hadStreamError() && + !context->startOfOutput(); if (responseFinishedOrFailed(rep, receivedData) && !mustSendLastChunk) { context->writeComplete(context->clientConnection, NULL, 0, COMM_OK); PROF_stop(clientSocketRecipient); @@ -1736,7 +1742,7 @@ debugs(33, 5, HERE << "Range request at end of returnable " << "range sequence on " << clientConnection); - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive()) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -1753,7 +1759,7 @@ // did we get at least what we expected, based on range specs? if (bytesSent == bytesExpected) { // got everything - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive()) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -1763,7 +1769,7 @@ // expected why would persistency matter? Should not this // always be an error? if (bytesSent > bytesExpected) { // got extra - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive()) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -2469,7 +2475,7 @@ // at the client-side, but many such errors do require closure and the // client-side code is bad at handling errors so we play it safe. if (request) - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); flags.readMore = false; debugs(33,4, HERE << "Will close after error: " << clientConnection); } @@ -2649,15 +2655,19 @@ request->clientConnectionManager = conn; - request->flags.accelerated = http->flags.accel; - request->flags.sslBumped = conn->switchedToHttps(); - request->flags.canRePin = request->flags.sslBumped && conn->pinning.pinned; - request->flags.ignore_cc = conn->port->ignore_cc; + if (http->flags.accel) + request->flags.markAccelerated(); + request->flags.setSslBumped(conn->switchedToHttps()); + if (request->flags.sslBumped() && conn->pinning.pinned) + request->flags.allowRepinning(); + if (conn->port->ignore_cc) + request->flags.ignoreCacheControl(); // TODO: decouple http->flags.accel from request->flags.sslBumped - request->flags.no_direct = (request->flags.accelerated && !request->flags.sslBumped) ? - !conn->port->allow_direct : 0; + if (request->flags.accelerated() && !request->flags.sslBumped()) + if (!conn->port->allow_direct) + request->flags.setNoDirect(); #if USE_AUTH - if (request->flags.sslBumped) { + if (request->flags.sslBumped()) { if (conn->auth_user_request != NULL) request->auth_user_request = conn->auth_user_request; } @@ -2668,8 +2678,10 @@ * from the port settings to the request. */ if (http->clientConnection != NULL) { - request->flags.intercepted = ((http->clientConnection->flags & COMM_INTERCEPTION) != 0); - request->flags.spoof_client_ip = ((http->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; + if ((http->clientConnection->flags & COMM_INTERCEPTION) != 0) + request->flags.markIntercepted(); + if ((http->clientConnection->flags & COMM_TRANSPARENT) != 0 ) + request->flags.setSpoofClientIp(); } if (internalCheck(request->urlpath.termedBuf())) { @@ -2688,7 +2700,8 @@ request->login[0] = '\0'; } - request->flags.internal = http->flags.internal; + if (http->flags.internal) + request->flags.markInternal(); setLogUri (http, urlCanonicalClean(request)); request->client_addr = conn->clientConnection->remote; // XXX: remove reuest->client_addr member. #if FOLLOW_X_FORWARDED_FOR @@ -3146,7 +3159,7 @@ repContext->setReplyToError(error, scode, repContext->http->request->method, repContext->http->uri, - peer, + CachePeer, repContext->http->request, in.buf, NULL); context->pullData(); @@ -3215,7 +3228,7 @@ clientReplyContext *repContext = dynamic_cast(node->data.getRaw()); assert (repContext); repContext->setReplyToError(ERR_LIFETIME_EXP, - HTTP_REQUEST_TIMEOUT, METHOD_NONE, "N/A", &peer.sin_addr, + HTTP_REQUEST_TIMEOUT, METHOD_NONE, "N/A", &CachePeer.sin_addr, NULL, NULL, NULL); /* No requests can be outstanded */ assert(chr == NULL); @@ -3578,8 +3591,10 @@ fakeRequest->indirect_client_addr = connState->clientConnection->remote; #endif fakeRequest->my_addr = connState->clientConnection->local; - fakeRequest->flags.spoof_client_ip = ((connState->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; - fakeRequest->flags.intercepted = ((connState->clientConnection->flags & COMM_INTERCEPTION) != 0); + if ((connState->clientConnection->flags & COMM_TRANSPARENT) != 0) + fakeRequest->flags.setSpoofClientIp(); + if ((connState->clientConnection->flags & COMM_INTERCEPTION) != 0) + fakeRequest->flags.markIntercepted(); debugs(33, 4, HERE << details << " try to generate a Dynamic SSL CTX"); connState->switchToHttps(fakeRequest, bumpMode); } @@ -3889,7 +3904,7 @@ // commSetConnTimeout() was called for this request before we switched. - // Disable the client read handler until peer selection is complete + // Disable the client read handler until CachePeer selection is complete Comm::SetSelect(clientConnection->fd, COMM_SELECT_READ, NULL, NULL, 0); Comm::SetSelect(clientConnection->fd, COMM_SELECT_READ, clientNegotiateSSL, this, 0); switchedToHttps_ = true; @@ -3911,7 +3926,7 @@ // and now want to switch to SSL to send the error to the client // without even peeking at the origin server certificate. if (bumpServerMode == Ssl::bumpServerFirst && !sslServerBump) { - request->flags.sslPeek = 1; + request->flags.setSslPeek(); sslServerBump = new Ssl::ServerBump(request); // will call httpsPeeked() with certificate and connection, eventually @@ -4416,7 +4431,7 @@ } void -ConnStateData::pinConnection(const Comm::ConnectionPointer &pinServer, HttpRequest *request, struct peer *aPeer, bool auth) +ConnStateData::pinConnection(const Comm::ConnectionPointer &pinServer, HttpRequest *request, CachePeer *aPeer, bool auth) { char desc[FD_DESC_SZ]; @@ -4462,7 +4477,7 @@ } const Comm::ConnectionPointer -ConnStateData::validatePinnedConnection(HttpRequest *request, const struct peer *aPeer) +ConnStateData::validatePinnedConnection(HttpRequest *request, const CachePeer *aPeer) { debugs(33, 7, HERE << pinning.serverConnection); === modified file 'src/client_side.h' --- src/client_side.h 2012-08-29 07:29:35 +0000 +++ src/client_side.h 2012-09-04 14:38:44 +0000 @@ -259,7 +259,7 @@ int port; /* port of pinned connection */ bool pinned; /* this connection was pinned */ bool auth; /* pinned for www authentication */ - struct peer *peer; /* peer the connection goes via */ + CachePeer *peer; /* CachePeer the connection goes via */ AsyncCall::Pointer closeHandler; /*The close handler for pinned server side connection*/ } pinning; @@ -290,23 +290,23 @@ /** * Correlate the current ConnStateData object with the pinning_fd socket descriptor. */ - void pinConnection(const Comm::ConnectionPointer &pinServerConn, HttpRequest *request, struct peer *peer, bool auth); + void pinConnection(const Comm::ConnectionPointer &pinServerConn, HttpRequest *request, CachePeer *peer, bool auth); /** - * Decorrelate the ConnStateData object from its pinned peer + * Decorrelate the ConnStateData object from its pinned CachePeer */ void unpinConnection(); /** * Checks if there is pinning info if it is valid. It can close the server side connection * if pinned info is not valid. \param request if it is not NULL also checks if the pinning info refers to the request client side HttpRequest - \param peer if it is not NULL also check if the peer is the pinning peer + \param CachePeer if it is not NULL also check if the CachePeer is the pinning CachePeer \return The details of the server side connection (may be closed if failures were present). */ - const Comm::ConnectionPointer validatePinnedConnection(HttpRequest *request, const struct peer *peer); + const Comm::ConnectionPointer validatePinnedConnection(HttpRequest *request, const CachePeer *peer); /** - * returts the pinned peer if exists, NULL otherwise + * returts the pinned CachePeer if exists, NULL otherwise */ - struct peer *pinnedPeer() const {return pinning.peer;} + CachePeer *pinnedPeer() const {return pinning.peer;} bool pinnedAuth() const {return pinning.auth;} // pining related comm callbacks === modified file 'src/client_side_reply.cc' --- src/client_side_reply.cc 2012-09-13 06:56:05 +0000 +++ src/client_side_reply.cc 2012-09-13 16:20:41 +0000 @@ -54,6 +54,8 @@ #include "mime_header.h" #include "neighbors.h" #include "refresh.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -127,11 +129,11 @@ { if (errstate->httpStatus == HTTP_NOT_IMPLEMENTED && http->request) /* prevent confusion over whether we default to persistent or not */ - http->request->flags.proxy_keepalive = 0; + http->request->flags.clearProxyKeepalive(); http->al->http.code = errstate->httpStatus; - createStoreEntry(method, request_flags()); + createStoreEntry(method, RequestFlags()); assert(errstate->callback_data == NULL); errorAppendEntry(http->storeEntry(), errstate); /* Now the caller reads to get this */ @@ -225,7 +227,7 @@ void clientReplyContext::startError(ErrorState * err) { - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); triggerInitialStoreRead(); errorAppendEntry(http->storeEntry(), err); } @@ -271,7 +273,7 @@ return; } - http->request->flags.refresh = 1; + http->request->flags.setRefresh(); #if STORE_CLIENT_LIST_DEBUG /* Prevent a race with the store client memory free routines */ @@ -388,7 +390,7 @@ // origin replied 304 if (status == HTTP_NOT_MODIFIED) { http->logType = LOG_TCP_REFRESH_UNMODIFIED; - http->request->flags.stale_if_hit = 0; // old_entry is no longer stale + http->request->flags.clearStaleIfHit(); // old_entry is no longer stale // update headers on existing entry old_rep->updateOnNotModified(http->storeEntry()->getReply()); @@ -396,7 +398,7 @@ // if client sent IMS - if (http->request->flags.ims && !old_entry->modifiedSince(http->request)) { + if (http->request->flags.hasIMS() && !old_entry->modifiedSince(http->request)) { // forward the 304 from origin debugs(88, 3, "handleIMSReply: origin replied 304, revalidating existing entry and forwarding 304 to client"); sendClientUpstreamResponse(); @@ -417,7 +419,7 @@ } // origin replied with an error - else if (http->request->flags.fail_on_validation_err) { + else if (http->request->flags.failOnValidationError()) { http->logType = LOG_TCP_REFRESH_FAIL_ERR; debugs(88, 3, "handleIMSReply: origin replied with error " << status << ", forwarding to client due to fail_on_validation_err"); @@ -539,10 +541,7 @@ return; } - if (e->checkNegativeHit() -#if USE_HTTP_VIOLATIONS - && !r->flags.nocache_hack -#endif + if (e->checkNegativeHit() && !r->flags.noCacheHackEnabled() ) { http->logType = LOG_TCP_NEGATIVE_HIT; sendMoreData(result); @@ -558,7 +557,7 @@ * request. Otherwise two siblings could generate a loop if * both have a stale version of the object. */ - r->flags.need_validation = 1; + r->flags.setNeedValidation(); if (e->lastmod < 0) { /* @@ -567,7 +566,7 @@ */ http->logType = LOG_TCP_MISS; processMiss(); - } else if (r->flags.nocache) { + } else if (r->flags.noCache()) { /* * This did not match a refresh pattern that overrides no-cache * we should honour the client no-cache header. @@ -652,10 +651,10 @@ } /// Deny loops - if (r->flags.loopdetect) { + if (r->flags.loopDetect()) { http->al->http.code = HTTP_FORBIDDEN; err = clientBuildError(ERR_ACCESS_DENIED, HTTP_FORBIDDEN, NULL, http->getConn()->clientConnection->remote, http->request); - createStoreEntry(r->method, request_flags()); + createStoreEntry(r->method, RequestFlags()); errorAppendEntry(http->storeEntry(), err); triggerInitialStoreRead(); return; @@ -730,7 +729,7 @@ if (r.header.has(HDR_IF_NONE_MATCH)) { if (!e->hasIfNoneMatchEtag(r)) { // RFC 2616: ignore IMS if If-None-Match did not match - r.flags.ims = 0; + r.flags.clearIMS(); r.ims = -1; r.imslen = 0; r.header.delById(HDR_IF_MODIFIED_SINCE); @@ -739,7 +738,7 @@ return; } - if (!r.flags.ims) { + if (!r.flags.hasIMS()) { // RFC 2616: if If-None-Match matched and there is no IMS, // reply with 304 Not Modified or 412 Precondition Failed sendNotModifiedOrPreconditionFailedError(); @@ -750,7 +749,7 @@ matchedIfNoneMatch = true; } - if (r.flags.ims) { + if (r.flags.hasIMS()) { // handle If-Modified-Since requests from the client if (e->modifiedSince(&r)) { http->logType = LOG_TCP_IMS_HIT; @@ -993,7 +992,7 @@ /* FIXME: This doesn't need to go through the store. Simply * push down the client chain */ - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); triggerInitialStoreRead(); @@ -1008,7 +1007,7 @@ { clientStreamNode *nextNode = (clientStreamNode *)node->node.next->data; StoreIOBuffer localTempBuffer; - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); localTempBuffer.offset = nextNode->readBuffer.offset + headers_sz; localTempBuffer.length = nextNode->readBuffer.length; localTempBuffer.data = nextNode->readBuffer.data; @@ -1040,7 +1039,7 @@ if (http->flags.done_copying) return 1; - if (http->request->flags.chunked_reply && !flags.complete) { + if (http->request->flags.isReplyChunked() && !flags.complete) { // last-chunk was not sent return 0; } @@ -1184,7 +1183,7 @@ const int64_t expectedBodySize = http->storeEntry()->getReply()->bodySize(http->request->method); - if (!http->request->flags.proxy_keepalive && expectedBodySize < 0) { + if (!http->request->flags.proxyKeepalive() && expectedBodySize < 0) { debugs(88, 5, "clientReplyStatus: closing, content_length < 0"); return STREAM_FAILED; } @@ -1199,7 +1198,7 @@ return STREAM_UNPLANNED_COMPLETE; } - if (http->request->flags.proxy_keepalive) { + if (http->request->flags.proxyKeepalive()) { debugs(88, 5, "clientReplyStatus: stream complete and can keepalive"); return STREAM_COMPLETE; } @@ -1374,9 +1373,9 @@ } // add Warnings required by RFC 2616 if serving a stale hit - if (http->request->flags.stale_if_hit && logTypeIsATcpHit(http->logType)) { + if (http->request->flags.staleIfHit() && logTypeIsATcpHit(http->logType)) { hdr->putWarning(110, "Response is stale"); - if (http->request->flags.need_validation) + if (http->request->flags.validationNeeded()) hdr->putWarning(111, "Revalidation failed"); } @@ -1399,12 +1398,12 @@ || (strncasecmp(value, "Kerberos", 8) == 0 && (value[8] == '\0' || value[8] == ' '))) { - if (request->flags.connection_auth_disabled) { + if (request->flags.connectionAuthDisabled()) { hdr->delAt(pos, connection_auth_blocked); continue; } - request->flags.must_keepalive = 1; - if (!request->flags.accelerated && !request->flags.intercepted) { + request->flags.setMustKeepalive(); + if (!request->flags.accelerated() && !request->flags.intercepted()) { httpHeaderPutStrf(hdr, HDR_PROXY_SUPPORT, "Session-Based-Authentication"); /* We send "[Proxy-]Connection: Proxy-Support" header to mark @@ -1461,36 +1460,36 @@ (request->http_ver >= HttpVersion(1, 1)); /* Check whether we should send keep-alive */ - if (!Config.onoff.error_pconns && reply->sline.status >= 400 && !request->flags.must_keepalive) { + if (!Config.onoff.error_pconns && reply->sline.status >= 400 && !request->flags.mustKeepalive()) { debugs(33, 3, "clientBuildReplyHeader: Error, don't keep-alive"); - request->flags.proxy_keepalive = 0; - } else if (!Config.onoff.client_pconns && !request->flags.must_keepalive) { + request->flags.clearProxyKeepalive(); + } else if (!Config.onoff.client_pconns && !request->flags.mustKeepalive()) { debugs(33, 2, "clientBuildReplyHeader: Connection Keep-Alive not requested by admin or client"); - request->flags.proxy_keepalive = 0; - } else if (request->flags.proxy_keepalive && shutting_down) { + request->flags.clearProxyKeepalive(); + } else if (request->flags.proxyKeepalive() && shutting_down) { debugs(88, 3, "clientBuildReplyHeader: Shutting down, don't keep-alive."); - request->flags.proxy_keepalive = 0; - } else if (request->flags.connection_auth && !reply->keep_alive) { + request->flags.clearProxyKeepalive(); + } else if (request->flags.connectionAuthWanted() && !reply->keep_alive) { debugs(33, 2, "clientBuildReplyHeader: Connection oriented auth but server side non-persistent"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } else if (reply->bodySize(request->method) < 0 && !maySendChunkedReply) { debugs(88, 3, "clientBuildReplyHeader: can't keep-alive, unknown body size" ); - request->flags.proxy_keepalive = 0; - } else if (fdUsageHigh()&& !request->flags.must_keepalive) { + request->flags.clearProxyKeepalive(); + } else if (fdUsageHigh()&& !request->flags.mustKeepalive()) { debugs(88, 3, "clientBuildReplyHeader: Not many unused FDs, can't keep-alive"); - request->flags.proxy_keepalive = 0; - } else if (request->flags.sslBumped && !reply->persistent()) { + request->flags.clearProxyKeepalive(); + } else if (request->flags.sslBumped() && !reply->persistent()) { // We do not really have to close, but we pretend we are a tunnel. debugs(88, 3, "clientBuildReplyHeader: bumped reply forces close"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } // Decide if we send chunked reply if (maySendChunkedReply && - request->flags.proxy_keepalive && + request->flags.proxyKeepalive() && reply->bodySize(request->method) < 0) { debugs(88, 3, "clientBuildReplyHeader: chunked reply"); - request->flags.chunked_reply = 1; + request->flags.markReplyChunked(); hdr->putStr(HDR_TRANSFER_ENCODING, "chunked"); } @@ -1508,7 +1507,7 @@ hdr->putStr(HDR_VIA, strVia.termedBuf()); } /* Signal keep-alive or close explicitly */ - hdr->putStr(HDR_CONNECTION, request->flags.proxy_keepalive ? "keep-alive" : "close"); + hdr->putStr(HDR_CONNECTION, request->flags.proxyKeepalive() ? "keep-alive" : "close"); #if ADD_X_REQUEST_URI /* @@ -1556,7 +1555,7 @@ { HttpRequest *r = http->request; - if (r->flags.cachable || r->flags.internal) { + if (r->flags.isCachable() || r->flags.isInternal()) { lookingforstore = 5; StoreEntry::getPublicByRequest (this, r); } else { @@ -1587,29 +1586,23 @@ /** \li If the request has no-cache flag set or some no_cache HACK in operation we * 'invalidate' the cached IP entries for this request ??? */ - if (r->flags.nocache) { - -#if USE_DNSHELPER - ipcacheInvalidate(r->GetHost()); -#else - ipcacheInvalidateNegative(r->GetHost()); -#endif /* USE_DNSHELPER */ - - } - -#if USE_HTTP_VIOLATIONS - - else if (r->flags.nocache_hack) { - -#if USE_DNSHELPER - ipcacheInvalidate(r->GetHost()); -#else - ipcacheInvalidateNegative(r->GetHost()); -#endif /* USE_DNSHELPER */ - - } - -#endif /* USE_HTTP_VIOLATIONS */ + if (r->flags.noCache()) { + +#if USE_DNSHELPER + ipcacheInvalidate(r->GetHost()); +#else + ipcacheInvalidateNegative(r->GetHost()); +#endif /* USE_DNSHELPER */ + + } + + else if (r->flags.noCacheHackEnabled()) { +#if USE_DNSHELPER + ipcacheInvalidate(r->GetHost()); +#else + ipcacheInvalidateNegative(r->GetHost()); +#endif /* USE_DNSHELPER */ + } #if USE_CACHE_DIGESTS lookup_type = http->storeEntry() ? "HIT" : "MISS"; @@ -1657,7 +1650,7 @@ return; } - if (r->flags.nocache) { + if (r->flags.noCache()) { debugs(85, 3, "clientProcessRequest2: no-cache REFRESH MISS"); http->storeEntry(NULL); http->logType = LOG_TCP_CLIENT_REFRESH_MISS; @@ -1827,7 +1820,7 @@ debugs(88, 5, "clientReplyContext::sendStreamError: A stream error has occured, marking as complete and sending no data."); StoreIOBuffer localTempBuffer; flags.complete = 1; - http->request->flags.stream_error = 1; + http->request->flags.setStreamError(); localTempBuffer.flags.error = result.flags.error; clientStreamCallback((clientStreamNode*)http->client_stream.head->data, http, NULL, localTempBuffer); @@ -1898,7 +1891,7 @@ HttpReply *const temprep = e->getReply()->make304(); http->logType = LOG_TCP_IMS_HIT; removeClientStoreReference(&sc, http); - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); e = http->storeEntry(); // Copy timestamp from the original entry so the 304 // reply has a meaningful Age: header. @@ -2160,7 +2153,7 @@ /* Using this breaks the client layering just a little! */ void -clientReplyContext::createStoreEntry(const HttpRequestMethod& m, request_flags reqFlags) +clientReplyContext::createStoreEntry(const HttpRequestMethod& m, RequestFlags reqFlags) { assert(http != NULL); /* === modified file 'src/client_side_reply.h' --- src/client_side_reply.h 2012-08-07 15:12:08 +0000 +++ src/client_side_reply.h 2012-09-10 12:49:35 +0000 @@ -31,11 +31,12 @@ #ifndef SQUID_CLIENTSIDEREPLY_H #define SQUID_CLIENTSIDEREPLY_H +#include "client_side_request.h" +#include "clientStream.h" +#include "HttpHeader.h" #include "RefCount.h" -#include "HttpHeader.h" -#include "clientStream.h" +#include "RequestFlags.h" #include "StoreClient.h" -#include "client_side_request.h" class ErrorState; #include "ip/forward.h" @@ -82,7 +83,7 @@ #endif /// creates a store entry for the reply and appends err to it void setReplyToError(const HttpRequestMethod& method, ErrorState *err); - void createStoreEntry(const HttpRequestMethod& m, request_flags flags); + void createStoreEntry(const HttpRequestMethod& m, RequestFlags flags); void removeStoreReference(store_client ** scp, StoreEntry ** ep); void removeClientStoreReference(store_client **scp, ClientHttpRequest *http); void startError(ErrorState * err); === modified file 'src/client_side_request.cc' --- src/client_side_request.cc 2012-09-01 14:38:36 +0000 +++ src/client_side_request.cc 2012-09-14 11:50:29 +0000 @@ -67,6 +67,7 @@ #include "MemObject.h" #include "Parsing.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StrList.h" @@ -386,9 +387,10 @@ /* * build new header list *? TODO */ - request->flags.accelerated = http->flags.accel; + if (http->flags.accel) + request->flags.markAccelerated(); - request->flags.internalclient = 1; + request->flags.setInternalClient(); /* this is an internally created * request, not subject to acceleration @@ -533,7 +535,7 @@ conn->log_addr = request->indirect_client_addr; } request->x_forwarded_for_iterator.clean(); - request->flags.done_follow_x_forwarded_for = 1; + request->flags.setDoneFollowXFF(); if (answer != ACCESS_ALLOWED && answer != ACCESS_DENIED) { debugs(28, DBG_CRITICAL, "ERROR: Processing X-Forwarded-For. Stopping at IP address: " << request->indirect_client_addr ); @@ -564,7 +566,7 @@ for (int i = 0; i < ia->count; ++i) { if (clientConn->local.matchIPAddr(ia->in_addrs[i]) == 0) { debugs(85, 3, HERE << "validate IP " << clientConn->local << " possible from Host:"); - http->request->flags.hostVerified = 1; + http->request->flags.markHostVerified(); http->doCallouts(); return; } @@ -586,9 +588,9 @@ // NP: it is tempting to use 'flags.nocache' but that is all about READing cache data. // The problems here are about WRITE for new cache content, which means flags.cachable - http->request->flags.cachable = 0; // MUST NOT cache (for now) + http->request->flags.setNotCachable(); // MUST NOT cache (for now) // XXX: when we have updated the cache key to base on raw-IP + URI this cacheable limit can go. - http->request->flags.hierarchical = 0; // MUST NOT pass to peers (for now) + http->request->flags.clearHierarchical(); // MUST NOT pass to peers (for now) // XXX: when we have sorted out the best way to relay requests properly to peers this hierarchical limit can go. http->doCallouts(); return; @@ -632,7 +634,7 @@ return; } - if (http->request->flags.internal) { + if (http->request->flags.isInternal()) { // TODO: kill this when URL handling allows partial URLs out of accel mode // and we no longer screw with the URL just to add our internal host there debugs(85, 6, HERE << "validate skipped due to internal composite URL."); @@ -663,7 +665,7 @@ } debugs(85, 3, HERE << "validate host=" << host << ", port=" << port << ", portStr=" << (portStr?portStr:"NULL")); - if (http->request->flags.intercepted || http->request->flags.spoof_client_ip) { + if (http->request->flags.intercepted() || http->request->flags.spoofClientIp()) { // verify the Host: port (if any) matches the apparent destination if (portStr && port != http->getConn()->clientConnection->local.GetPort()) { debugs(85, 3, HERE << "FAIL on validate port " << http->getConn()->clientConnection->local.GetPort() << @@ -698,7 +700,7 @@ } else { // Okay no problem. debugs(85, 3, HERE << "validate passed."); - http->request->flags.hostVerified = 1; + http->request->flags.markHostVerified(); http->doCallouts(); } safe_free(hostB); @@ -709,7 +711,7 @@ ClientRequestContext::clientAccessCheck() { #if FOLLOW_X_FORWARDED_FOR - if (!http->request->flags.done_follow_x_forwarded_for && + if (!http->request->flags.doneFollowXFF() && Config.accessList.followXFF && http->request->header.has(HDR_X_FORWARDED_FOR)) { @@ -725,7 +727,7 @@ acl_checklist->nonBlockingCheck(clientFollowXForwardedForCheck, this); return; } -#endif /* FOLLOW_X_FORWARDED_FOR */ +#endif if (Config.accessList.http) { acl_checklist = clientAclChecklistCreate(Config.accessList.http, http); @@ -809,7 +811,7 @@ if (auth_challenge) { #if USE_AUTH - if (http->request->flags.sslBumped) { + if (http->request->flags.sslBumped()) { /*SSL Bumped request, authentication is not possible*/ status = HTTP_FORBIDDEN; } else if (!http->flags.accel) { @@ -923,7 +925,7 @@ const wordlist *p = NULL; // intercepted requests MUST NOT (yet) be sent to peers unless verified - if (!request->flags.hostVerified && (request->flags.intercepted || request->flags.spoof_client_ip)) + if (!request->flags.hostVerified() && (request->flags.intercepted() || request->flags.spoofClientIp())) return 0; /* @@ -931,14 +933,14 @@ * neighbors support private keys */ - if (request->flags.ims && !neighbors_do_private_keys) + if (request->flags.hasIMS() && !neighbors_do_private_keys) return 0; /* * This is incorrect: authenticating requests can be sent via a hierarchy * (they can even be cached if the correct headers are set on the reply) */ - if (request->flags.auth) + if (request->flags.hasAuth()) return 0; if (method == METHOD_TRACE) @@ -952,7 +954,7 @@ if (strstr(url, p->key)) return 0; - if (request->flags.loopdetect) + if (request->flags.loopDetect()) return 0; if (request->protocol == AnyP::PROTO_HTTP) @@ -980,14 +982,15 @@ if (!http_conn) return; - request->flags.connection_auth_disabled = http_conn->port->connection_auth_disabled; - if (!request->flags.connection_auth_disabled) { + if (http_conn->port->connection_auth_disabled) + request->flags.disableConnectionAuth(); + if (!request->flags.connectionAuthDisabled()) { if (Comm::IsConnOpen(http_conn->pinning.serverConnection)) { if (http_conn->pinning.auth) { - request->flags.connection_auth = 1; - request->flags.auth = 1; + request->flags.wantConnectionAuth(); + request->flags.markAuth(); } else { - request->flags.connection_proxy_auth = 1; + request->flags.requestConnectionProxyAuth(); } // These should already be linked correctly. assert(request->clientConnectionManager == http_conn); @@ -995,11 +998,11 @@ } /* check if connection auth is used, and flag as candidate for pinning - * in such case. + * in such case.; * Note: we may need to set flags.connection_auth even if the connection * is already pinned if it was pinned earlier due to proxy auth */ - if (!request->flags.connection_auth) { + if (!request->flags.connectionAuthWanted()) { if (req_hdr->has(HDR_AUTHORIZATION) || req_hdr->has(HDR_PROXY_AUTHORIZATION)) { HttpHeaderPos pos = HttpHeaderInitPos; HttpHeaderEntry *e; @@ -1013,10 +1016,10 @@ || strncasecmp(value, "Kerberos ", 9) == 0) { if (e->id == HDR_AUTHORIZATION) { - request->flags.connection_auth = 1; + request->flags.wantConnectionAuth(); may_pin = 1; } else { - request->flags.connection_proxy_auth = 1; + request->flags.requestConnectionProxyAuth(); may_pin = 1; } } @@ -1042,9 +1045,9 @@ request->ims = req_hdr->getTime(HDR_IF_MODIFIED_SINCE); if (request->ims > 0) - request->flags.ims = 1; + request->flags.setIMS(); - if (!request->flags.ignore_cc) { + if (!request->flags.ignoringCacheControl()) { if (req_hdr->has(HDR_PRAGMA)) { String s = req_hdr->getList(HDR_PRAGMA); @@ -1066,7 +1069,7 @@ * SP1 or not so all 5.5 versions are treated 'normally'). */ if (Config.onoff.ie_refresh) { - if (http->flags.accel && request->flags.ims) { + if (http->flags.accel && request->flags.hasIMS()) { if ((str = req_hdr->getStr(HDR_USER_AGENT))) { if (strstr(str, "MSIE 5.01") != NULL) no_cache=true; @@ -1089,13 +1092,13 @@ #if USE_HTTP_VIOLATIONS if (Config.onoff.reload_into_ims) - request->flags.nocache_hack = 1; + request->flags.hackNocache(); else if (refresh_nocache_hack) - request->flags.nocache_hack = 1; + request->flags.hackNocache(); else #endif - request->flags.nocache = 1; + request->flags.setNocache(); } /* ignore range header in non-GETs or non-HEADs */ @@ -1105,7 +1108,7 @@ request->range = req_hdr->getRange(); if (request->range) { - request->flags.range = 1; + request->flags.setRanged(); clientStreamNode *node = (clientStreamNode *)http->client_stream.tail->data; /* XXX: This is suboptimal. We should give the stream the range set, * and thereby let the top of the stream set the offset when the @@ -1131,12 +1134,12 @@ } if (req_hdr->has(HDR_AUTHORIZATION)) - request->flags.auth = 1; + request->flags.markAuth(); clientCheckPinning(http); if (request->login[0] != '\0') - request->flags.auth = 1; + request->flags.markAuth(); if (req_hdr->has(HDR_VIA)) { String s = req_hdr->getList(HDR_VIA); @@ -1149,7 +1152,7 @@ if (strListIsSubstr(&s, ThisCache2, ',')) { debugObj(33, 1, "WARNING: Forwarding loop detected for:\n", request, (ObjPackMethod) & httpRequestPack); - request->flags.loopdetect = 1; + request->flags.setLoopDetect(); } #if USE_FORW_VIA_DB @@ -1170,17 +1173,17 @@ #endif - request->flags.cachable = http->request->cacheable(); + request->flags.setCachable(http->request->cacheable()); if (clientHierarchical(http)) - request->flags.hierarchical = 1; + request->flags.setHierarchical(); debugs(85, 5, "clientInterpretRequestHeaders: REQ_NOCACHE = " << - (request->flags.nocache ? "SET" : "NOT SET")); + (request->flags.noCache() ? "SET" : "NOT SET")); debugs(85, 5, "clientInterpretRequestHeaders: REQ_CACHABLE = " << - (request->flags.cachable ? "SET" : "NOT SET")); + (request->flags.isCachable() ? "SET" : "NOT SET")); debugs(85, 5, "clientInterpretRequestHeaders: REQ_HIERARCHICAL = " << - (request->flags.hierarchical ? "SET" : "NOT SET")); + (request->flags.hierarchical() ? "SET" : "NOT SET")); } @@ -1228,7 +1231,7 @@ debugs(61,2, HERE << "URL-rewriter diverts URL from " << urlCanonical(old_request) << " to " << urlCanonical(new_request)); // update the new request to flag the re-writing was done on it - new_request->flags.redirected = 1; + new_request->flags.markRedirected(); // unlink bodypipe from the old request. Not needed there any longer. if (old_request->body_pipe != NULL) { @@ -1290,7 +1293,8 @@ ClientRequestContext::checkNoCacheDone(const allow_t &answer) { acl_checklist = NULL; - http->request->flags.cachable = (answer == ACCESS_ALLOWED); + if (answer == ACCESS_ALLOWED) + http->request->flags.setCachable(); http->doCallouts(); } @@ -1598,7 +1602,7 @@ if (!calloutContext->no_cache_done) { calloutContext->no_cache_done = true; - if (Config.accessList.noCache && request->flags.cachable) { + if (Config.accessList.noCache && request->flags.isCachable()) { debugs(83, 3, HERE << "Doing calloutContext->checkNoCache()"); calloutContext->checkNoCache(); return; === modified file 'src/comm.cc' --- src/comm.cc 2012-08-31 16:57:39 +0000 +++ src/comm.cc 2012-09-04 09:10:20 +0000 @@ -59,6 +59,7 @@ #include "MemBuf.h" #include "pconn.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "StoreIOBuffer.h" === modified file 'src/comm/ConnOpener.cc' --- src/comm/ConnOpener.cc 2012-08-31 16:57:39 +0000 +++ src/comm/ConnOpener.cc 2012-09-04 15:15:51 +0000 @@ -3,6 +3,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "comm/ConnOpener.h" #include "comm/Connection.h" #include "comm/Loops.h" @@ -12,12 +13,15 @@ #include "globals.h" #include "icmp/net_db.h" #include "ipcache.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H #include #endif +class CachePeer; + CBDATA_NAMESPACED_CLASS_INIT(Comm, ConnOpener); Comm::ConnOpener::ConnOpener(Comm::ConnectionPointer &c, AsyncCall::Pointer &handler, time_t ctimeout) : @@ -203,11 +207,11 @@ /* * stats.conn_open is used to account for the number of - * connections that we have open to the peer, so we can limit + * connections that we have open to the CachePeer, so we can limit * based on the max-conn option. We need to increment here, * even if the connection may fail. */ - if (peer *peer=(conn_->getPeer())) + if (CachePeer *peer=(conn_->getPeer())) ++peer->stats.conn_open; lookupLocalAddress(); === modified file 'src/comm/Connection.cc' --- src/comm/Connection.cc 2012-08-06 17:41:08 +0000 +++ src/comm/Connection.cc 2012-09-04 15:15:51 +0000 @@ -1,10 +1,12 @@ #include "squid.h" +#include "CachePeer.h" #include "cbdata.h" #include "comm.h" #include "comm/Connection.h" #include "fde.h" #include "SquidTime.h" +class CachePeer; bool Comm::IsConnOpen(const Comm::ConnectionPointer &conn) { @@ -18,7 +20,7 @@ fd(-1), tos(0), flags(COMM_NONBLOCKING), - _peer(NULL) + peer_(NULL) { *rfc931 = 0; // quick init the head. the rest does not matter. } @@ -32,7 +34,7 @@ close(); } - cbdataReferenceDone(_peer); + cbdataReferenceDone(peer_); } Comm::ConnectionPointer @@ -49,8 +51,8 @@ // ensure FD is not open in the new copy. c->fd = -1; - // ensure we have a cbdata reference to _peer not a straight ptr copy. - c->_peer = cbdataReference(getPeer()); + // ensure we have a cbdata reference to peer_ not a straight ptr copy. + c->peer_ = cbdataReference(getPeer()); return c; } @@ -61,29 +63,29 @@ if (isOpen()) { comm_close(fd); fd = -1; - if (peer *p=getPeer()) + if (CachePeer *p=getPeer()) -- p->stats.conn_open; } } -peer * +CachePeer * Comm::Connection::getPeer() const { - if (cbdataReferenceValid(_peer)) - return _peer; + if (cbdataReferenceValid(peer_)) + return peer_; return NULL; } void -Comm::Connection::setPeer(peer *p) +Comm::Connection::setPeer(CachePeer *p) { /* set to self. nothing to do. */ if (getPeer() == p) return; - cbdataReferenceDone(_peer); + cbdataReferenceDone(peer_); if (p) { - _peer = cbdataReference(p); + peer_ = cbdataReference(p); } } === modified file 'src/comm/Connection.h' --- src/comm/Connection.h 2012-08-14 11:53:07 +0000 +++ src/comm/Connection.h 2012-09-04 14:38:44 +0000 @@ -56,7 +56,7 @@ #include #endif -struct peer; +class CachePeer; namespace Comm { @@ -108,16 +108,16 @@ /** determine whether this object describes an active connection or not. */ bool isOpen() const { return (fd >= 0); } - /** retrieve the peer pointer for use. + /** retrieve the CachePeer pointer for use. * The caller is responsible for all CBDATA operations regarding the * used of the pointer returned. */ - peer * getPeer() const; + CachePeer * getPeer() const; - /** alter the stored peer pointer. - * Perform appropriate CBDATA operations for locking the peer pointer + /** alter the stored CachePeer pointer. + * Perform appropriate CBDATA operations for locking the CachePeer pointer */ - void setPeer(peer * p); + void setPeer(CachePeer * p); private: /** These objects may not be exactly duplicated. Use copyDetails() instead. */ @@ -156,12 +156,8 @@ #endif private: - // XXX: we need to call this member peer_ but the struct peer_ global type - // behind peer* clashes despite our private Comm:: namespace - // (it being global gets inherited here too). - /** cache_peer data object (if any) */ - peer *_peer; + CachePeer *peer_; }; }; // namespace Comm === modified file 'src/comm/ModPoll.cc' --- src/comm/ModPoll.cc 2012-09-01 14:38:36 +0000 +++ src/comm/ModPoll.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "ICP.h" #include "mgr/Registration.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/comm/ModSelect.cc' --- src/comm/ModSelect.cc 2012-09-01 14:38:36 +0000 +++ src/comm/ModSelect.cc 2012-09-05 09:41:45 +0000 @@ -43,6 +43,7 @@ #include "StatCounters.h" #include "StatHist.h" #include "Store.h" +#include "SquidConfig.h" #if HAVE_SYS_STAT_H #include === modified file 'src/comm/TcpAcceptor.cc' --- src/comm/TcpAcceptor.cc 2012-08-31 16:57:39 +0000 +++ src/comm/TcpAcceptor.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "globals.h" #include "ip/Intercept.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/dns.cc' --- src/dns.cc 2012-09-01 14:38:36 +0000 +++ src/dns.cc 2012-09-05 09:41:45 +0000 @@ -32,11 +32,12 @@ */ #include "squid.h" +#include "helper.h" +#include "mgr/Registration.h" +#include "SquidConfig.h" +#include "SquidTime.h" #include "Store.h" #include "wordlist.h" -#include "SquidTime.h" -#include "mgr/Registration.h" -#include "helper.h" /* MS VisualStudio Projects are monolitich, so we need the following #if to include the external DNS code in compile process when === modified file 'src/dns_internal.cc' --- src/dns_internal.cc 2012-09-01 14:38:36 +0000 +++ src/dns_internal.cc 2012-09-04 09:10:20 +0000 @@ -45,6 +45,7 @@ #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc3596.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "tools.h" === modified file 'src/errorpage.cc' --- src/errorpage.cc 2012-09-01 14:38:36 +0000 +++ src/errorpage.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "fde.h" #include "MemBuf.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "URL.h" #include "URLScheme.h" #include "URL.h" === modified file 'src/esi/Esi.cc' --- src/esi/Esi.cc 2012-08-31 16:57:39 +0000 +++ src/esi/Esi.cc 2012-09-04 09:10:20 +0000 @@ -60,6 +60,7 @@ #include "Mem.h" #include "MemBuf.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" /* quick reference on behaviour here. * The ESI specification 1.0 requires the ESI processor to be able to === modified file 'src/external_acl.cc' --- src/external_acl.cc 2012-09-01 14:38:36 +0000 +++ src/external_acl.cc 2012-09-04 09:10:20 +0000 @@ -55,6 +55,7 @@ #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/fde.h' --- src/fde.h 2012-08-14 11:53:07 +0000 +++ src/fde.h 2012-09-04 15:15:51 +0000 @@ -34,6 +34,10 @@ #include "ip/Address.h" #include "structs.h" +#if USE_SSL +#include +#endif + #if USE_DELAY_POOLS class ClientInfo; #endif === modified file 'src/format/Format.cc' --- src/format/Format.cc 2012-08-31 16:57:39 +0000 +++ src/format/Format.cc 2012-09-12 16:06:56 +0000 @@ -383,8 +383,8 @@ case LFT_LOCAL_LISTENING_IP: { // avoid logging a dash if we have reliable info const bool interceptedAtKnownPort = al->request ? - (al->request->flags.spoof_client_ip || - al->request->flags.intercepted) && al->cache.port : + (al->request->flags.spoofClientIp() || + al->request->flags.intercepted()) && al->cache.port : false; if (interceptedAtKnownPort) { const bool portAddressConfigured = !al->cache.port->s.IsAnyAddr(); === modified file 'src/format/Token.cc' --- src/format/Token.cc 2012-08-06 17:41:08 +0000 +++ src/format/Token.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "format/Config.h" #include "format/Token.h" #include "format/TokenTableEntry.h" +#include "SquidConfig.h" #include "Store.h" const char *Format::log_tags[] = { === modified file 'src/forward.cc' --- src/forward.cc 2012-09-13 06:56:05 +0000 +++ src/forward.cc 2012-09-13 16:20:41 +0000 @@ -32,9 +32,11 @@ #include "squid.h" #include "AccessLogEntry.h" +#include "acl/AclAddress.h" #include "acl/FilledChecklist.h" #include "acl/Gadgets.h" #include "anyp/PortCfg.h" +#include "CachePeer.h" #include "CacheManager.h" #include "client_side.h" #include "comm/Connection.h" @@ -63,6 +65,7 @@ #include "neighbors.h" #include "pconn.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -370,7 +373,7 @@ fail(anErr); } // else use actual error from last connection attempt #if USE_SSL - if (request->flags.sslPeek && request->clientConnectionManager.valid()) { + if (request->flags.sslPeek() && request->clientConnectionManager.valid()) { errorAppendEntry(entry, err); // will free err err = NULL; CallJobHere1(17, 4, request->clientConnectionManager, ConnStateData, @@ -718,7 +721,7 @@ // a user-entered address (a host name or a user-entered IP). const bool isConnectRequest = !request->clientConnectionManager->port->spoof_client_ip && !request->clientConnectionManager->port->intercepted; - if (request->flags.sslPeek && !isConnectRequest) { + if (request->flags.sslPeek() && !isConnectRequest) { if (X509 *srvX509 = errDetails->peerCert()) { if (const char *name = Ssl::CommonHostName(srvX509)) { request->SetHost(name); @@ -767,7 +770,7 @@ { SSL *ssl; SSL_CTX *sslContext = NULL; - const peer *peer = serverConnection()->getPeer(); + const CachePeer *peer = serverConnection()->getPeer(); int fd = serverConnection()->fd; if (peer) { @@ -815,7 +818,7 @@ const bool hostnameIsIp = request->GetHostIsNumeric(); const bool isConnectRequest = !request->clientConnectionManager->port->spoof_client_ip && !request->clientConnectionManager->port->intercepted; - if (!request->flags.sslPeek || isConnectRequest) + if (!request->flags.sslPeek() || isConnectRequest) SSL_set_ex_data(ssl, ssl_ex_index_server, (void*)hostname); // Use SNI TLS extension only when we connect directly @@ -879,20 +882,20 @@ peerConnectSucceded(serverConnection()->getPeer()); // some requests benefit from pinning but do not require it and can "repin" - const bool rePin = request->flags.canRePin && + const bool rePin = request->flags.canRePin() && request->clientConnectionManager.valid(); if (rePin) { debugs(17, 3, HERE << "repinning " << serverConn); request->clientConnectionManager->pinConnection(serverConn, - request, serverConn->getPeer(), request->flags.auth); - request->flags.pinned = 1; + request, serverConn->getPeer(), request->flags.hasAuth()); + request->flags.markPinned(); } #if USE_SSL - if (!request->flags.pinned || rePin) { + if (!request->flags.pinned() || rePin) { if ((serverConnection()->getPeer() && serverConnection()->getPeer()->use_ssl) || (!serverConnection()->getPeer() && request->protocol == AnyP::PROTO_HTTPS) || - request->flags.sslPeek) { + request->flags.sslPeek()) { initiateSSL(); return; } @@ -956,7 +959,7 @@ if (ftimeout < ctimeout) ctimeout = ftimeout; - if (serverDestinations[0]->getPeer() && request->flags.sslBumped == true) { + if (serverDestinations[0]->getPeer() && request->flags.sslBumped() == true) { debugs(50, 4, "fwdConnectStart: Ssl bumped connections through parrent proxy are not allowed"); ErrorState *anErr = new ErrorState(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE, request); fail(anErr); @@ -964,7 +967,7 @@ return; } - request->flags.pinned = 0; // XXX: what if the ConnStateData set this to flag existing credentials? + request->flags.clearPinned(); // XXX: what if the ConnStateData set this to flag existing credentials? // XXX: answer: the peer selection *should* catch it and give us only the pinned peer. so we reverse the =0 step below. // XXX: also, logs will now lie if pinning is broken and leads to an error message. if (serverDestinations[0]->peerType == PINNED) { @@ -981,9 +984,9 @@ serverConn->peerType = HIER_DIRECT; #endif ++n_tries; - request->flags.pinned = 1; + request->flags.markPinned(); if (pinned_connection->pinnedAuth()) - request->flags.auth = 1; + request->flags.markAuth(); comm_add_close_handler(serverConn->fd, fwdServerClosedWrapper, this); // the server may close the pinned connection before this request pconnRace = racePossible; @@ -992,7 +995,7 @@ } /* Failure. Fall back on next path unless we can re-pin */ debugs(17,2,HERE << "Pinned connection failed: " << pinned_connection); - if (pconnRace != raceHappened || !request->flags.canRePin) { + if (pconnRace != raceHappened || !request->flags.canRePin()) { serverDestinations.shift(); pconnRace = raceImpossible; startConnectionOrFail(); @@ -1125,7 +1128,7 @@ #endif #if USE_SSL - if (request->flags.sslPeek) { + if (request->flags.sslPeek()) { CallJobHere1(17, 4, request->clientConnectionManager, ConnStateData, ConnStateData::httpsPeeked, serverConnection()); unregister(serverConn); // async call owns it now @@ -1140,7 +1143,7 @@ request->peer_domain = serverConnection()->getPeer()->domain; httpStart(this); } else { - assert(!request->flags.sslPeek); + assert(!request->flags.sslPeek()); request->peer_login = NULL; request->peer_domain = NULL; @@ -1254,7 +1257,7 @@ ErrorState * FwdState::makeConnectingError(const err_type type) const { - return new ErrorState(type, request->flags.need_validation ? + return new ErrorState(type, request->flags.validationNeeded() ? HTTP_GATEWAY_TIMEOUT : HTTP_SERVICE_UNAVAILABLE, request); } @@ -1400,7 +1403,7 @@ conn->local.SetIPv4(); // maybe use TPROXY client address - if (request && request->flags.spoof_client_ip) { + if (request && request->flags.spoofClientIp()) { if (!conn->getPeer() || !conn->getPeer()->options.no_tproxy) { #if FOLLOW_X_FORWARDED_FOR && LINUX_NETFILTER if (Config.onoff.tproxy_uses_indirect_client) @@ -1427,7 +1430,7 @@ // TODO use the connection details in ACL. // needs a bit of rework in ACLFilledChecklist to use Comm::Connection instead of ConnStateData - acl_address *l; + AclAddress *l; for (l = Config.accessList.outgoing_address; l; l = l->next) { /* check if the outgoing address is usable to the destination */ === modified file 'src/forward.h' --- src/forward.h 2012-08-29 14:27:18 +0000 +++ src/forward.h 2012-09-05 15:12:36 +0000 @@ -4,6 +4,7 @@ #include "Array.h" #include "comm.h" #include "comm/Connection.h" +#include "err_type.h" #include "fde.h" #include "ip/Address.h" #include "RefCount.h" === modified file 'src/fqdncache.cc' --- src/fqdncache.cc 2012-09-01 14:38:36 +0000 +++ src/fqdncache.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "event.h" #include "Mem.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/fs/coss/store_dir_coss.cc' --- src/fs/coss/store_dir_coss.cc 2012-08-30 08:30:12 +0000 +++ src/fs/coss/store_dir_coss.cc 2012-09-06 14:22:03 +0000 @@ -52,6 +52,7 @@ #include "store_key_md5.h" #include "swap_log_op.h" #include "store_rebuild.h" +#include "SquidConfig.h" #include "SquidMath.h" #if HAVE_ERRNO_H @@ -76,7 +77,7 @@ unsigned int clean:1; } flags; - struct _store_rebuild_data counts; + StoreRebuildData counts; }; static char *storeCossDirSwapLogFile(SwapDir *, const char *); === modified file 'src/fs/coss/store_io_coss.cc' --- src/fs/coss/store_io_coss.cc 2012-09-01 14:38:36 +0000 +++ src/fs/coss/store_io_coss.cc 2012-09-04 09:10:20 +0000 @@ -33,13 +33,14 @@ #include "squid.h" #include "CossSwapDir.h" +#include "DiskIO/DiskIOStrategy.h" +#include "fde.h" +#include "MemObject.h" +#include "SquidConfig.h" +#include "store_coss.h" #include "Store.h" -#include "store_coss.h" -#include "MemObject.h" -#include "fde.h" +#include "StoreFScoss.h" #include "SwapDir.h" -#include "StoreFScoss.h" -#include "DiskIO/DiskIOStrategy.h" CBDATA_TYPE(CossMemBuf); === modified file 'src/fs/rock/RockRebuild.h' --- src/fs/rock/RockRebuild.h 2011-09-06 22:32:30 +0000 +++ src/fs/rock/RockRebuild.h 2012-09-06 14:22:03 +0000 @@ -2,7 +2,8 @@ #define SQUID_FS_ROCK_REBUILD_H #include "base/AsyncJob.h" -#include "structs.h" +#include "cbdata.h" +#include "store_rebuild.h" namespace Rock { @@ -39,7 +40,7 @@ int64_t dbOffset; int filen; - struct _store_rebuild_data counts; + StoreRebuildData counts; static void Steps(void *data); === modified file 'src/fs/rock/RockSwapDir.cc' --- src/fs/rock/RockSwapDir.cc 2012-09-01 14:38:36 +0000 +++ src/fs/rock/RockSwapDir.cc 2012-09-04 09:10:20 +0000 @@ -17,6 +17,7 @@ #include "ipc/mem/Pages.h" #include "MemObject.h" #include "Parsing.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "tools.h" === modified file 'src/fs/ufs/RebuildState.cc' --- src/fs/ufs/RebuildState.cc 2012-08-31 16:57:39 +0000 +++ src/fs/ufs/RebuildState.cc 2012-09-04 09:10:20 +0000 @@ -34,6 +34,7 @@ #include "disk.h" #include "globals.h" #include "RebuildState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "store_key_md5.h" #include "store_rebuild.h" === modified file 'src/fs/ufs/RebuildState.h' --- src/fs/ufs/RebuildState.h 2012-08-28 13:00:30 +0000 +++ src/fs/ufs/RebuildState.h 2012-09-06 14:22:03 +0000 @@ -32,8 +32,8 @@ #include "RefCount.h" #include "UFSSwapDir.h" -#include "structs.h" #include "UFSSwapLogParser.h" +#include "store_rebuild.h" class StoreEntry; @@ -76,7 +76,7 @@ char fullpath[MAXPATHLEN]; char fullfilename[MAXPATHLEN]; - struct _store_rebuild_data counts; + StoreRebuildData counts; private: CBDATA_CLASS2(RebuildState); === modified file 'src/fs/ufs/UFSSwapDir.cc' --- src/fs/ufs/UFSSwapDir.cc 2012-08-31 16:57:39 +0000 +++ src/fs/ufs/UFSSwapDir.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "store_key_md5.h" #include "StoreSearchUFS.h" #include "StoreSwapLogData.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "tools.h" === modified file 'src/ftp.cc' --- src/ftp.cc 2012-09-01 14:38:36 +0000 +++ src/ftp.cc 2012-09-04 09:10:20 +0000 @@ -53,6 +53,7 @@ #include "mime.h" #include "rfc1738.h" #include "Server.h" +#include "SquidConfig.h" #include "SquidString.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/globals.h' --- src/globals.h 2012-09-01 14:38:36 +0000 +++ src/globals.h 2012-09-06 14:48:49 +0000 @@ -40,6 +40,8 @@ #include "defines.h" /* for iostats */ +#include "acl/AclDenyInfoList.h" +#include "CacheDigest.h" #include "structs.h" extern char *ConfigFile; /* NULL */ @@ -87,7 +89,7 @@ extern int n_disk_objects; /* 0 */ extern iostats IOStats; -extern struct acl_deny_info_list *DenyInfoList; /* NULL */ +extern AclDenyInfoList *DenyInfoList; /* NULL */ extern struct timeval squid_start; extern int starting_up; /* 1 */ === modified file 'src/gopher.cc' --- src/gopher.cc 2012-08-31 16:57:39 +0000 +++ src/gopher.cc 2012-09-04 09:10:20 +0000 @@ -43,6 +43,7 @@ #include "MemBuf.h" #include "mime.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/htcp.cc' --- src/htcp.cc 2012-09-01 14:38:36 +0000 +++ src/htcp.cc 2012-09-04 15:15:51 +0000 @@ -35,6 +35,7 @@ #include "AccessLogEntry.h" #include "acl/Acl.h" #include "acl/FilledChecklist.h" +#include "CachePeer.h" #include "comm.h" #include "comm/Connection.h" #include "comm/Loops.h" @@ -49,6 +50,7 @@ #include "md5.h" #include "MemBuf.h" #include "refresh.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "store_key_md5.h" @@ -1307,7 +1309,7 @@ static void htcpForwardClr(char *buf, int sz) { - peer *p; + CachePeer *p; for (p = Config.peers; p; p = p->next) { if (!p->options.htcp) { @@ -1550,7 +1552,7 @@ } int -htcpQuery(StoreEntry * e, HttpRequest * req, peer * p) +htcpQuery(StoreEntry * e, HttpRequest * req, CachePeer * p) { cache_key *save_key; static char pkt[8192]; @@ -1603,10 +1605,10 @@ } /* - * Send an HTCP CLR message for a specified item to a given peer. + * Send an HTCP CLR message for a specified item to a given CachePeer. */ void -htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, peer * p, htcp_clr_reason reason) +htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, CachePeer * p, htcp_clr_reason reason) { static char pkt[8192]; ssize_t pktlen; === modified file 'src/htcp.h' --- src/htcp.h 2012-08-14 11:53:07 +0000 +++ src/htcp.h 2012-09-04 14:38:44 +0000 @@ -79,10 +79,10 @@ * Don't wait for a reply or count in stats as sent. * \retval -1 Error sending request. */ -SQUIDCEXTERN int htcpQuery(StoreEntry * e, HttpRequest * req, peer * p); +SQUIDCEXTERN int htcpQuery(StoreEntry * e, HttpRequest * req, CachePeer * p); /// \ingroup ServerProtocolHTCP -SQUIDCEXTERN void htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, peer * p, htcp_clr_reason reason); +SQUIDCEXTERN void htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, CachePeer * p, htcp_clr_reason reason); /// \ingroup ServerProtocolHTCP SQUIDCEXTERN void htcpSocketShutdown(void); === modified file 'src/http.cc' --- src/http.cc 2012-09-03 07:16:45 +0000 +++ src/http.cc 2012-09-13 16:20:41 +0000 @@ -39,6 +39,7 @@ #include "base64.h" #include "base/AsyncJobCalls.h" #include "base/TextException.h" +#include "CachePeer.h" #include "client_side.h" #include "comm/Connection.h" #include "comm/Write.h" @@ -64,7 +65,9 @@ #include "peer_proxy_negotiate_auth.h" #include "profiler/Profiler.h" #include "refresh.h" +#include "RefreshPattern.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" @@ -117,7 +120,7 @@ _peer = cbdataReference(fwd->serverConnection()->getPeer()); /* might be NULL */ if (_peer) { - request->flags.proxying = 1; + request->flags.setProxying(); /* * This NEIGHBOR_PROXY_ONLY check probably shouldn't be here. * We might end up getting the object from somewhere else if, @@ -294,7 +297,7 @@ void HttpStateData::processSurrogateControl(HttpReply *reply) { - if (request->flags.accelerated && reply->surrogate_control) { + if (request->flags.accelerated() && reply->surrogate_control) { HttpHdrScTarget *sctusable = reply->surrogate_control->getMergedTarget(Config.Accel.surrogate_id); if (sctusable) { @@ -335,7 +338,7 @@ const char *v; #if USE_HTTP_VIOLATIONS - const refresh_t *R = NULL; + const RefreshPattern *R = NULL; /* This strange looking define first looks up the refresh pattern * and then checks if the specified flag is set. The main purpose @@ -376,7 +379,7 @@ } } - if (request->flags.auth || request->flags.auth_sent) { + if (request->flags.hasAuth() || request->flags.authSent()) { /* * Responses to requests with authorization may be cached * only if a Cache-Control: public reply header is present. @@ -713,7 +716,7 @@ } if (!peerSupportsConnectionPinning()) - request->flags.connection_auth_disabled = 1; + request->flags.disableConnectionAuth(); HttpReply *vrep = setVirginReply(newrep); flags.headers_parsed = 1; @@ -834,7 +837,7 @@ return true; /*if the connections it is already pinned it is OK*/ - if (request->flags.pinned) + if (request->flags.pinned()) return true; /*Allow pinned connections only if the Proxy-support header exists in @@ -1234,7 +1237,7 @@ debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: Headers did not parse at all for " << entry->url() << " AKA " << request->GetHost() << request->urlpath.termedBuf() ); } else { error = ERR_ZERO_SIZE_OBJECT; - debugs(11, (request->flags.accelerated?DBG_IMPORTANT:2), "WARNING: HTTP: Invalid Response: No object data received for " << + debugs(11, (request->flags.accelerated()?DBG_IMPORTANT:2), "WARNING: HTTP: Invalid Response: No object data received for " << entry->url() << " AKA " << request->GetHost() << request->urlpath.termedBuf() ); } } @@ -1383,18 +1386,18 @@ closeHandler = NULL; fwd->unregister(serverConnection); - if (request->flags.spoof_client_ip) + if (request->flags.spoofClientIp()) client_addr = request->client_addr; - if (request->flags.pinned) { + if (request->flags.pinned()) { ispinned = true; - } else if (request->flags.connection_auth && request->flags.auth_sent) { + } else if (request->flags.connectionAuthWanted() && request->flags.authSent()) { ispinned = true; } if (request->pinnedConnection() && ispinned) { request->pinnedConnection()->pinConnection(serverConnection, request, _peer, - (request->flags.connection_auth != 0)); + request->flags.connectionAuthWanted()); } else { fwd->pconnPush(serverConnection, request->peer_host ? request->peer_host : request->GetHost()); } @@ -1527,7 +1530,7 @@ http_hdr_type header = flags.originpeer ? HDR_AUTHORIZATION : HDR_PROXY_AUTHORIZATION; /* Nothing to do unless we are forwarding to a peer */ - if (!request->flags.proxying) + if (!request->flags.proxying()) return; /* Needs to be explicitly enabled */ @@ -1645,11 +1648,11 @@ */ if (!we_do_ranges && request->multipartRangeRequest()) { /* don't cache the result */ - request->flags.cachable = 0; + request->flags.setNotCachable(); /* pretend it's not a range request */ delete request->range; request->range = NULL; - request->flags.range = 0; + request->flags.clearRanged(); } /* append Via */ @@ -1664,7 +1667,7 @@ strVia.clean(); } - if (request->flags.accelerated) { + if (request->flags.accelerated()) { /* Append Surrogate-Capabilities */ String strSurrogate(hdr_in->getList(HDR_SURROGATE_CAPABILITY)); #if USE_SQUID_ESI @@ -1733,7 +1736,7 @@ /* append Authorization if known in URL, not in header and going direct */ if (!hdr_out->has(HDR_AUTHORIZATION)) { - if (!request->flags.proxying && request->login && *request->login) { + if (!request->flags.proxying() && request->login && *request->login) { httpHeaderPutStrf(hdr_out, HDR_AUTHORIZATION, "Basic %s", old_base64_encode(request->login)); } @@ -1867,7 +1870,7 @@ */ if (request->peer_domain) hdr_out->putStr(HDR_HOST, request->peer_domain); - else if (request->flags.redirected && !Config.onoff.redir_rewrites_host) + else if (request->flags.isRedirected() && !Config.onoff.redir_rewrites_host) hdr_out->addEntry(e->clone()); else { /* use port# only if not default */ @@ -1984,13 +1987,13 @@ int64_t roffLimit = request->getRangeOffsetLimit(); - if (NULL == request->range || !request->flags.cachable - || request->range->offsetLimitExceeded(roffLimit) || request->flags.connection_auth) + if (NULL == request->range || !request->flags.isCachable() + || request->range->offsetLimitExceeded(roffLimit) || request->flags.connectionAuthWanted()) result = false; debugs(11, 8, "decideIfWeDoRanges: range specs: " << request->range << ", cachable: " << - request->flags.cachable << "; we_do_ranges: " << result); + request->flags.isCachable() << "; we_do_ranges: " << result); return result; } @@ -2018,10 +2021,10 @@ Packer p; httpBuildRequestHeader(request, entry, fwd->al, &hdr, flags); - if (request->flags.pinned && request->flags.connection_auth) - request->flags.auth_sent = 1; + if (request->flags.pinned() && request->flags.connectionAuthWanted()) + request->flags.markAuthSent(); else if (hdr.has(HDR_AUTHORIZATION)) - request->flags.auth_sent = 1; + request->flags.markAuthSent(); packerToMemInit(&p, mb); hdr.packInto(&p); @@ -2088,7 +2091,7 @@ /* * Is keep-alive okay for all request methods? */ - if (request->flags.must_keepalive) + if (request->flags.mustKeepalive()) flags.keepalive = 1; else if (!Config.onoff.server_pconns) flags.keepalive = 0; === modified file 'src/http.h' --- src/http.h 2012-09-01 14:38:36 +0000 +++ src/http.h 2012-09-04 14:38:44 +0000 @@ -61,7 +61,7 @@ virtual void maybeReadVirginBody(); // read response data from the network int cacheableReply(); - peer *_peer; /* peer request made to */ + CachePeer *_peer; /* CachePeer request made to */ int eof; /* reached end-of-object? */ int lastChunk; /* reached last chunk of a chunk-encoded reply */ http_state_flags flags; === modified file 'src/icmp/IcmpSquid.cc' --- src/icmp/IcmpSquid.cc 2012-09-01 14:38:36 +0000 +++ src/icmp/IcmpSquid.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "icmp/IcmpSquid.h" #include "icmp/net_db.h" #include "ip/tools.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" === modified file 'src/icmp/net_db.cc' --- src/icmp/net_db.cc 2012-08-31 16:57:39 +0000 +++ src/icmp/net_db.cc 2012-09-13 11:40:32 +0000 @@ -39,6 +39,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "cbdata.h" #include "disk.h" #include "event.h" @@ -81,7 +82,7 @@ } netdb_conn_state_t; typedef struct { - peer *p; + CachePeer *p; StoreEntry *e; store_client *sc; HttpRequest *r; @@ -105,7 +106,7 @@ static void netdbPurgeLRU(void); static netdbEntry *netdbLookupHost(const char *key); static net_db_peer *netdbPeerByName(const netdbEntry * n, const char *); -static net_db_peer *netdbPeerAdd(netdbEntry * n, peer * e); +static net_db_peer *netdbPeerAdd(netdbEntry * n, CachePeer * e); static const char *netdbPeerName(const char *name); static IPH netdbSendPing; static QS sortPeerByRtt; @@ -116,7 +117,7 @@ static STCB netdbExchangeHandleReply; static void netdbExchangeDone(void *); -/* We have to keep a local list of peer names. The Peers structure +/* We have to keep a local list of CachePeer names. The Peers structure * gets freed during a reconfigure. We want this database to * remain persisitent, so _net_db_peer->peername points into this * linked list */ @@ -421,7 +422,7 @@ } static net_db_peer * -netdbPeerAdd(netdbEntry * n, peer * e) +netdbPeerAdd(netdbEntry * n, CachePeer * e) { net_db_peer *p; net_db_peer *o; @@ -1123,7 +1124,7 @@ } void -netdbUpdatePeer(HttpRequest * r, peer * e, int irtt, int ihops) +netdbUpdatePeer(HttpRequest * r, CachePeer * e, int irtt, int ihops) { #if USE_ICMP netdbEntry *n; @@ -1159,7 +1160,7 @@ } void -netdbExchangeUpdatePeer(Ip::Address &addr, peer * e, double rtt, double hops) +netdbExchangeUpdatePeer(Ip::Address &addr, CachePeer * e, double rtt, double hops) { #if USE_ICMP netdbEntry *n; @@ -1313,7 +1314,7 @@ netdbExchangeStart(void *data) { #if USE_ICMP - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; char *uri; netdbExchangeState *ex; StoreIOBuffer tempBuffer; @@ -1334,7 +1335,7 @@ assert(NULL != ex->r); ex->r->http_ver = HttpVersion(1,1); ex->connstate = STATE_HEADER; - ex->e = storeCreateEntry(uri, uri, request_flags(), METHOD_GET); + ex->e = storeCreateEntry(uri, uri, RequestFlags(), METHOD_GET); ex->buf_sz = NETDB_REQBUF_SZ; assert(NULL != ex->e); ex->sc = storeClientListAdd(ex->e, ex); @@ -1343,7 +1344,7 @@ tempBuffer.data = ex->buf; storeClientCopy(ex->sc, ex->e, tempBuffer, netdbExchangeHandleReply, ex); - ex->r->flags.loopdetect = 1; /* cheat! -- force direct */ + ex->r->flags.setLoopDetect(); /* cheat! -- force direct */ if (p->login) xstrncpy(ex->r->login, p->login, MAX_LOGIN_SZ); @@ -1355,11 +1356,11 @@ #endif } -peer * +CachePeer * netdbClosestParent(HttpRequest * request) { #if USE_ICMP - peer *p = NULL; + CachePeer *p = NULL; netdbEntry *n; const ipcache_addrs *ia; net_db_peer *h; === modified file 'src/icmp/net_db.h' --- src/icmp/net_db.h 2012-08-28 13:00:30 +0000 +++ src/icmp/net_db.h 2012-09-04 14:38:44 +0000 @@ -9,7 +9,7 @@ class StoreEntry; class HttpRequest; -/* for struct peer */ +/* for CachePeer */ #include "structs.h" SQUIDCEXTERN void netdbInit(void); @@ -21,14 +21,14 @@ SQUIDCEXTERN void netdbFreeMemory(void); SQUIDCEXTERN int netdbHostHops(const char *host); SQUIDCEXTERN int netdbHostRtt(const char *host); -SQUIDCEXTERN void netdbUpdatePeer(HttpRequest *, peer * e, int rtt, int hops); +SQUIDCEXTERN void netdbUpdatePeer(HttpRequest *, CachePeer * e, int rtt, int hops); SQUIDCEXTERN void netdbDeleteAddrNetwork(Ip::Address &addr); SQUIDCEXTERN void netdbBinaryExchange(StoreEntry *); SQUIDCEXTERN void netdbExchangeStart(void *); -SQUIDCEXTERN void netdbExchangeUpdatePeer(Ip::Address &, peer *, double, double); -SQUIDCEXTERN peer *netdbClosestParent(HttpRequest *); +SQUIDCEXTERN void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double); +SQUIDCEXTERN CachePeer *netdbClosestParent(HttpRequest *); SQUIDCEXTERN void netdbHostData(const char *host, int *samp, int *rtt, int *hops); #endif /* ICMP_NET_DB_H */ === modified file 'src/icp_v2.cc' --- src/icp_v2.cc 2012-08-31 16:57:39 +0000 +++ src/icp_v2.cc 2012-09-04 09:10:20 +0000 @@ -56,6 +56,7 @@ #include "neighbors.h" #include "refresh.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/internal.cc' --- src/internal.cc 2012-09-01 14:38:36 +0000 +++ src/internal.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "HttpRequest.h" #include "HttpReply.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "tools.h" #include "URL.h" === modified file 'src/ipc.cc' --- src/ipc.cc 2012-08-31 16:57:39 +0000 +++ src/ipc.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "fde.h" #include "globals.h" #include "ip/Address.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "tools.h" #include "rfc1738.h" === modified file 'src/ipc/Kids.cc' --- src/ipc/Kids.cc 2012-08-31 16:57:39 +0000 +++ src/ipc/Kids.cc 2012-09-04 09:10:20 +0000 @@ -7,6 +7,7 @@ #include "globals.h" #include "ipc/Kids.h" #include "tools.h" +#include "SquidConfig.h" #include "structs.h" Kids TheKids; === modified file 'src/ipc_win32.cc' --- src/ipc_win32.cc 2012-09-01 14:38:36 +0000 +++ src/ipc_win32.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "fde.h" #include "ip/Address.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" #include "tools.h" === modified file 'src/ipcache.cc' --- src/ipcache.cc 2012-08-31 16:57:39 +0000 +++ src/ipcache.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "Mem.h" #include "mgr/Registration.h" #include "rfc3596.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "StatCounters.h" === added file 'src/log/CustomLog.cc' --- src/log/CustomLog.cc 1970-01-01 00:00:00 +0000 +++ src/log/CustomLog.cc 2012-09-06 12:47:15 +0000 @@ -0,0 +1,31 @@ +/* + * 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. + * + */ +#include "squid.h" +#include "CustomLog.h" + === added file 'src/log/CustomLog.h' --- src/log/CustomLog.h 1970-01-01 00:00:00 +0000 +++ src/log/CustomLog.h 2012-09-06 13:29:14 +0000 @@ -0,0 +1,48 @@ +#ifndef SQUID_CUSTOMLOG_H_ +#define SQUID_CUSTOMLOG_H_ +/* + * 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. + * + */ +#include "format/Format.h" +#include "log/Formats.h" + +class ACLList; +class Logfile; + +class CustomLog { +public: + char *filename; + ACLList *aclList; + Format::Format *logFormat; + Logfile *logfile; + CustomLog *next; + Log::Format::log_type type; +}; + + +#endif /* SQUID_CUSTOMLOG_H_ */ === modified file 'src/log/FormatHttpdCombined.cc' --- src/log/FormatHttpdCombined.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatHttpdCombined.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatHttpdCommon.cc' --- src/log/FormatHttpdCommon.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatHttpdCommon.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatSquidCustom.cc' --- src/log/FormatSquidCustom.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidCustom.cc 2012-09-06 13:29:14 +0000 @@ -32,12 +32,13 @@ #include "squid.h" #include "AccessLogEntry.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" #include "MemBuf.h" void -Log::Format::SquidCustom(const AccessLogEntry::Pointer &al, customlog * log) +Log::Format::SquidCustom(const AccessLogEntry::Pointer &al, CustomLog * log) { static MemBuf mb; mb.reset(); === modified file 'src/log/FormatSquidIcap.cc' --- src/log/FormatSquidIcap.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidIcap.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatSquidNative.cc' --- src/log/FormatSquidNative.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidNative.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/Formats.h' --- src/log/Formats.h 2012-07-17 14:11:24 +0000 +++ src/log/Formats.h 2012-09-06 13:29:14 +0000 @@ -5,6 +5,7 @@ typedef RefCount AccessLogEntryPointer; class AccessLogEntry; +class CustomLog; class Logfile; namespace Log @@ -40,7 +41,7 @@ void SquidReferer(const AccessLogEntryPointer &al, Logfile * logfile); /// Log with a local custom format -void SquidCustom(const AccessLogEntryPointer &al, customlog * log); +void SquidCustom(const AccessLogEntryPointer &al, CustomLog * log); /// Log with Apache httpd common format void HttpdCommon(const AccessLogEntryPointer &al, Logfile * logfile); === modified file 'src/log/Makefile.am' --- src/log/Makefile.am 2012-08-29 07:29:35 +0000 +++ src/log/Makefile.am 2012-09-06 12:47:15 +0000 @@ -27,5 +27,7 @@ ModTcp.cc \ ModTcp.h \ ModUdp.cc \ - ModUdp.h + ModUdp.h \ + CustomLog.h \ + CustomLog.cc === modified file 'src/log/ModDaemon.cc' --- src/log/ModDaemon.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModDaemon.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "log/File.h" #include "log/ModDaemon.h" #include "SquidIpc.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H === modified file 'src/log/ModStdio.cc' --- src/log/ModStdio.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModStdio.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/ModStdio.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/ModTcp.cc' --- src/log/ModTcp.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModTcp.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "log/ModTcp.h" #include "Parsing.h" #include "structs.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/ModUdp.cc' --- src/log/ModUdp.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModUdp.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "log/ModUdp.h" #include "Parsing.h" #include "structs.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/access_log.cc' --- src/log/access_log.cc 2012-09-01 14:38:36 +0000 +++ src/log/access_log.cc 2012-09-06 13:29:14 +0000 @@ -32,10 +32,10 @@ #include "squid.h" #include "AccessLogEntry.h" -#include "Store.h" -#include "errorpage.h" +#include "acl/Checklist.h" +#include "CachePeer.h" #include "err_detail_type.h" -#include "acl/Checklist.h" +#include "errorpage.h" #include "errorpage.h" #include "format/Token.h" #include "globals.h" @@ -44,12 +44,15 @@ #include "HttpRequest.h" #include "log/access_log.h" #include "log/Config.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" +#include "Store.h" #if USE_SQUID_EUI #include "eui/Eui48.h" @@ -88,7 +91,7 @@ int LogfileStatus = LOG_DISABLE; void -accessLogLogTo(customlog* log, AccessLogEntry::Pointer &al, ACLChecklist * checklist) +accessLogLogTo(CustomLog* log, AccessLogEntry::Pointer &al, ACLChecklist * checklist) { if (al->url == NULL) @@ -201,7 +204,7 @@ void accessLogRotate(void) { - customlog *log; + CustomLog *log; #if USE_FORW_VIA_DB fvdbClear(); @@ -223,7 +226,7 @@ void accessLogClose(void) { - customlog *log; + CustomLog *log; for (log = Config.Log.accesslogs; log; log = log->next) { if (log->logfile) { @@ -298,7 +301,7 @@ void accessLogInit(void) { - customlog *log; + CustomLog *log; accessLogRegisterWithCacheManager(); === modified file 'src/main.cc' --- src/main.cc 2012-09-01 10:40:00 +0000 +++ src/main.cc 2012-09-04 09:10:20 +0000 @@ -83,6 +83,7 @@ #include "send-announce.h" #include "store_log.h" #include "tools.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "stat.h" === modified file 'src/mem.cc' --- src/mem.cc 2012-09-01 14:38:36 +0000 +++ src/mem.cc 2012-09-06 14:48:49 +0000 @@ -31,13 +31,18 @@ */ #include "squid.h" +#include "acl/AclDenyInfoList.h" +#include "acl/AclNameList.h" +#include "CacheDigest.h" +#include "ClientInfo.h" #include "event.h" -#include "ClientInfo.h" +#include "md5.h" #include "Mem.h" -#include "md5.h" #include "MemBuf.h" #include "memMeter.h" #include "mgr/Registration.h" +#include "RegexList.h" +#include "SquidConfig.h" #include "SquidList.h" #include "SquidTime.h" #include "Store.h" @@ -448,9 +453,9 @@ memDataInit(MEM_16K_BUF, "16K Buffer", 16384, 10, false); memDataInit(MEM_32K_BUF, "32K Buffer", 32768, 10, false); memDataInit(MEM_64K_BUF, "64K Buffer", 65536, 10, false); - memDataInit(MEM_ACL_DENY_INFO_LIST, "acl_deny_info_list", - sizeof(acl_deny_info_list), 0); - memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(acl_name_list), 0); + memDataInit(MEM_ACL_DENY_INFO_LIST, "AclDenyInfoList", + sizeof(AclDenyInfoList), 0); + memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(AclNameList), 0); #if USE_CACHE_DIGESTS memDataInit(MEM_CACHE_DIGEST, "CacheDigest", sizeof(CacheDigest), 0); @@ -463,7 +468,7 @@ memDataInit(MEM_HTTP_HDR_CONTENT_RANGE, "HttpHdrContRange", sizeof(HttpHdrContRange), 0); memDataInit(MEM_NETDBENTRY, "netdbEntry", sizeof(netdbEntry), 0); memDataInit(MEM_NET_DB_NAME, "net_db_name", sizeof(net_db_name), 0); - memDataInit(MEM_RELIST, "relist", sizeof(relist), 0); + memDataInit(MEM_RELIST, "RegexList", sizeof(RegexList), 0); memDataInit(MEM_CLIENT_INFO, "ClientInfo", sizeof(ClientInfo), 0); memDataInit(MEM_MD5_DIGEST, "MD5 digest", SQUID_MD5_DIGEST_LENGTH, 0); MemPools[MEM_MD5_DIGEST]->setChunkSize(512 * 1024); === modified file 'src/mgr/ActionParams.h' --- src/mgr/ActionParams.h 2012-09-01 14:38:36 +0000 +++ src/mgr/ActionParams.h 2012-09-10 12:49:35 +0000 @@ -9,6 +9,7 @@ #include "HttpRequestMethod.h" #include "ipc/forward.h" #include "mgr/QueryParams.h" +#include "RequestFlags.h" namespace Mgr { @@ -26,7 +27,7 @@ /* details of the client HTTP request that caused the action */ String httpUri; ///< HTTP request URI _method_t httpMethod; ///< HTTP request method - request_flags httpFlags; ///< HTTP request flags + RequestFlags httpFlags; ///< HTTP request flags String httpOrigin; ///< HTTP Origin: header (if any) /* action parameters extracted from the client HTTP request */ === modified file 'src/mgr/BasicActions.cc' --- src/mgr/BasicActions.cc 2012-09-01 14:38:36 +0000 +++ src/mgr/BasicActions.cc 2012-09-04 09:10:20 +0000 @@ -12,6 +12,7 @@ #include "mgr/Registration.h" #include "protos.h" #include "Store.h" +#include "SquidConfig.h" Mgr::IndexAction::Pointer Mgr::IndexAction::Create(const Command::Pointer &cmd) === modified file 'src/mgr/IoAction.cc' --- src/mgr/IoAction.cc 2012-09-01 14:38:36 +0000 +++ src/mgr/IoAction.cc 2012-09-01 20:23:30 +0000 @@ -24,13 +24,13 @@ Mgr::IoActionData::operator += (const IoActionData& stats) { http_reads += stats.http_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < iostats::histSize; ++i) http_read_hist[i] += stats.http_read_hist[i]; ftp_reads += stats.ftp_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < iostats::histSize; ++i) ftp_read_hist[i] += stats.ftp_read_hist[i]; gopher_reads += stats.gopher_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < iostats::histSize; ++i) gopher_read_hist[i] += stats.gopher_read_hist[i]; return *this; === modified file 'src/mgr/IoAction.h' --- src/mgr/IoAction.h 2012-09-01 14:38:36 +0000 +++ src/mgr/IoAction.h 2012-09-01 20:23:30 +0000 @@ -7,7 +7,7 @@ #define SQUID_MGR_IO_ACTION_H #include "mgr/Action.h" -#include "structs.h" /* _iostats::histSize */ +#include "structs.h" /* iostats::histSize */ namespace Mgr { @@ -23,9 +23,9 @@ double http_reads; double ftp_reads; double gopher_reads; - double http_read_hist[_iostats::histSize]; - double ftp_read_hist[_iostats::histSize]; - double gopher_read_hist[_iostats::histSize]; + double http_read_hist[iostats::histSize]; + double ftp_read_hist[iostats::histSize]; + double gopher_read_hist[iostats::histSize]; }; /// implement aggregated 'io' action === modified file 'src/mime.cc' --- src/mime.cc 2012-09-01 14:38:36 +0000 +++ src/mime.cc 2012-09-13 16:20:41 +0000 @@ -43,6 +43,8 @@ #include "MemBuf.h" #include "mime.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreClient.h" @@ -430,7 +432,7 @@ int n; - request_flags flags; + RequestFlags flags; struct stat sb; @@ -453,7 +455,7 @@ return; } - flags.cachable = 1; + flags.setCachable(); StoreEntry *e = storeCreateEntry(url, url, flags, === modified file 'src/mime.h' --- src/mime.h 2012-08-29 12:56:25 +0000 +++ src/mime.h 2012-09-17 13:31:37 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 25 MIME Parsing and Internal Icons + * AUTHOR: Harvest Derived * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/multicast.cc' --- src/multicast.cc 2012-09-01 14:38:36 +0000 +++ src/multicast.cc 2012-09-17 13:31:37 +0000 @@ -1,4 +1,3 @@ - /* * DEBUG: section 07 Multicast * AUTHOR: Martin Hamilton === modified file 'src/multicast.h' --- src/multicast.h 2012-08-29 14:08:06 +0000 +++ src/multicast.h 2012-09-17 13:31:37 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 07 Multicast + * AUTHOR: Martin Hamilton * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/neighbors.cc' --- src/neighbors.cc 2012-09-03 07:16:45 +0000 +++ src/neighbors.cc 2012-09-13 16:20:41 +0000 @@ -34,6 +34,7 @@ #include "acl/FilledChecklist.h" #include "anyp/PortCfg.h" #include "CacheDigest.h" +#include "CachePeer.h" #include "comm/Connection.h" #include "comm/ConnOpener.h" #include "event.h" @@ -53,6 +54,8 @@ #include "neighbors.h" #include "PeerDigest.h" #include "PeerSelectState.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "stat.h" @@ -64,35 +67,35 @@ /* count mcast group peers every 15 minutes */ #define MCAST_COUNT_RATE 900 -bool peerAllowedToUse(const peer *, HttpRequest *); -static int peerWouldBePinged(const peer *, HttpRequest *); -static void neighborRemove(peer *); -static void neighborAlive(peer *, const MemObject *, const icp_common_t *); +bool peerAllowedToUse(const CachePeer *, HttpRequest *); +static int peerWouldBePinged(const CachePeer *, HttpRequest *); +static void neighborRemove(CachePeer *); +static void neighborAlive(CachePeer *, const MemObject *, const icp_common_t *); #if USE_HTCP -static void neighborAliveHtcp(peer *, const MemObject *, const htcpReplyData *); +static void neighborAliveHtcp(CachePeer *, const MemObject *, const htcpReplyData *); #endif -static void neighborCountIgnored(peer *); +static void neighborCountIgnored(CachePeer *); static void peerRefreshDNS(void *); static IPH peerDNSConfigure; -static bool peerProbeConnect(peer *); +static bool peerProbeConnect(CachePeer *); static CNCB peerProbeConnectDone; static void peerCountMcastPeersDone(void *data); static void peerCountMcastPeersStart(void *data); -static void peerCountMcastPeersSchedule(peer * p, time_t when); +static void peerCountMcastPeersSchedule(CachePeer * p, time_t when); static IRCB peerCountHandleIcpReply; static void neighborIgnoreNonPeer(const Ip::Address &, icp_opcode); static OBJH neighborDumpPeers; static OBJH neighborDumpNonPeers; -static void dump_peers(StoreEntry * sentry, peer * peers); +static void dump_peers(StoreEntry * sentry, CachePeer * peers); static unsigned short echo_port; static int NLateReplies = 0; -static peer *first_ping = NULL; +static CachePeer *first_ping = NULL; const char * -neighborTypeStr(const peer * p) +neighborTypeStr(const CachePeer * p) { if (p->type == PEER_NONE) return "Non-Peer"; @@ -106,12 +109,12 @@ return "Parent"; } -peer * +CachePeer * whichPeer(const Ip::Address &from) { int j; - peer *p = NULL; + CachePeer *p = NULL; debugs(15, 3, "whichPeer: from " << from); for (p = Config.peers; p; p = p->next) { @@ -126,10 +129,10 @@ } peer_t -neighborType(const peer * p, const HttpRequest * request) +neighborType(const CachePeer * p, const HttpRequest * request) { - const struct _domain_type *d = NULL; + const domain_type *d = NULL; for (d = p->typelist; d; d = d->next) { if (0 == matchDomainName(request->GetHost(), d->domain)) @@ -149,33 +152,33 @@ * \return Whether it is appropriate to fetch REQUEST from PEER. */ bool -peerAllowedToUse(const peer * p, HttpRequest * request) +peerAllowedToUse(const CachePeer * p, HttpRequest * request) { - const struct _domain_ping *d = NULL; + const domain_ping *d = NULL; assert(request != NULL); if (neighborType(p, request) == PEER_SIBLING) { #if PEER_MULTICAST_SIBLINGS if (p->type == PEER_MULTICAST && p->options.mcast_siblings && - (request->flags.nocache || request->flags.refresh || request->flags.loopdetect || request->flags.need_validation)) + (request->flags.noCache() || request->flags.refresh() || request->flags.loopDetect() || request->flags.validationNeeded())) debugs(15, 2, "peerAllowedToUse(" << p->name << ", " << request->GetHost() << ") : multicast-siblings optimization match"); #endif - if (request->flags.nocache) - return false; - - if (request->flags.refresh) - return false; - - if (request->flags.loopdetect) - return false; - - if (request->flags.need_validation) + if (request->flags.noCache()) + return false; + + if (request->flags.refresh()) + return false; + + if (request->flags.loopDetect()) + return false; + + if (request->flags.validationNeeded()) return false; } // CONNECT requests are proxy requests. Not to be forwarded to origin servers. - // Unless the destination port matches, in which case we MAY perform a 'DIRECT' to this peer. + // Unless the destination port matches, in which case we MAY perform a 'DIRECT' to this CachePeer. if (p->options.originserver && request->method == METHOD_CONNECT && request->port != p->in_addr.GetPort()) return false; @@ -205,9 +208,9 @@ return (checklist.fastCheck() == ACCESS_ALLOWED); } -/* Return TRUE if it is okay to send an ICP request to this peer. */ +/* Return TRUE if it is okay to send an ICP request to this CachePeer. */ static int -peerWouldBePinged(const peer * p, HttpRequest * request) +peerWouldBePinged(const CachePeer * p, HttpRequest * request) { if (p->icp.port == 0) return 0; @@ -227,7 +230,7 @@ /* the case below seems strange, but can happen if the * URL host is on the other side of a firewall */ if (p->type == PEER_SIBLING) - if (!request->flags.hierarchical) + if (!request->flags.hierarchical()) return 0; if (!peerAllowedToUse(p, request)) @@ -243,9 +246,9 @@ return 1; } -/* Return TRUE if it is okay to send an HTTP request to this peer. */ +/* Return TRUE if it is okay to send an HTTP request to this CachePeer. */ int -peerHTTPOkay(const peer * p, HttpRequest * request) +peerHTTPOkay(const CachePeer * p, HttpRequest * request) { if (p->max_conn) if (p->stats.conn_open >= p->max_conn) @@ -263,7 +266,7 @@ int neighborsCount(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; int count = 0; for (p = Config.peers; p; p = p->next) @@ -275,10 +278,10 @@ return count; } -peer * +CachePeer * getFirstUpParent(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (!neighborUp(p)) @@ -297,11 +300,11 @@ return p; } -peer * +CachePeer * getRoundRobinParent(HttpRequest * request) { - peer *p; - peer *q = NULL; + CachePeer *p; + CachePeer *q = NULL; for (p = Config.peers; p; p = p->next) { if (!p->options.roundrobin) @@ -336,11 +339,11 @@ return q; } -peer * +CachePeer * getWeightedRoundRobinParent(HttpRequest * request) { - peer *p; - peer *q = NULL; + CachePeer *p; + CachePeer *q = NULL; int weighted_rtt; for (p = Config.peers; p; p = p->next) { @@ -403,7 +406,7 @@ } /** - * This gets called on startup and restart to kick off the peer round-robin + * This gets called on startup and restart to kick off the CachePeer round-robin * maintenance event. It ensures that no matter how many times its called * no more than one event is scheduled. */ @@ -421,23 +424,23 @@ * Called whenever the round-robin counters need to be reset to a sane state. * So far those times are: * - On startup and reconfigure - to set the counters to sane initial settings. - * - When a peer has revived from dead, to prevent the revived peer being + * - When a CachePeer has revived from dead, to prevent the revived CachePeer being * flooded with requests which it has 'missed' during the down period. */ void peerClearRR() { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { p->rr_count = 0; } } /** - * Perform all actions when a peer is detected revived. + * Perform all actions when a CachePeer is detected revived. */ void -peerAlive(peer *p) +peerAlive(CachePeer *p) { if (p->stats.logged_state == PEER_DEAD && p->tcp_up) { debugs(15, DBG_IMPORTANT, "Detected REVIVED " << neighborTypeStr(p) << ": " << p->name); @@ -449,10 +452,10 @@ p->stats.probe_start = 0; } -peer * +CachePeer * getDefaultParent(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (neighborType(p, request) != PEER_PARENT) @@ -473,23 +476,23 @@ return NULL; } -peer * -getNextPeer(peer * p) +CachePeer * +getNextPeer(CachePeer * p) { return p->next; } -peer * +CachePeer * getFirstPeer(void) { return Config.peers; } static void -neighborRemove(peer * target) +neighborRemove(CachePeer * target) { - peer *p = NULL; - peer **P = NULL; + CachePeer *p = NULL; + CachePeer **P = NULL; p = Config.peers; P = &Config.peers; @@ -530,8 +533,8 @@ { struct servent *sep = NULL; const char *me = getMyHostname(); - peer *thisPeer = NULL; - peer *next = NULL; + CachePeer *thisPeer = NULL; + CachePeer *next = NULL; neighborsRegisterWithCacheManager(); @@ -577,7 +580,7 @@ { const char *url = entry->url(); MemObject *mem = entry->mem_obj; - peer *p = NULL; + CachePeer *p = NULL; int i; int reqnum = 0; int flags; @@ -608,7 +611,7 @@ debugs(15, 5, "neighborsUdpPing: Peer " << p->host); if (!peerWouldBePinged(p, request)) - continue; /* next peer */ + continue; /* next CachePeer */ ++peers_pinged; @@ -687,8 +690,8 @@ p->stats.last_query = squid_curtime; /* - * keep probe_start == 0 for a multicast peer, - * so neighborUp() never says this peer is dead. + * keep probe_start == 0 for a multicast CachePeer, + * so neighborUp() never says this CachePeer is dead. */ if ((p->type != PEER_MULTICAST) && (p->stats.probe_start == 0)) @@ -730,9 +733,9 @@ return peers_pinged; } -/* lookup the digest of a given peer */ +/* lookup the digest of a given CachePeer */ lookup_t -peerDigestLookup(peer * p, HttpRequest * request) +peerDigestLookup(CachePeer * p, HttpRequest * request) { #if USE_CACHE_DIGESTS const cache_key *key = request ? storeKeyPublicByRequest(request) : NULL; @@ -772,21 +775,21 @@ return LOOKUP_NONE; } -/* select best peer based on cache digests */ -peer * +/* select best CachePeer based on cache digests */ +CachePeer * neighborsDigestSelect(HttpRequest * request) { - peer *best_p = NULL; + CachePeer *best_p = NULL; #if USE_CACHE_DIGESTS int best_rtt = 0; int choice_count = 0; int ichoice_count = 0; - peer *p; + CachePeer *p; int p_rtt; int i; - if (!request->flags.hierarchical) + if (!request->flags.hierarchical()) return NULL; storeKeyPublicByRequest(request); @@ -814,7 +817,7 @@ debugs(15, 5, "neighborsDigestSelect: peer " << p->host << " rtt: " << p_rtt); - /* is this peer better than others in terms of rtt ? */ + /* is this CachePeer better than others in terms of rtt ? */ if (!best_p || (p_rtt && p_rtt < best_rtt)) { best_p = p; best_rtt = p_rtt; @@ -837,7 +840,7 @@ } void -peerNoteDigestLookup(HttpRequest * request, peer * p, lookup_t lookup) +peerNoteDigestLookup(HttpRequest * request, CachePeer * p, lookup_t lookup) { #if USE_CACHE_DIGESTS if (p) @@ -851,7 +854,7 @@ } static void -neighborAlive(peer * p, const MemObject * mem, const icp_common_t * header) +neighborAlive(CachePeer * p, const MemObject * mem, const icp_common_t * header) { peerAlive(p); ++ p->stats.pings_acked; @@ -863,7 +866,7 @@ } static void -neighborUpdateRtt(peer * p, MemObject * mem) +neighborUpdateRtt(CachePeer * p, MemObject * mem) { int rtt, rtt_av_factor; @@ -888,7 +891,7 @@ #if USE_HTCP static void -neighborAliveHtcp(peer * p, const MemObject * mem, const htcpReplyData * htcp) +neighborAliveHtcp(CachePeer * p, const MemObject * mem, const htcpReplyData * htcp) { peerAlive(p); ++ p->stats.pings_acked; @@ -899,7 +902,7 @@ #endif static void -neighborCountIgnored(peer * p) +neighborCountIgnored(CachePeer * p) { if (p == NULL) return; @@ -909,12 +912,12 @@ ++NLateReplies; } -static peer *non_peers = NULL; +static CachePeer *non_peers = NULL; static void neighborIgnoreNonPeer(const Ip::Address &from, icp_opcode opcode) { - peer *np; + CachePeer *np; for (np = non_peers; np; np = np->next) { if (np->in_addr != from) @@ -927,7 +930,7 @@ } if (np == NULL) { - np = (peer *)xcalloc(1, sizeof(peer)); + np = (CachePeer *)xcalloc(1, sizeof(CachePeer)); np->in_addr = from; np->icp.port = from.GetPort(); np->type = PEER_NONE; @@ -946,11 +949,11 @@ /* ignoreMulticastReply * * * We want to ignore replies from multicast peers if the - * * cache_host_domain rules would normally prevent the peer + * * cache_host_domain rules would normally prevent the CachePeer * * from being used */ static int -ignoreMulticastReply(peer * p, MemObject * mem) +ignoreMulticastReply(CachePeer * p, MemObject * mem) { if (p == NULL) return 0; @@ -974,7 +977,7 @@ void neighborsUdpAck(const cache_key * key, icp_common_t * header, const Ip::Address &from) { - peer *p = NULL; + CachePeer *p = NULL; StoreEntry *entry; MemObject *mem = NULL; peer_t ntype = PEER_NONE; @@ -1086,10 +1089,10 @@ } } -peer * +CachePeer * peerFindByName(const char *name) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (!strcasecmp(name, p->name)) @@ -1099,10 +1102,10 @@ return p; } -peer * +CachePeer * peerFindByNameAndPort(const char *name, unsigned short port) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (strcasecmp(name, p->name)) @@ -1118,17 +1121,17 @@ } int -neighborUp(const peer * p) +neighborUp(const CachePeer * p) { if (!p->tcp_up) { - if (!peerProbeConnect((peer *) p)) { + if (!peerProbeConnect((CachePeer *) p)) { debugs(15, 8, "neighborUp: DOWN (probed): " << p->host << " (" << p->in_addr << ")"); return 0; } } /* - * The peer can not be UP if we don't have any IP addresses + * The CachePeer can not be UP if we don't have any IP addresses * for it. */ if (0 == p->n_addresses) { @@ -1154,14 +1157,14 @@ void peerDestroy(void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; if (p == NULL) return; - struct _domain_ping *nl = NULL; + domain_ping *nl = NULL; - for (struct _domain_ping *l = p->peer_domain; l; l = nl) { + for (domain_ping *l = p->peer_domain; l; l = nl) { nl = l->next; safe_free(l->domain); xfree(l); @@ -1177,7 +1180,7 @@ } void -peerNoteDigestGone(peer * p) +peerNoteDigestGone(CachePeer * p) { #if USE_CACHE_DIGESTS cbdataReferenceDone(p->digest); @@ -1187,7 +1190,7 @@ static void peerDNSConfigure(const ipcache_addrs *ia, const DnsLookupDetails &, void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; int j; @@ -1236,7 +1239,7 @@ static void peerRefreshDNS(void *data) { - peer *p = NULL; + CachePeer *p = NULL; if (eventFind(peerRefreshDNS, NULL)) eventDelete(peerRefreshDNS, NULL); @@ -1255,7 +1258,7 @@ } static void -peerConnectFailedSilent(peer * p) +peerConnectFailedSilent(CachePeer * p) { p->stats.last_connect_failure = squid_curtime; @@ -1274,14 +1277,14 @@ } void -peerConnectFailed(peer *p) +peerConnectFailed(CachePeer *p) { debugs(15, DBG_IMPORTANT, "TCP connection to " << p->host << "/" << p->http_port << " failed"); peerConnectFailedSilent(p); } void -peerConnectSucceded(peer * p) +peerConnectSucceded(CachePeer * p) { if (!p->tcp_up) { debugs(15, 2, "TCP connection to " << p->host << "/" << p->http_port << " succeded"); @@ -1297,7 +1300,7 @@ * peerProbeConnect will be called on dead peers by neighborUp */ static bool -peerProbeConnect(peer * p) +peerProbeConnect(CachePeer * p) { time_t ctimeout = p->connect_timeout > 0 ? p->connect_timeout : Config.Timeout.peer_connect; bool ret = (squid_curtime - p->stats.last_connect_failure) > (ctimeout * 10); @@ -1308,7 +1311,7 @@ if (squid_curtime - p->stats.last_connect_probe == 0) return ret;/* don't probe to often */ - /* for each IP address of this peer. find one that we can connect to and probe it. */ + /* for each IP address of this CachePeer. find one that we can connect to and probe it. */ for (int i = 0; i < p->n_addresses; ++i) { Comm::ConnectionPointer conn = new Comm::Connection; conn->remote = p->addresses[i]; @@ -1331,7 +1334,7 @@ static void peerProbeConnectDone(const Comm::ConnectionPointer &conn, comm_err_t status, int xerrno, void *data) { - peer *p = (peer*)data; + CachePeer *p = (CachePeer*)data; if (status == COMM_OK) { peerConnectSucceded(p); @@ -1345,7 +1348,7 @@ } static void -peerCountMcastPeersSchedule(peer * p, time_t when) +peerCountMcastPeersSchedule(CachePeer * p, time_t when) { if (p->mcast.flags.count_event_pending) return; @@ -1361,7 +1364,7 @@ static void peerCountMcastPeersStart(void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; ps_state *psstate; StoreEntry *fake; MemObject *mem; @@ -1373,7 +1376,7 @@ snprintf(url, MAX_URL, "http://"); p->in_addr.ToURL(url+7, MAX_URL -8 ); strcat(url, "/"); - fake = storeCreateEntry(url, url, request_flags(), METHOD_GET); + fake = storeCreateEntry(url, url, RequestFlags(), METHOD_GET); HttpRequest *req = HttpRequest::CreateFromUrl(url); psstate = new ps_state; psstate->request = HTTPMSGLOCK(req); @@ -1407,7 +1410,7 @@ StoreEntry *fake = psstate->entry; if (cbdataReferenceValid(psstate->callback_data)) { - peer *p = (peer *)psstate->callback_data; + CachePeer *p = (CachePeer *)psstate->callback_data; p->mcast.flags.counting = 0; p->mcast.avg_n_members = Math::doubleAverage(p->mcast.avg_n_members, (double) psstate->ping.n_recv, ++p->mcast.n_times_counted, 10); debugs(15, DBG_IMPORTANT, "Group " << p->host << ": " << psstate->ping.n_recv << @@ -1426,7 +1429,7 @@ } static void -peerCountHandleIcpReply(peer * p, peer_t type, AnyP::ProtocolType proto, void *hdrnotused, void *data) +peerCountHandleIcpReply(CachePeer * p, peer_t type, AnyP::ProtocolType proto, void *hdrnotused, void *data) { int rtt_av_factor; @@ -1459,7 +1462,7 @@ } void -dump_peer_options(StoreEntry * sentry, peer * p) +dump_peer_options(StoreEntry * sentry, CachePeer * p) { if (p->options.proxy_only) storeAppendPrintf(sentry, " proxy-only"); @@ -1577,11 +1580,11 @@ } static void -dump_peers(StoreEntry * sentry, peer * peers) +dump_peers(StoreEntry * sentry, CachePeer * peers) { - peer *e = NULL; + CachePeer *e = NULL; char ntoabuf[MAX_IPSTRLEN]; - struct _domain_ping *d = NULL; + domain_ping *d = NULL; icp_opcode op; int i; @@ -1688,7 +1691,7 @@ { StoreEntry *e = Store::Root().get(key); MemObject *mem = NULL; - peer *p; + CachePeer *p; peer_t ntype = PEER_NONE; debugs(15, 6, "neighborsHtcpReply: " << (htcp->hit ? "HIT" : "MISS") << " " << @@ -1753,7 +1756,7 @@ void neighborsHtcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, htcp_clr_reason reason) { - peer *p; + CachePeer *p; char buf[128]; for (p = Config.peers; p; p = p->next) { === modified file 'src/neighbors.h' --- src/neighbors.h 2012-08-29 00:12:28 +0000 +++ src/neighbors.h 2012-09-04 14:38:44 +0000 @@ -34,54 +34,53 @@ #define SQUID_NEIGHBORS_H_ #include "enums.h" -#include "HttpRequestMethod.h" +#include "ICP.h" #include "lookup_t.h" -#include "ip/Address.h" -#include "typedefs.h" class HttpRequest; -class peer; +class HttpRequestMethod; +class CachePeer; class StoreEntry; -SQUIDCEXTERN peer *getFirstPeer(void); -SQUIDCEXTERN peer *getFirstUpParent(HttpRequest *); -SQUIDCEXTERN peer *getNextPeer(peer *); -SQUIDCEXTERN peer *getSingleParent(HttpRequest *); -SQUIDCEXTERN int neighborsCount(HttpRequest *); -SQUIDCEXTERN int neighborsUdpPing(HttpRequest *, +extern CachePeer *getFirstPeer(void); +extern CachePeer *getFirstUpParent(HttpRequest *); +extern CachePeer *getNextPeer(CachePeer *); +extern CachePeer *getSingleParent(HttpRequest *); +extern int neighborsCount(HttpRequest *); +extern int neighborsUdpPing(HttpRequest *, StoreEntry *, IRCB * callback, void *data, int *exprep, int *timeout); -SQUIDCEXTERN void neighborAddAcl(const char *, const char *); +extern void neighborAddAcl(const char *, const char *); -SQUIDCEXTERN void neighborsUdpAck(const cache_key *, icp_common_t *, const Ip::Address &); -SQUIDCEXTERN void neighborAdd(const char *, const char *, int, int, int, int, int); -SQUIDCEXTERN void neighbors_init(void); +extern void neighborsUdpAck(const cache_key *, icp_common_t *, const Ip::Address &); +extern void neighborAdd(const char *, const char *, int, int, int, int, int); +extern void neighbors_init(void); #if USE_HTCP -SQUIDCEXTERN void neighborsHtcpClear(StoreEntry *, const char *, HttpRequest *, const HttpRequestMethod &, htcp_clr_reason); +extern void neighborsHtcpClear(StoreEntry *, const char *, HttpRequest *, const HttpRequestMethod &, htcp_clr_reason); #endif -SQUIDCEXTERN peer *peerFindByName(const char *); -SQUIDCEXTERN peer *peerFindByNameAndPort(const char *, unsigned short); -SQUIDCEXTERN peer *getDefaultParent(HttpRequest * request); -SQUIDCEXTERN peer *getRoundRobinParent(HttpRequest * request); -SQUIDCEXTERN peer *getWeightedRoundRobinParent(HttpRequest * request); -SQUIDCEXTERN void peerClearRRStart(void); -SQUIDCEXTERN void peerClearRR(void); -SQUIDCEXTERN lookup_t peerDigestLookup(peer * p, HttpRequest * request); -SQUIDCEXTERN peer *neighborsDigestSelect(HttpRequest * request); -SQUIDCEXTERN void peerNoteDigestLookup(HttpRequest * request, peer * p, lookup_t lookup); -SQUIDCEXTERN void peerNoteDigestGone(peer * p); -SQUIDCEXTERN int neighborUp(const peer * e); -SQUIDCEXTERN CBDUNL peerDestroy; -SQUIDCEXTERN const char *neighborTypeStr(const peer * e); -SQUIDCEXTERN peer_t neighborType(const peer *, const HttpRequest *); -SQUIDCEXTERN void peerConnectFailed(peer *); -SQUIDCEXTERN void peerConnectSucceded(peer *); -SQUIDCEXTERN void dump_peer_options(StoreEntry *, peer *); -SQUIDCEXTERN int peerHTTPOkay(const peer *, HttpRequest *); +extern CachePeer *peerFindByName(const char *); +extern CachePeer *peerFindByNameAndPort(const char *, unsigned short); +extern CachePeer *getDefaultParent(HttpRequest * request); +extern CachePeer *getRoundRobinParent(HttpRequest * request); +extern CachePeer *getWeightedRoundRobinParent(HttpRequest * request); +extern void peerClearRRStart(void); +extern void peerClearRR(void); +extern lookup_t peerDigestLookup(CachePeer * p, HttpRequest * request); +extern CachePeer *neighborsDigestSelect(HttpRequest * request); +extern void peerNoteDigestLookup(HttpRequest * request, CachePeer * p, lookup_t lookup); +extern void peerNoteDigestGone(CachePeer * p); +extern int neighborUp(const CachePeer * e); +extern CBDUNL peerDestroy; +extern const char *neighborTypeStr(const CachePeer * e); +extern peer_t neighborType(const CachePeer *, const HttpRequest *); +extern void peerConnectFailed(CachePeer *); +extern void peerConnectSucceded(CachePeer *); +extern void dump_peer_options(StoreEntry *, CachePeer *); +extern int peerHTTPOkay(const CachePeer *, HttpRequest *); -SQUIDCEXTERN peer *whichPeer(const Ip::Address &from); +extern CachePeer *whichPeer(const Ip::Address &from); #endif /* SQUID_NEIGHBORS_H_ */ === modified file 'src/pconn.cc' --- src/pconn.cc 2012-09-01 14:38:36 +0000 +++ src/pconn.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "globals.h" #include "mgr/Registration.h" #include "pconn.h" +#include "SquidConfig.h" #include "Store.h" #define PCONN_FDS_SZ 8 /* pconn set size, increase for better memcache hit rate */ === modified file 'src/peer_digest.cc' --- src/peer_digest.cc 2012-09-01 14:38:36 +0000 +++ src/peer_digest.cc 2012-09-13 16:20:41 +0000 @@ -34,6 +34,7 @@ #include "squid.h" #if USE_CACHE_DIGESTS #include "CacheDigest.h" +#include "CachePeer.h" #include "event.h" #include "forward.h" #include "globals.h" @@ -90,7 +91,7 @@ /* initialize peer digest */ static void -peerDigestInit(PeerDigest * pd, peer * p) +peerDigestInit(PeerDigest * pd, CachePeer * p) { assert(pd && p); @@ -137,7 +138,7 @@ /* allocate new peer digest, call Init, and lock everything */ PeerDigest * -peerDigestCreate(peer * p) +peerDigestCreate(CachePeer * p) { PeerDigest *pd; assert(p); @@ -164,7 +165,7 @@ * tell it that the digest is gone. */ if (cbdataReferenceValidDone(peerTmp, &p)) - peerNoteDigestGone((peer *)p); + peerNoteDigestGone((CachePeer *)p); peerDigestClean(pd); @@ -312,7 +313,7 @@ static void peerDigestRequest(PeerDigest * pd) { - peer *p = pd->peer; + CachePeer *p = pd->peer; StoreEntry *e, *old_e; char *url; const cache_key *key; @@ -369,10 +370,10 @@ pd_last_req_time = squid_curtime; - req->flags.cachable = 1; + req->flags.setCachable(); /* the rest is based on clientProcessExpired() */ - req->flags.refresh = 1; + req->flags.setRefresh(); old_e = fetch->old_entry = Store::Root().get(key); === modified file 'src/peer_select.cc' --- src/peer_select.cc 2012-09-01 14:38:36 +0000 +++ src/peer_select.cc 2012-09-13 16:20:41 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "acl/FilledChecklist.h" +#include "CachePeer.h" #include "carp.h" #include "client_side.h" #include "DnsLookupDetails.h" @@ -50,6 +51,7 @@ #include "peer_sourcehash.h" #include "peer_userhash.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" @@ -68,10 +70,10 @@ static void peerPingTimeout(void *data); static IRCB peerHandlePingReply; static void peerSelectStateFree(ps_state * psstate); -static void peerIcpParentMiss(peer *, icp_common_t *, ps_state *); +static void peerIcpParentMiss(CachePeer *, icp_common_t *, ps_state *); #if USE_HTCP -static void peerHtcpParentMiss(peer *, htcpReplyData *, ps_state *); -static void peerHandleHtcpReply(peer *, peer_t, htcpReplyData *, void *); +static void peerHtcpParentMiss(CachePeer *, htcpReplyData *, ps_state *); +static void peerHandleHtcpReply(CachePeer *, peer_t, htcpReplyData *, void *); #endif static int peerCheckNetdbDirect(ps_state * psstate); static void peerGetSomeNeighbor(ps_state *); @@ -79,7 +81,7 @@ static void peerGetSomeDirect(ps_state *); static void peerGetSomeParent(ps_state *); static void peerGetAllParents(ps_state *); -static void peerAddFwdServer(FwdServer **, peer *, hier_code); +static void peerAddFwdServer(FwdServer **, CachePeer *, hier_code); static void peerSelectPinned(ps_state * ps); static void peerSelectDnsResults(const ipcache_addrs *ia, const DnsLookupDetails &details, void *data); @@ -124,7 +126,7 @@ assert(direct != DIRECT_YES); debugs(44, 3, "peerSelectIcpPing: " << entry->url() ); - if (!request->flags.hierarchical && direct != DIRECT_NO) + if (!request->flags.hierarchical() && direct != DIRECT_NO) return 0; if (EBIT_TEST(entry->flags, KEY_PRIVATE) && !neighbors_do_private_keys) @@ -231,9 +233,9 @@ // To resolve this we must use only the original client destination when going DIRECT // on intercepted traffic which failed Host verification const HttpRequest *req = psstate->request; - const bool isIntercepted = !req->flags.redirected && - (req->flags.intercepted || req->flags.spoof_client_ip); - const bool useOriginalDst = Config.onoff.client_dst_passthru || !req->flags.hostVerified; + const bool isIntercepted = !req->flags.isRedirected() && + (req->flags.intercepted() || req->flags.spoofClientIp()); + const bool useOriginalDst = Config.onoff.client_dst_passthru || !req->flags.hostVerified(); const bool choseDirect = fs && fs->code == HIER_DIRECT; if (isIntercepted && useOriginalDst && choseDirect) { // construct a "result" adding the ORIGINAL_DST to the set instead of DIRECT @@ -337,7 +339,7 @@ break; // for TPROXY we must skip unusable addresses. - if (psstate->request->flags.spoof_client_ip && !(fs->_peer && fs->_peer->options.no_tproxy) ) { + if (psstate->request->flags.spoofClientIp() && !(fs->_peer && fs->_peer->options.no_tproxy) ) { if (ia->in_addrs[n].IsIPv4() != psstate->request->client_addr.IsIPv4()) { // we CAN'T spoof the address on this link. find another. continue; @@ -380,7 +382,7 @@ peerCheckNetdbDirect(ps_state * psstate) { #if USE_ICMP - peer *p; + CachePeer *p; int myrtt; int myhops; @@ -427,26 +429,26 @@ HttpRequest *request = ps->request; debugs(44, 3, "peerSelectFoo: '" << RequestMethodStr(request->method) << " " << request->GetHost() << "'"); - /** If we don't know whether DIRECT is permitted ... */ + /* If we don't know whether DIRECT is permitted ... */ if (ps->direct == DIRECT_UNKNOWN) { if (ps->always_direct == ACCESS_DUNNO) { debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (always_direct to be checked)"); - /** check always_direct; */ + /* check always_direct; */ ps->acl_checklist = new ACLFilledChecklist(Config.accessList.AlwaysDirect, request, NULL); ps->acl_checklist->nonBlockingCheck(peerCheckAlwaysDirectDone, ps); return; } else if (ps->never_direct == ACCESS_DUNNO) { debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (never_direct to be checked)"); - /** check never_direct; */ + /* check never_direct; */ ps->acl_checklist = new ACLFilledChecklist(Config.accessList.NeverDirect, request, NULL); ps->acl_checklist->nonBlockingCheck(peerCheckNeverDirectDone, ps); return; - } else if (request->flags.no_direct) { - /** if we are accelerating, direct is not an option. */ + } else if (request->flags.noDirect()) { + /* if we are accelerating, direct is not an option. */ ps->direct = DIRECT_NO; debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (forced non-direct)"); - } else if (request->flags.loopdetect) { - /** if we are in a forwarding-loop, direct is not an option. */ + } else if (request->flags.loopDetect()) { + /* if we are in a forwarding-loop, direct is not an option. */ ps->direct = DIRECT_YES; debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (forwarding loop detected)"); } else if (peerCheckNetdbDirect(ps)) { @@ -490,7 +492,7 @@ if (Config.onoff.prefer_direct) peerGetSomeDirect(ps); - if (request->flags.hierarchical || !Config.onoff.nonhierarchical_direct) { + if (request->flags.hierarchical() || !Config.onoff.nonhierarchical_direct) { peerGetSomeParent(ps); peerGetAllParents(ps); } @@ -505,7 +507,7 @@ peerSelectDnsPaths(ps); } -bool peerAllowedToUse(const peer * p, HttpRequest * request); +bool peerAllowedToUse(const CachePeer * p, HttpRequest * request); /** * peerSelectPinned @@ -518,7 +520,7 @@ HttpRequest *request = ps->request; if (!request->pinnedConnection()) return; - peer *pear = request->pinnedConnection()->pinnedPeer(); + CachePeer *pear = request->pinnedConnection()->pinnedPeer(); if (Comm::IsConnOpen(request->pinnedConnection()->validatePinnedConnection(request, pear))) { if (pear && peerAllowedToUse(pear, request)) { peerAddFwdServer(&ps->servers, pear, PINNED); @@ -547,7 +549,7 @@ { StoreEntry *entry = ps->entry; HttpRequest *request = ps->request; - peer *p; + CachePeer *p; hier_code code = HIER_NONE; assert(entry->ping_status == PING_NONE); @@ -611,7 +613,7 @@ peerGetSomeNeighborReplies(ps_state * ps) { HttpRequest *request = ps->request; - peer *p = NULL; + CachePeer *p = NULL; hier_code code = HIER_NONE; assert(ps->entry->ping_status == PING_WAITING); assert(ps->direct != DIRECT_YES); @@ -662,7 +664,7 @@ static void peerGetSomeParent(ps_state * ps) { - peer *p; + CachePeer *p; HttpRequest *request = ps->request; hier_code code = HIER_NONE; debugs(44, 3, "peerGetSomeParent: " << RequestMethodStr(request->method) << " " << request->GetHost()); @@ -699,7 +701,7 @@ static void peerGetAllParents(ps_state * ps) { - peer *p; + CachePeer *p; HttpRequest *request = ps->request; /* Add all alive parents */ @@ -759,7 +761,7 @@ } static void -peerIcpParentMiss(peer * p, icp_common_t * header, ps_state * ps) +peerIcpParentMiss(CachePeer * p, icp_common_t * header, ps_state * ps) { int rtt; @@ -800,7 +802,7 @@ } static void -peerHandleIcpReply(peer * p, peer_t type, icp_common_t * header, void *data) +peerHandleIcpReply(CachePeer * p, peer_t type, icp_common_t * header, void *data) { ps_state *psstate = (ps_state *)data; icp_opcode op = header->getOpCode(); @@ -834,7 +836,7 @@ #if USE_HTCP static void -peerHandleHtcpReply(peer * p, peer_t type, htcpReplyData * htcp, void *data) +peerHandleHtcpReply(CachePeer * p, peer_t type, htcpReplyData * htcp, void *data) { ps_state *psstate = (ps_state *)data; debugs(44, 3, "peerHandleHtcpReply: " << @@ -859,7 +861,7 @@ } static void -peerHtcpParentMiss(peer * p, htcpReplyData * htcp, ps_state * ps) +peerHtcpParentMiss(CachePeer * p, htcpReplyData * htcp, ps_state * ps) { int rtt; @@ -900,7 +902,7 @@ #endif static void -peerHandlePingReply(peer * p, peer_t type, AnyP::ProtocolType proto, void *pingdata, void *data) +peerHandlePingReply(CachePeer * p, peer_t type, AnyP::ProtocolType proto, void *pingdata, void *data) { if (proto == AnyP::PROTO_ICP) peerHandleIcpReply(p, type, (icp_common_t *)pingdata, data); @@ -917,7 +919,7 @@ } static void -peerAddFwdServer(FwdServer ** FSVR, peer * p, hier_code code) +peerAddFwdServer(FwdServer ** FSVR, CachePeer * p, hier_code code) { FwdServer *fs = (FwdServer *)memAllocate(MEM_FWD_SERVER); debugs(44, 5, "peerAddFwdServer: adding " << === modified file 'src/peer_sourcehash.cc' --- src/peer_sourcehash.cc 2012-09-01 14:38:36 +0000 +++ src/peer_sourcehash.cc 2012-09-04 15:15:51 +0000 @@ -33,9 +33,11 @@ */ #include "squid.h" +#include "CachePeer.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #if HAVE_MATH_H @@ -45,15 +47,15 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_sourcehash_peers = 0; -static peer **sourcehash_peers = NULL; +static CachePeer **sourcehash_peers = NULL; static OBJH peerSourceHashCachemgr; static void peerSourceHashRegisterWithCacheManager(void); static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -64,8 +66,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -96,7 +98,7 @@ if (n_sourcehash_peers == 0) return; - sourcehash_peers = (peer **)xcalloc(n_sourcehash_peers, sizeof(*sourcehash_peers)); + sourcehash_peers = (CachePeer **)xcalloc(n_sourcehash_peers, sizeof(*sourcehash_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = sourcehash_peers, p = Config.peers; p; p = p->next) { @@ -164,13 +166,13 @@ peerSourceHashCachemgr, 0, 1); } -peer * +CachePeer * peerSourceHashSelectParent(HttpRequest * request) { int k; const char *c; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -189,7 +191,7 @@ for (c = key; *c != 0; ++c) user_hash += ROTATE_LEFT(user_hash, 19) + *c; - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_sourcehash_peers; ++k) { tp = sourcehash_peers[k]; combined_hash = (user_hash ^ tp->sourcehash.hash); @@ -214,7 +216,7 @@ static void peerSourceHashCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/peer_sourcehash.h' --- src/peer_sourcehash.h 2012-08-29 00:12:28 +0000 +++ src/peer_sourcehash.h 2012-09-04 14:38:44 +0000 @@ -34,10 +34,10 @@ #ifndef SQUID_PEER_SOURCEHASH_H_ #define SQUID_PEER_SOURCEHASH_H_ -class peer; +class CachePeer; class HttpRequest; extern void peerSourceHashInit(void); -extern peer * peerSourceHashSelectParent(HttpRequest * request); +extern CachePeer * peerSourceHashSelectParent(HttpRequest * request); #endif /* SQUID_PEER_SOURCEHASH_H_ */ === modified file 'src/peer_userhash.cc' --- src/peer_userhash.cc 2012-09-01 14:38:36 +0000 +++ src/peer_userhash.cc 2012-09-04 15:15:51 +0000 @@ -37,10 +37,12 @@ #if USE_AUTH #include "auth/UserRequest.h" +#include "CachePeer.h" #include "globals.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #if HAVE_MATH_H @@ -50,15 +52,15 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_userhash_peers = 0; -static peer **userhash_peers = NULL; +static CachePeer **userhash_peers = NULL; static OBJH peerUserHashCachemgr; static void peerUserHashRegisterWithCacheManager(void); static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -69,8 +71,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -101,7 +103,7 @@ if (n_userhash_peers == 0) return; - userhash_peers = (peer **)xcalloc(n_userhash_peers, sizeof(*userhash_peers)); + userhash_peers = (CachePeer **)xcalloc(n_userhash_peers, sizeof(*userhash_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = userhash_peers, p = Config.peers; p; p = p->next) { @@ -169,13 +171,13 @@ 0, 1); } -peer * +CachePeer * peerUserHashSelectParent(HttpRequest * request) { int k; const char *c; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -197,7 +199,7 @@ for (c = key; *c != 0; ++c) user_hash += ROTATE_LEFT(user_hash, 19) + *c; - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_userhash_peers; ++k) { tp = userhash_peers[k]; combined_hash = (user_hash ^ tp->userhash.hash); @@ -222,7 +224,7 @@ static void peerUserHashCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/peer_userhash.h' --- src/peer_userhash.h 2012-08-29 00:12:28 +0000 +++ src/peer_userhash.h 2012-09-04 14:38:44 +0000 @@ -34,10 +34,10 @@ #ifndef SQUID_PEER_USERHASH_H_ #define SQUID_PEER_USERHASH_H_ -class peer; +class CachePeer; class HttpRequest; extern void peerUserHashInit(void); -extern peer * peerUserHashSelectParent(HttpRequest * request); +extern CachePeer * peerUserHashSelectParent(HttpRequest * request); #endif /* SQUID_PEER_USERHASH_H_ */ === modified file 'src/redirect.cc' --- src/redirect.cc 2012-08-31 16:57:39 +0000 +++ src/redirect.cc 2012-09-04 09:10:20 +0000 @@ -44,6 +44,7 @@ #include "mgr/Registration.h" #include "redirect.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "Store.h" #if USE_AUTH #include "auth/UserRequest.h" === modified file 'src/refresh.cc' --- src/refresh.cc 2012-09-01 14:38:36 +0000 +++ src/refresh.cc 2012-09-13 16:20:41 +0000 @@ -41,7 +41,9 @@ #include "HttpRequest.h" #include "HttpReply.h" #include "MemObject.h" +#include "RefreshPattern.h" #include "SquidTime.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" @@ -108,16 +110,16 @@ #define REFRESH_DEFAULT_PCT 0.20 #define REFRESH_DEFAULT_MAX (time_t)259200 -static const refresh_t *refreshUncompiledPattern(const char *); +static const RefreshPattern *refreshUncompiledPattern(const char *); static OBJH refreshStats; -static int refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const refresh_t * R, stale_flags * sf); - -static refresh_t DefaultRefresh; - -const refresh_t * +static int refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const RefreshPattern * R, stale_flags * sf); + +static RefreshPattern DefaultRefresh; + +const RefreshPattern * refreshLimits(const char *url) { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (!regexec(&(R->compiled_pattern), url, 0, 0, 0)) @@ -127,10 +129,10 @@ return NULL; } -static const refresh_t * +static const RefreshPattern * refreshUncompiledPattern(const char *pat) { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (0 == strcmp(R->pattern, pat)) @@ -156,7 +158,7 @@ * times. */ static int -refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const refresh_t * R, stale_flags * sf) +refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const RefreshPattern * R, stale_flags * sf) { /** \par * Check for an explicit expiration time (Expires: header). @@ -230,7 +232,7 @@ static int refreshCheck(const StoreEntry * entry, HttpRequest * request, time_t delta) { - const refresh_t *R; + const RefreshPattern *R; const char *uri = NULL; time_t age = 0; time_t check_time = squid_curtime + delta; @@ -265,7 +267,7 @@ debugs(22, 3, "\tentry->timestamp:\t" << mkrfc1123(entry->timestamp)); - if (request && !request->flags.ignore_cc) { + if (request && !request->flags.ignoringCacheControl()) { const HttpHdrCc *const cc = request->cache_control; if (cc && cc->hasMinFresh()) { const int32_t minFresh=cc->minFresh(); @@ -291,7 +293,7 @@ entry->mem_obj->getReply()->cache_control->staleIfError() < staleness) { debugs(22, 3, "refreshCheck: stale-if-error period expired."); - request->flags.fail_on_validation_err = 1; + request->flags.setFailOnValidationError(); } if (EBIT_TEST(entry->flags, ENTRY_REVALIDATE) && staleness > -1 @@ -301,15 +303,15 @@ ) { debugs(22, 3, "refreshCheck: YES: Must revalidate stale response"); if (request) - request->flags.fail_on_validation_err = 1; + request->flags.setFailOnValidationError(); return STALE_MUST_REVALIDATE; } /* request-specific checks */ - if (request && !request->flags.ignore_cc) { + if (request && !request->flags.ignoringCacheControl()) { HttpHdrCc *cc = request->cache_control; - if (request->flags.ims && (R->flags.refresh_ims || Config.onoff.refresh_all_ims)) { + if (request->flags.hasIMS() && (R->flags.refresh_ims || Config.onoff.refresh_all_ims)) { /* The clients no-cache header is changed into a IMS query */ debugs(22, 3, "refreshCheck: YES: refresh-ims"); return STALE_FORCED_RELOAD; @@ -317,7 +319,7 @@ #if USE_HTTP_VIOLATIONS - if (!request->flags.nocache_hack) { + if (!request->flags.noCacheHackEnabled()) { (void) 0; } else if (R->flags.ignore_reload) { /* The clients no-cache header is ignored */ @@ -329,7 +331,7 @@ } else { /* The clients no-cache header is not overridden on this request */ debugs(22, 3, "refreshCheck: YES: client reload"); - request->flags.nocache = 1; + request->flags.setNocache(); return STALE_FORCED_RELOAD; } @@ -396,7 +398,7 @@ if ( max_stale >= 0 && staleness > max_stale) { debugs(22, 3, "refreshCheck: YES: max-stale limit"); if (request) - request->flags.fail_on_validation_err = 1; + request->flags.setFailOnValidationError(); return STALE_MAX_STALE; } @@ -492,7 +494,8 @@ int reason = refreshCheck(entry, request, 0); ++ refreshCounts[rcHTTP].total; ++ refreshCounts[rcHTTP].status[reason]; - request->flags.stale_if_hit = refreshIsStaleIfHit(reason); + if (refreshIsStaleIfHit(reason)) + request->flags.setStaleIfHit(); return (Config.onoff.offline || reason < 200) ? 0 : 1; } @@ -534,7 +537,7 @@ time_t getMaxAge(const char *url) { - const refresh_t *R; + const RefreshPattern *R; debugs(22, 3, "getMaxAge: '" << url << "'"); if ((R = refreshLimits(url))) === modified file 'src/refresh.h' --- src/refresh.h 2012-08-29 00:12:28 +0000 +++ src/refresh.h 2012-09-10 07:59:18 +0000 @@ -33,6 +33,8 @@ #ifndef SQUID_REFRESH_H_ #define SQUID_REFRESH_H_ +class RefreshPattern; + extern void refreshAddToList(const char *, int, time_t, int, time_t); extern int refreshIsCachable(const StoreEntry *); extern int refreshCheckHTTP(const StoreEntry *, HttpRequest *); @@ -41,6 +43,6 @@ extern int refreshCheckDigest(const StoreEntry *, time_t delta); extern time_t getMaxAge(const char *url); extern void refreshInit(void); -extern const refresh_t *refreshLimits(const char *url); +extern const RefreshPattern *refreshLimits(const char *url); #endif /* SQUID_REFRESH_H_ */ === modified file 'src/send-announce.cc' --- src/send-announce.cc 2012-08-31 16:57:39 +0000 +++ src/send-announce.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "globals.h" #include "ICP.h" #include "ipcache.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "tools.h" === modified file 'src/snmp_agent.cc' --- src/snmp_agent.cc 2012-09-01 14:38:36 +0000 +++ src/snmp_agent.cc 2012-09-04 15:15:51 +0000 @@ -31,6 +31,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "cache_snmp.h" #include "globals.h" #include "mem_node.h" @@ -39,6 +40,7 @@ #include "snmp_core.h" #include "StatCounters.h" #include "StatHist.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "stat.h" @@ -207,7 +209,7 @@ Ip::Address laddr; char *cp = NULL; - peer *p = NULL; + CachePeer *p = NULL; int cnt = 0; debugs(49, 5, "snmp_meshPtblFn: peer " << Var->name[LEN_SQ_MESH + 3] << " requested!"); *ErrP = SNMP_ERR_NOERROR; === modified file 'src/snmp_agent.h' --- src/snmp_agent.h 2012-08-31 15:45:51 +0000 +++ src/snmp_agent.h 2012-09-17 13:31:37 +0000 @@ -1,8 +1,8 @@ #ifndef SQUID_SNMP_AGENT_H_ #define SQUID_SNMP_AGENT_H_ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 49 SNMP Interface + * AUTHOR: Kostas Anagnostakis * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/snmp_core.cc' --- src/snmp_core.cc 2012-08-31 16:57:39 +0000 +++ src/snmp_core.cc 2012-09-04 15:15:51 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "acl/FilledChecklist.h" #include "base/CbcPointer.h" +#include "CachePeer.h" #include "client_db.h" #include "comm.h" #include "comm/Connection.h" @@ -42,6 +43,7 @@ #include "snmp_agent.h" #include "snmp_core.h" #include "snmp/Forwarder.h" +#include "SquidConfig.h" #include "tools.h" static void snmpPortOpened(const Comm::ConnectionPointer &conn, int errNo); @@ -747,7 +749,7 @@ peer_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn) { oid *instance = NULL; - peer *peers = Config.peers; + CachePeer *peers = Config.peers; if (peers == NULL) { debugs(49, 6, "snmp peer_Inst: No Peers."); === modified file 'src/ssl/context_storage.cc' --- src/ssl/context_storage.cc 2012-07-23 15:34:12 +0000 +++ src/ssl/context_storage.cc 2012-09-04 15:15:51 +0000 @@ -9,6 +9,9 @@ #if HAVE_LIMITS #include #endif +#if USE_SSL +#include +#endif Ssl::CertificateStorageAction::CertificateStorageAction(const Mgr::Command::Pointer &cmd) : Mgr::Action(cmd) === modified file 'src/ssl/context_storage.h' --- src/ssl/context_storage.h 2012-08-28 13:00:30 +0000 +++ src/ssl/context_storage.h 2012-09-04 15:15:51 +0000 @@ -17,6 +17,8 @@ #if HAVE_LIST #include #endif +#include + /// TODO: Replace on real size. #define SSL_CTX_SIZE 1024 === modified file 'src/ssl/helper.cc' --- src/ssl/helper.cc 2012-08-31 16:57:39 +0000 +++ src/ssl/helper.cc 2012-09-04 09:10:20 +0000 @@ -1,7 +1,3 @@ -/* - * 2008/11/14 - */ - #include "squid.h" #include "anyp/PortCfg.h" #include "ssl/Config.h" @@ -10,6 +6,7 @@ #include "SquidTime.h" #include "SwapDir.h" #include "wordlist.h" +#include "SquidConfig.h" Ssl::Helper * Ssl::Helper::GetInstance() { === modified file 'src/ssl/support.cc' --- src/ssl/support.cc 2012-09-09 17:13:42 +0000 +++ src/ssl/support.cc 2012-09-09 19:41:47 +0000 @@ -42,6 +42,7 @@ #include "anyp/PortCfg.h" #include "fde.h" #include "globals.h" +#include "SquidConfig.h" #include "ssl/ErrorDetail.h" #include "ssl/support.h" #include "ssl/gadgets.h" === modified file 'src/stat.cc' --- src/stat.cc 2012-09-01 14:38:36 +0000 +++ src/stat.cc 2012-09-04 15:15:51 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "CacheDigest.h" +#include "CachePeer.h" #include "client_side_request.h" #include "client_side.h" #include "comm/Connection.h" @@ -53,6 +54,7 @@ #include "mgr/ServiceTimesAction.h" #include "neighbors.h" #include "PeerDigest.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "StatCounters.h" @@ -219,19 +221,19 @@ stats.http_reads = IOStats.Http.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < iostats::histSize; ++i) { stats.http_read_hist[i] = IOStats.Http.read_hist[i]; } stats.ftp_reads = IOStats.Ftp.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < iostats::histSize; ++i) { stats.ftp_read_hist[i] = IOStats.Ftp.read_hist[i]; } stats.gopher_reads = IOStats.Gopher.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < iostats::histSize; ++i) { stats.gopher_read_hist[i] = IOStats.Gopher.read_hist[i]; } } @@ -245,7 +247,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.http_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < iostats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -258,7 +260,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.ftp_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < iostats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -271,7 +273,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.gopher_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < iostats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -1810,7 +1812,7 @@ { #if USE_CACHE_DIGESTS StatCounters *f = &statCounter; - peer *peer; + CachePeer *peer; const int tot_used = f->cd.times_used + f->icp.times_used; /* totals */ === modified file 'src/store.cc' --- src/store.cc 2012-09-01 14:38:36 +0000 +++ src/store.cc 2012-09-13 16:20:41 +0000 @@ -48,6 +48,8 @@ #include "mgr/StoreIoAction.h" #include "profiler/Profiler.h" #include "repl_modules.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Stack.h" #include "StatCounters.h" @@ -816,7 +818,7 @@ } StoreEntry * -storeCreateEntry(const char *url, const char *log_url, request_flags flags, const HttpRequestMethod& method) +storeCreateEntry(const char *url, const char *log_url, const RequestFlags &flags, const HttpRequestMethod& method) { StoreEntry *e = NULL; MemObject *mem = NULL; @@ -827,12 +829,12 @@ mem = e->mem_obj; mem->method = method; - if (neighbors_do_private_keys || !flags.hierarchical) + if (neighbors_do_private_keys || !flags.hierarchical()) e->setPrivateKey(); else e->setPublicKey(); - if (flags.cachable) { + if (flags.isCachable()) { EBIT_SET(e->flags, ENTRY_CACHABLE); EBIT_CLR(e->flags, RELEASE_REQUEST); } else { @@ -1965,7 +1967,7 @@ { const String reqETags = request.header.getList(HDR_IF_NONE_MATCH); // weak comparison is allowed only for HEAD or full-body GET requests - const bool allowWeakMatch = !request.flags.range && + const bool allowWeakMatch = !request.flags.isRanged() && (request.method == METHOD_GET || request.method == METHOD_HEAD); return hasOneOfEtags(reqETags, allowWeakMatch); } === modified file 'src/store_client.cc' --- src/store_client.cc 2012-09-01 14:38:36 +0000 +++ src/store_client.cc 2012-09-13 16:20:41 +0000 @@ -40,6 +40,7 @@ #include "MemObject.h" #include "mime_header.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "StoreClient.h" #include "Store.h" @@ -790,7 +791,7 @@ assert(mem); debugs(90, 3, "CheckQuickAbort2: entry=" << entry << ", mem=" << mem); - if (mem->request && !mem->request->flags.cachable) { + if (mem->request && !mem->request->flags.isCachable()) { debugs(90, 3, "CheckQuickAbort2: YES !mem->request->flags.cachable"); return 1; } === modified file 'src/store_digest.cc' --- src/store_digest.cc 2012-08-31 16:57:39 +0000 +++ src/store_digest.cc 2012-09-13 16:20:41 +0000 @@ -51,6 +51,7 @@ #include "MemObject.h" #include "PeerDigest.h" #include "refresh.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreSearch.h" @@ -376,7 +377,7 @@ static void storeDigestRewriteStart(void *datanotused) { - request_flags flags; + RequestFlags flags; char *url; StoreEntry *e; @@ -391,7 +392,7 @@ debugs(71, 2, "storeDigestRewrite: start rewrite #" << sd_state.rewrite_count + 1); /* make new store entry */ url = internalLocalUri("/squid-internal-periodic/", StoreDigestFileName); - flags.cachable = 1; + flags.setCachable(); e = storeCreateEntry(url, url, flags, METHOD_GET); assert(e); sd_state.rewrite_lock = e; === modified file 'src/store_dir.cc' --- src/store_dir.cc 2012-09-01 14:38:36 +0000 +++ src/store_dir.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "MemObject.h" #include "MemStore.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/store_io.cc' --- src/store_io.cc 2012-08-14 11:53:07 +0000 +++ src/store_io.cc 2012-09-04 09:10:20 +0000 @@ -1,6 +1,7 @@ #include "squid.h" #include "Store.h" #include "MemObject.h" +#include "SquidConfig.h" #include "SwapDir.h" StoreIoStats store_io_stats; === modified file 'src/store_log.cc' --- src/store_log.cc 2012-08-29 16:01:32 +0000 +++ src/store_log.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "mgr/Registration.h" #include "Store.h" #include "store_log.h" +#include "SquidConfig.h" #include "SquidTime.h" static const char *storeLogTags[] = { === modified file 'src/store_rebuild.cc' --- src/store_rebuild.cc 2012-08-31 16:57:39 +0000 +++ src/store_rebuild.cc 2012-09-06 14:22:03 +0000 @@ -41,12 +41,13 @@ #include "store_digest.h" #include "store_rebuild.h" #include "StoreSearch.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H #include #endif -static struct _store_rebuild_data counts; +static StoreRebuildData counts; static struct timeval rebuild_start; static void storeCleanup(void *); @@ -136,7 +137,7 @@ /* meta data recreated from disk image in swap directory */ void -storeRebuildComplete(struct _store_rebuild_data *dc) +storeRebuildComplete(StoreRebuildData *dc) { double dt; counts.objcount += dc->objcount; @@ -294,7 +295,7 @@ bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, - struct _store_rebuild_data &counts) + StoreRebuildData &counts) { if (fd < 0) return false; @@ -316,7 +317,7 @@ bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &tmpe, cache_key *key, - struct _store_rebuild_data &counts, + StoreRebuildData &counts, uint64_t expectedSize) { int swap_hdr_len = 0; @@ -382,7 +383,7 @@ bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, - struct _store_rebuild_data &counts) + StoreRebuildData &counts) { /* this needs to become * 1) unpack url === modified file 'src/store_rebuild.h' --- src/store_rebuild.h 2012-09-03 09:02:20 +0000 +++ src/store_rebuild.h 2012-09-09 19:41:47 +0000 @@ -31,16 +31,29 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * */ +class StoreRebuildData { +public: + int objcount; /* # objects successfully reloaded */ + int expcount; /* # objects expired */ + int scancount; /* # entries scanned or read from state file */ + int clashcount; /* # swapfile clashes avoided */ + int dupcount; /* # duplicates purged */ + int cancelcount; /* # SWAP_LOG_DEL objects purged */ + int invalid; /* # bad lines */ + int badflags; /* # bad e->flags */ + int bad_log_op; + int zero_object_sz; +}; extern void storeRebuildStart(void); -extern void storeRebuildComplete(struct _store_rebuild_data *); +extern void storeRebuildComplete(StoreRebuildData *); extern void storeRebuildProgress(int sd_index, int total, int sofar); /// loads entry from disk; fills supplied memory buffer on success -extern bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, struct _store_rebuild_data &counts); +extern bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, StoreRebuildData &counts); /// parses entry buffer and validates entry metadata; fills e on success -extern bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &e, cache_key *key, struct _store_rebuild_data &counts, uint64_t expectedSize); +extern bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &e, cache_key *key, StoreRebuildData &counts, uint64_t expectedSize); /// checks whether the loaded entry should be kept; updates counters -extern bool storeRebuildKeepEntry(const StoreEntry &e, const cache_key *key, struct _store_rebuild_data &counts); +extern bool storeRebuildKeepEntry(const StoreEntry &e, const cache_key *key, StoreRebuildData &counts); #endif /* SQUID_STORE_REBUILD_H_ */ === modified file 'src/store_swapout.cc' --- src/store_swapout.cc 2012-09-01 14:38:36 +0000 +++ src/store_swapout.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ /* FIXME: Abstract the use of this more */ #include "mem_node.h" #include "MemObject.h" +#include "SquidConfig.h" #include "SwapDir.h" #include "StatCounters.h" #include "store_log.h" === modified file 'src/structs.h' --- src/structs.h 2012-09-03 09:02:20 +0000 +++ src/structs.h 2012-09-10 12:49:35 +0000 @@ -29,11 +29,9 @@ #ifndef SQUID_STRUCTS_H #define SQUID_STRUCTS_H -#include "RefCount.h" #include "cbdata.h" #include "defines.h" #include "dlink.h" -#include "err_type.h" #include "hash.h" #include "ip/Address.h" @@ -41,33 +39,15 @@ #include "HttpHeader.h" #include "HttpHeaderTools.h" -/* for ICP_END */ -#include "icp_opcode.h" - -#if USE_SSL -#include -#endif - #define PEER_MULTICAST_SIBLINGS 1 -struct acl_name_list { - char name[ACL_NAME_SZ]; - acl_name_list *next; -}; - -struct acl_deny_info_list { - err_type err_page_id; - char *err_page_name; - acl_name_list *acl_list; - acl_deny_info_list *next; -}; - class ACLChecklist; #if SQUID_SNMP #include "snmp_session.h" -struct _snmp_request_t { +class snmp_request_t { +public: u_char *buf; u_char *outbuf; int len; @@ -88,13 +68,6 @@ class ACLList; -struct acl_address { - acl_address *next; - ACLList *aclList; - - Ip::Address addr; -}; - struct acl_tos { acl_tos *next; ACLList *aclList; @@ -113,18 +86,6 @@ int64_t size; }; -struct ushortlist { - unsigned short i; - ushortlist *next; -}; - -struct relist { - int flags; - char *pattern; - regex_t regex; - relist *next; -}; - #if USE_DELAY_POOLS #include "DelayConfig.h" #include "ClientDelayConfig.h" @@ -142,533 +103,23 @@ class RemovalPolicySettings; class external_acl; class Store; +class CustomLog; +class CacheMgrPasswd; namespace AnyP { struct PortCfg; } class SwapDir; -/// Used for boolean enabled/disabled options with complex default logic. -/// Allows Squid to compute the right default after configuration. -/// Checks that not-yet-defined option values are not used. -class YesNoNone -{ -// TODO: generalize to non-boolean option types +class close_handler { public: - YesNoNone(): option(0) {} - - /// returns true iff enabled; asserts if the option has not been configured - operator void *() const; // TODO: use a fancy/safer version of the operator - - /// enables or disables the option; - void configure(bool beSet); - - /// whether the option was enabled or disabled, by user or Squid - bool configured() const { return option != 0; } - -private: - enum { optUnspecified = -1, optDisabled = 0, optEnabled = 1 }; - int option; ///< configured value or zero -}; - -struct SquidConfig { - - struct { - /* These should be for the Store::Root instance. - * this needs pluggable parsing to be done smoothly. - */ - int highWaterMark; - int lowWaterMark; - } Swap; - - YesNoNone memShared; ///< whether the memory cache is shared among workers - size_t memMaxSize; - - struct { - int64_t min; - int pct; - int64_t max; - } quickAbort; - int64_t readAheadGap; - RemovalPolicySettings *replPolicy; - RemovalPolicySettings *memPolicy; -#if USE_HTTP_VIOLATIONS - time_t negativeTtl; -#endif - time_t maxStale; - time_t negativeDnsTtl; - time_t positiveDnsTtl; - time_t shutdownLifetime; - time_t backgroundPingRate; - - struct { - time_t read; - time_t write; - time_t lifetime; - time_t connect; - time_t forward; - time_t peer_connect; - time_t request; - time_t clientIdlePconn; - time_t serverIdlePconn; - time_t siteSelect; - time_t deadPeer; - int icp_query; /* msec */ - int icp_query_max; /* msec */ - int icp_query_min; /* msec */ - int mcast_icp_query; /* msec */ - -#if !USE_DNSHELPER - time_msec_t idns_retransmit; - time_msec_t idns_query; -#endif - - } Timeout; - size_t maxRequestHeaderSize; - int64_t maxRequestBodySize; - int64_t maxChunkedRequestBodySize; - size_t maxRequestBufferSize; - size_t maxReplyHeaderSize; - acl_size_t *ReplyBodySize; - - struct { - unsigned short icp; -#if USE_HTCP - - unsigned short htcp; -#endif -#if SQUID_SNMP - - unsigned short snmp; -#endif - } Port; - - struct { - AnyP::PortCfg *http; -#if USE_SSL - AnyP::PortCfg *https; -#endif - } Sockaddr; -#if SQUID_SNMP - - struct { - char *configFile; - char *agentInfo; - } Snmp; -#endif -#if USE_WCCP - - struct { - Ip::Address router; - Ip::Address address; - int version; - } Wccp; -#endif -#if USE_WCCPv2 - - struct { - Ip::Address_list *router; - Ip::Address address; - int forwarding_method; - int return_method; - int assignment_method; - int weight; - int rebuildwait; - void *info; - } Wccp2; -#endif - -#if USE_ICMP - IcmpConfig pinger; -#endif - - char *as_whois_server; - - struct { - char *store; - char *swap; - customlog *accesslogs; -#if ICAP_CLIENT - customlog *icaplogs; -#endif - int rotateNumber; - } Log; - char *adminEmail; - char *EmailFrom; - char *EmailProgram; - char *effectiveUser; - char *visible_appname_string; - char *effectiveGroup; - - struct { -#if USE_DNSHELPER - char *dnsserver; -#endif - - wordlist *redirect; -#if USE_UNLINKD - - char *unlinkd; -#endif - - char *diskd; -#if USE_SSL - - char *ssl_password; -#endif - - } Program; -#if USE_DNSHELPER - HelperChildConfig dnsChildren; -#endif - - HelperChildConfig redirectChildren; - time_t authenticateGCInterval; - time_t authenticateTTL; - time_t authenticateIpTTL; - - struct { - char *surrogate_id; - } Accel; - char *appendDomain; - size_t appendDomainLen; - char *pidFilename; - char *netdbFilename; - char *mimeTablePathname; - char *etcHostsPath; - char *visibleHostname; - char *uniqueHostname; - wordlist *hostnameAliases; - char *errHtmlText; - - struct { - char *host; - char *file; - time_t period; - unsigned short port; - } Announce; - - struct { - - Ip::Address udp_incoming; - Ip::Address udp_outgoing; -#if SQUID_SNMP - Ip::Address snmp_incoming; - Ip::Address snmp_outgoing; -#endif - /* FIXME INET6 : this should really be a CIDR value */ - Ip::Address client_netmask; - } Addrs; - size_t tcpRcvBufsz; - size_t udpMaxHitObjsz; - wordlist *hierarchy_stoplist; - wordlist *mcast_group_list; - wordlist *dns_nameservers; - peer *peers; - int npeers; - - struct { - int size; - int low; - int high; - } ipcache; - - struct { - int size; - } fqdncache; - int minDirectHops; - int minDirectRtt; - cachemgr_passwd *passwd_list; - - struct { - int objectsPerBucket; - int64_t avgObjectSize; - int64_t maxObjectSize; - int64_t minObjectSize; - size_t maxInMemObjSize; - } Store; - - struct { - int high; - int low; - time_t period; - } Netdb; - - struct { - int log_udp; - int res_defnames; - int anonymizer; - int client_db; - int query_icmp; - int icp_hit_stale; - int buffered_logs; - int common_log; - int log_mime_hdrs; - int log_fqdn; - int announce; - int mem_pools; - int test_reachability; - int half_closed_clients; - int refresh_all_ims; -#if USE_HTTP_VIOLATIONS - - int reload_into_ims; -#endif - - int offline; - int redir_rewrites_host; - int prefer_direct; - int nonhierarchical_direct; - int strip_query_terms; - int redirector_bypass; - int ignore_unknown_nameservers; - int client_pconns; - int server_pconns; - int error_pconns; -#if USE_CACHE_DIGESTS - - int digest_generation; -#endif - - int ie_refresh; - int vary_ignore_expire; - int pipeline_prefetch; - int surrogate_is_remote; - int request_entities; - int detect_broken_server_pconns; - int balance_on_multiple_ip; - int relaxed_header_parser; - int check_hostnames; - int allow_underscore; - int via; - int emailErrData; - int httpd_suppress_version_string; - int global_internal_static; - -#if FOLLOW_X_FORWARDED_FOR - int acl_uses_indirect_client; - int delay_pool_uses_indirect_client; - int log_uses_indirect_client; -#if LINUX_NETFILTER - int tproxy_uses_indirect_client; -#endif -#endif /* FOLLOW_X_FORWARDED_FOR */ - - int WIN32_IpAddrChangeMonitor; - int memory_cache_first; - int memory_cache_disk; - int hostStrictVerify; - int client_dst_passthru; - } onoff; - - int forward_max_tries; - int connect_retries; - - class ACL *aclList; - - struct { - acl_access *http; - acl_access *adapted_http; - acl_access *icp; - acl_access *miss; - acl_access *NeverDirect; - acl_access *AlwaysDirect; - acl_access *ASlists; - acl_access *noCache; - acl_access *log; -#if SQUID_SNMP - - acl_access *snmp; -#endif -#if USE_HTTP_VIOLATIONS - acl_access *brokenPosts; -#endif - acl_access *redirector; - acl_access *reply; - acl_address *outgoing_address; -#if USE_HTCP - - acl_access *htcp; - acl_access *htcp_clr; -#endif - -#if USE_SSL - acl_access *ssl_bump; -#endif -#if FOLLOW_X_FORWARDED_FOR - acl_access *followXFF; -#endif /* FOLLOW_X_FORWARDED_FOR */ - -#if ICAP_CLIENT - acl_access* icap; -#endif - } accessList; - acl_deny_info_list *denyInfoList; - - struct { - size_t list_width; - int list_wrap; - char *anon_user; - int passive; - int epsv_all; - int epsv; - int eprt; - int sanitycheck; - int telnet; - } Ftp; - refresh_t *Refresh; - - struct _cacheSwap { - RefCount *swapDirs; - int n_allocated; - int n_configured; - /// number of disk processes required to support all cache_dirs - int n_strands; - } cacheSwap; - /* - * I'm sick of having to keep doing this .. - */ -#define INDEXSD(i) (Config.cacheSwap.swapDirs[(i)].getRaw()) - - struct { - char *directory; - int use_short_names; - } icons; - char *errorDirectory; -#if USE_ERR_LOCALES - char *errorDefaultLanguage; - int errorLogMissingLanguages; -#endif - char *errorStylesheet; - - struct { - int onerror; - } retry; - - struct { - int64_t limit; - } MemPools; -#if USE_DELAY_POOLS - - DelayConfig Delay; - ClientDelayConfig ClientDelay; -#endif - - struct { - struct { - int average; - int min_poll; - } dns, udp, tcp; - } comm_incoming; - int max_open_disk_fds; - int uri_whitespace; - acl_size_t *rangeOffsetLimit; -#if MULTICAST_MISS_STREAM - - struct { - - Ip::Address addr; - int ttl; - unsigned short port; - char *encode_key; - } mcast_miss; -#endif - - /// request_header_access and request_header_replace - HeaderManglers *request_header_access; - /// reply_header_access and reply_header_replace - HeaderManglers *reply_header_access; - ///request_header_add access list - HeaderWithAclList *request_header_add; - char *coredump_dir; - char *chroot_dir; -#if USE_CACHE_DIGESTS - - struct { - int bits_per_entry; - time_t rebuild_period; - time_t rewrite_period; - size_t swapout_chunk_size; - int rebuild_chunk_percentage; - } digest; -#endif -#if USE_SSL - - struct { - int unclean_shutdown; - char *ssl_engine; - } SSL; -#endif - - wordlist *ext_methods; - - struct { - int high_rptm; - int high_pf; - size_t high_memory; - } warnings; - char *store_dir_select_algorithm; - int sleep_after_fork; /* microseconds */ - time_t minimum_expiry_time; /* seconds */ - external_acl *externalAclHelperList; - -#if USE_SSL - - struct { - char *cert; - char *key; - int version; - char *options; - char *cipher; - char *cafile; - char *capath; - char *crlfile; - char *flags; - acl_access *cert_error; - SSL_CTX *sslContext; - sslproxy_cert_sign *cert_sign; - sslproxy_cert_adapt *cert_adapt; - } ssl_client; -#endif - - char *accept_filter; - int umask; - int max_filedescriptors; - int workers; - CpuAffinityMap *cpuAffinityMap; - -#if USE_LOADABLE_MODULES - wordlist *loadable_module_names; -#endif - - int client_ip_max_connections; - - struct { - int v4_first; ///< Place IPv4 first in the order of DNS results. - ssize_t packet_max; ///< maximum size EDNS advertised for DNS replies. - } dns; -}; - -SQUIDCEXTERN SquidConfig Config; - -struct SquidConfig2 { - struct { - int enable_purge; - int mangle_request_headers; - } onoff; - uid_t effectiveUserID; - gid_t effectiveGroupID; -}; - -SQUIDCEXTERN SquidConfig2 Config2; - -struct _close_handler { PF *handler; void *data; close_handler *next; }; -struct _dread_ctrl { +class dread_ctrl { +public: int fd; off_t offset; int req_len; @@ -678,7 +129,8 @@ void *client_data; }; -struct _dwrite_q { +class dwrite_q { +public: off_t file_offset; char *buf; size_t len; @@ -695,37 +147,9 @@ off_t offset; }; -/* per field statistics */ - -class HttpHeaderFieldStat -{ - -public: - HttpHeaderFieldStat() : aliveCount(0), seenCount(0), parsCount(0), errCount(0), repCount(0) {} - - int aliveCount; /* created but not destroyed (count) */ - int seenCount; /* #fields we've seen */ - int parsCount; /* #parsing attempts */ - int errCount; /* #pasring errors */ - int repCount; /* #repetitons */ -}; - -/* compiled version of HttpHeaderFieldAttrs plus stats */ -#include "SquidString.h" - -class HttpHeaderFieldInfo -{ - -public: - HttpHeaderFieldInfo() : id (HDR_ACCEPT), type (ftInvalid) {} - - http_hdr_type id; - String name; - field_type type; - HttpHeaderFieldStat stat; -}; - -struct _http_state_flags { + +class http_state_flags { +public: unsigned int proxying:1; unsigned int keepalive:1; unsigned int only_if_cached:1; @@ -743,13 +167,15 @@ unsigned int sentLastChunk:1; ///< do not try to write last-chunk again }; -struct _domain_ping { +class domain_ping { +public: char *domain; int do_ping; /* boolean */ domain_ping *next; }; -struct _domain_type { +class domain_type { +public: char *domain; peer_t type; domain_type *next; @@ -757,180 +183,26 @@ class PeerDigest; -struct peer { - u_int index; - char *name; - char *host; - peer_t type; - - Ip::Address in_addr; - - struct { - int pings_sent; - int pings_acked; - int fetches; - int rtt; - int ignored_replies; - int n_keepalives_sent; - int n_keepalives_recv; - time_t probe_start; - time_t last_query; - time_t last_reply; - time_t last_connect_failure; - time_t last_connect_probe; - int logged_state; /* so we can print dead/revived msgs */ - int conn_open; /* current opened connections */ - } stats; - - struct { - int version; - int counts[ICP_END+1]; - unsigned short port; - } icp; - -#if USE_HTCP - struct { - double version; - int counts[2]; - unsigned short port; - } htcp; -#endif - - unsigned short http_port; - domain_ping *peer_domain; - domain_type *typelist; - acl_access *access; - - struct { - unsigned int proxy_only:1; - unsigned int no_query:1; - unsigned int background_ping:1; - unsigned int no_digest:1; - unsigned int default_parent:1; - unsigned int roundrobin:1; - unsigned int weighted_roundrobin:1; - unsigned int mcast_responder:1; - unsigned int closest_only:1; -#if USE_HTCP - unsigned int htcp:1; - unsigned int htcp_oldsquid:1; - unsigned int htcp_no_clr:1; - unsigned int htcp_no_purge_clr:1; - unsigned int htcp_only_clr:1; - unsigned int htcp_forward_clr:1; -#endif - unsigned int no_netdb_exchange:1; -#if USE_DELAY_POOLS - unsigned int no_delay:1; -#endif - unsigned int allow_miss:1; - unsigned int carp:1; - struct { - unsigned int set:1; //If false, whole url is to be used. Overrides others - unsigned int scheme:1; - unsigned int host:1; - unsigned int port:1; - unsigned int path:1; - unsigned int params:1; - } carp_key; -#if USE_AUTH - unsigned int userhash:1; -#endif - unsigned int sourcehash:1; - unsigned int originserver:1; - unsigned int no_tproxy:1; -#if PEER_MULTICAST_SIBLINGS - unsigned int mcast_siblings:1; -#endif - } options; - - int weight; - int basetime; - - struct { - double avg_n_members; - int n_times_counted; - int n_replies_expected; - int ttl; - int id; - - struct { - unsigned int count_event_pending:1; - unsigned int counting:1; - } flags; - } mcast; -#if USE_CACHE_DIGESTS - - PeerDigest *digest; - char *digest_url; -#endif - - int tcp_up; /* 0 if a connect() fails */ - - Ip::Address addresses[10]; - int n_addresses; - int rr_count; - peer *next; - int testing_now; - - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } carp; -#if USE_AUTH - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } userhash; -#endif - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } sourcehash; - - char *login; /* Proxy authorization */ - time_t connect_timeout; - int connect_fail_limit; - int max_conn; - char *domain; /* Forced domain */ -#if USE_SSL - - int use_ssl; - char *sslcert; - char *sslkey; - int sslversion; - char *ssloptions; - char *sslcipher; - char *sslcafile; - char *sslcapath; - char *sslcrlfile; - char *sslflags; - char *ssldomain; - SSL_CTX *sslContext; - SSL_SESSION *sslSession; -#endif - - int front_end_https; - int connection_auth; -}; - -struct _net_db_name { + +class netdbEntry; + +class net_db_name { +public: hash_link hash; /* must be first */ net_db_name *next; netdbEntry *net_db_entry; }; -struct _net_db_peer { +class net_db_peer { +public: const char *peername; double hops; double rtt; time_t expires; }; -struct _netdbEntry { +class netdbEntry { +public: hash_link hash; /* must be first */ char network[MAX_IPSTRLEN]; int pings_sent; @@ -946,9 +218,11 @@ int n_peers; }; -struct _iostats { +class iostats { +public: + static const int histSize=16; - enum { histSize = 16 }; +// enum { histSize = 16 }; struct { int reads; @@ -961,131 +235,6 @@ Http, Ftp, Gopher; }; -struct request_flags { - request_flags(): range(0),nocache(0),ims(0),auth(0),cachable(0),hierarchical(0),loopdetect(0),proxy_keepalive(0),proxying(0),refresh(0),redirected(0),need_validation(0),fail_on_validation_err(0),stale_if_hit(0),accelerated(0),ignore_cc(0),intercepted(0),hostVerified(0),spoof_client_ip(0),internal(0),internalclient(0),must_keepalive(0),pinned(0),canRePin(0),chunked_reply(0),stream_error(0),sslPeek(0),sslBumped(0),destinationIPLookedUp_(0) { -#if USE_HTTP_VIOLATIONS - nocache_hack = 0; -#endif -#if FOLLOW_X_FORWARDED_FOR - done_follow_x_forwarded_for = 0; -#endif /* FOLLOW_X_FORWARDED_FOR */ - } - - unsigned int range:1; - unsigned int nocache:1; ///< whether the response to this request may be READ from cache - unsigned int ims:1; - unsigned int auth:1; - unsigned int cachable:1; ///< whether the response to thie request may be stored in the cache - unsigned int hierarchical:1; - unsigned int loopdetect:1; - unsigned int proxy_keepalive:1; -unsigned int proxying: - 1; /* this should be killed, also in httpstateflags */ - unsigned int refresh:1; - unsigned int redirected:1; - unsigned int need_validation:1; - unsigned int fail_on_validation_err:1; ///< whether we should fail if validation fails - unsigned int stale_if_hit:1; ///< reply is stale if it is a hit -#if USE_HTTP_VIOLATIONS - unsigned int nocache_hack:1; /* for changing/ignoring no-cache requests */ -#endif - unsigned int accelerated:1; - unsigned int ignore_cc:1; - unsigned int intercepted:1; ///< intercepted request - unsigned int hostVerified:1; ///< whether the Host: header passed verification - unsigned int spoof_client_ip:1; /**< spoof client ip if possible */ - unsigned int internal:1; - unsigned int internalclient:1; - unsigned int must_keepalive:1; - unsigned int connection_auth:1; /** Request wants connection oriented auth */ - unsigned int connection_auth_disabled:1; /** Connection oriented auth can not be supported */ - unsigned int connection_proxy_auth:1; /** Request wants connection oriented auth */ - unsigned int pinned:1; /* Request sent on a pinned connection */ - unsigned int canRePin:1; ///< OK to reopen a failed pinned connection - unsigned int auth_sent:1; /* Authentication forwarded */ - unsigned int no_direct:1; /* Deny direct forwarding unless overriden by always_direct. Used in accelerator mode */ - unsigned int chunked_reply:1; /**< Reply with chunked transfer encoding */ - unsigned int stream_error:1; /**< Whether stream error has occured */ - unsigned int sslPeek:1; ///< internal ssl-bump request to get server cert - unsigned int sslBumped:1; /**< ssl-bumped request*/ - - // When adding new flags, please update cloneAdaptationImmune() as needed. - - bool resetTCP() const; - void setResetTCP(); - void clearResetTCP(); - void destinationIPLookupCompleted(); - bool destinationIPLookedUp() const; - - // returns a partial copy of the flags that includes only those flags - // that are safe for a related (e.g., ICAP-adapted) request to inherit - request_flags cloneAdaptationImmune() const; - -#if FOLLOW_X_FORWARDED_FOR - unsigned int done_follow_x_forwarded_for; -#endif /* FOLLOW_X_FORWARDED_FOR */ -private: - - unsigned int reset_tcp:1; - unsigned int destinationIPLookedUp_:1; -}; - -struct _cachemgr_passwd { - char *passwd; - wordlist *actions; - cachemgr_passwd *next; -}; - -struct _refresh_t { - const char *pattern; - regex_t compiled_pattern; - time_t min; - double pct; - time_t max; - refresh_t *next; - - struct { - unsigned int icase:1; - unsigned int refresh_ims:1; - unsigned int store_stale:1; -#if USE_HTTP_VIOLATIONS - unsigned int override_expire:1; - unsigned int override_lastmod:1; - unsigned int reload_into_ims:1; - unsigned int ignore_reload:1; - unsigned int ignore_no_cache:1; - unsigned int ignore_no_store:1; - unsigned int ignore_must_revalidate:1; - unsigned int ignore_private:1; - unsigned int ignore_auth:1; -#endif - } flags; - int max_stale; -}; - -struct _CacheDigest { - /* public, read-only */ - char *mask; /* bit mask */ - int mask_size; /* mask size in bytes */ - int capacity; /* expected maximum for .count, not a hard limit */ - int bits_per_entry; /* number of bits allocated for each entry from capacity */ - int count; /* number of digested entries */ - int del_count; /* number of deletions performed so far */ -}; - -struct _store_rebuild_data { - int objcount; /* # objects successfully reloaded */ - int expcount; /* # objects expired */ - int scancount; /* # entries scanned or read from state file */ - int clashcount; /* # swapfile clashes avoided */ - int dupcount; /* # duplicates purged */ - int cancelcount; /* # SWAP_LOG_DEL objects purged */ - int invalid; /* # bad lines */ - int badflags; /* # bad e->flags */ - int bad_log_op; - int zero_object_sz; -}; - #if USE_SSL struct _sslproxy_cert_sign { int alg; @@ -1101,17 +250,4 @@ }; #endif -class Logfile; - -#include "format/Format.h" -#include "log/Formats.h" -struct _customlog { - char *filename; - ACLList *aclList; - Format::Format *logFormat; - Logfile *logfile; - customlog *next; - Log::Format::log_type type; -}; - #endif /* SQUID_STRUCTS_H */ === modified file 'src/tests/stub_cache_cf.cc' --- src/tests/stub_cache_cf.cc 2012-09-01 14:38:36 +0000 +++ src/tests/stub_cache_cf.cc 2012-09-04 11:13:13 +0000 @@ -33,6 +33,7 @@ #include "squid.h" #include "ConfigParser.h" #include "wordlist.h" +#include "YesNoNone.h" #define STUB_API "cache_cf.cc" #include "tests/STUB.h" === modified file 'src/tests/stub_libcomm.cc' --- src/tests/stub_libcomm.cc 2012-08-10 00:12:23 +0000 +++ src/tests/stub_libcomm.cc 2012-09-04 14:38:44 +0000 @@ -17,8 +17,8 @@ Comm::Connection::~Connection() STUB Comm::ConnectionPointer Comm::Connection::copyDetails() const STUB_RETVAL(NULL) void Comm::Connection::close() STUB -peer * Comm::Connection::getPeer() const STUB_RETVAL(NULL) -void Comm::Connection::setPeer(peer * p) STUB +CachePeer * Comm::Connection::getPeer() const STUB_RETVAL(NULL) +void Comm::Connection::setPeer(CachePeer * p) STUB #include "comm/ConnOpener.h" CBDATA_NAMESPACED_CLASS_INIT(Comm, ConnOpener); === modified file 'src/tests/stub_libicmp.cc' --- src/tests/stub_libicmp.cc 2012-01-20 18:55:04 +0000 +++ src/tests/stub_libicmp.cc 2012-09-04 14:38:44 +0000 @@ -22,10 +22,10 @@ void netdbFreeMemory(void) STUB int netdbHostHops(const char *host) STUB_RETVAL(-1) int netdbHostRtt(const char *host) STUB_RETVAL(-1) -void netdbUpdatePeer(HttpRequest *, peer * e, int rtt, int hops) STUB +void netdbUpdatePeer(HttpRequest *, CachePeer * e, int rtt, int hops) STUB void netdbDeleteAddrNetwork(Ip::Address &addr) STUB void netdbBinaryExchange(StoreEntry *) STUB void netdbExchangeStart(void *) STUB -void netdbExchangeUpdatePeer(Ip::Address &, peer *, double, double) STUB -peer *netdbClosestParent(HttpRequest *) STUB_RETVAL(NULL) +void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double) STUB +CachePeer *netdbClosestParent(HttpRequest *) STUB_RETVAL(NULL) void netdbHostData(const char *host, int *samp, int *rtt, int *hops) STUB === modified file 'src/tests/stub_store.cc' --- src/tests/stub_store.cc 2012-08-28 13:00:30 +0000 +++ src/tests/stub_store.cc 2012-09-10 12:49:35 +0000 @@ -1,4 +1,5 @@ #include "squid.h" +#include "RequestFlags.h" #define STUB_API "store.cc" #include "tests/STUB.h" @@ -115,7 +116,7 @@ SQUIDCEXTERN StoreEntry *storeGetPublic(const char *uri, const HttpRequestMethod& method) STUB_RETVAL(NULL) SQUIDCEXTERN StoreEntry *storeGetPublicByRequest(HttpRequest * request) STUB_RETVAL(NULL) SQUIDCEXTERN StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method) STUB_RETVAL(NULL) -SQUIDCEXTERN StoreEntry *storeCreateEntry(const char *, const char *, request_flags, const HttpRequestMethod&) STUB_RETVAL(NULL) +extern StoreEntry *storeCreateEntry(const char *, const char *, const RequestFlags &, const HttpRequestMethod&) STUB_RETVAL(NULL) SQUIDCEXTERN void storeInit(void) STUB SQUIDCEXTERN void storeConfigure(void) STUB SQUIDCEXTERN void storeFreeMemory(void) STUB === modified file 'src/tests/stub_store_rebuild.cc' --- src/tests/stub_store_rebuild.cc 2012-09-01 14:38:36 +0000 +++ src/tests/stub_store_rebuild.cc 2012-09-06 14:22:03 +0000 @@ -32,15 +32,16 @@ #include "squid.h" #include "MemBuf.h" +#include "store_rebuild.h" #define STUB_API "stub_store_rebuild.cc" #include "tests/STUB.h" void storeRebuildProgress(int sd_index, int total, int sofar) STUB -void storeRebuildComplete(struct _store_rebuild_data *dc) STUB_NOP -bool storeRebuildLoadEntry(int, int, MemBuf&, _store_rebuild_data&) +void storeRebuildComplete(StoreRebuildData *dc) STUB_NOP +bool storeRebuildLoadEntry(int, int, MemBuf&, StoreRebuildData&) { return false; } -bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, struct _store_rebuild_data &counts) STUB_RETVAL(false) -bool storeRebuildParseEntry(MemBuf &, StoreEntry &, cache_key *, struct _store_rebuild_data &, uint64_t) STUB_RETVAL(false) +bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, StoreRebuildData &counts) STUB_RETVAL(false) +bool storeRebuildParseEntry(MemBuf &, StoreEntry &, cache_key *, StoreRebuildData &, uint64_t) STUB_RETVAL(false) === modified file 'src/tests/testCoss.cc' --- src/tests/testCoss.cc 2012-08-14 11:53:07 +0000 +++ src/tests/testCoss.cc 2012-09-13 16:20:41 +0000 @@ -9,8 +9,10 @@ #include "MemObject.h" #include "HttpHeader.h" #include "HttpReply.h" +#include "RequestFlags.h" #include "StoreFileSystem.h" #include "testStoreSupport.h" +#include "SquidConfig.h" #if HAVE_STDEXCEPT #include @@ -187,8 +189,8 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const rep->setHeaders(HTTP_OK, "dummy test object", "x-squid-internal/test", -1, -1, squid_curtime + 100000); === modified file 'src/tests/testHttpParser.cc' --- src/tests/testHttpParser.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testHttpParser.cc 2012-09-04 09:10:20 +0000 @@ -8,6 +8,7 @@ #include "Mem.h" #include "MemBuf.h" #include "structs.h" +#include "SquidConfig.h" CPPUNIT_TEST_SUITE_REGISTRATION( testHttpParser ); === modified file 'src/tests/testHttpReply.cc' --- src/tests/testHttpReply.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testHttpReply.cc 2012-09-04 09:10:20 +0000 @@ -7,10 +7,11 @@ #include "HttpReply.h" #include "Mem.h" #include "mime_header.h" +#include "SquidConfig.h" CPPUNIT_TEST_SUITE_REGISTRATION( testHttpReply ); -struct SquidConfig Config; +class SquidConfig Config; /* stub functions to link successfully */ === modified file 'src/tests/testNull.cc' --- src/tests/testNull.cc 2012-08-14 11:53:07 +0000 +++ src/tests/testNull.cc 2012-09-13 16:20:41 +0000 @@ -9,6 +9,8 @@ #include "MemObject.h" #include "HttpHeader.h" #include "HttpReply.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "StoreFileSystem.h" #include "testStoreSupport.h" @@ -158,8 +160,8 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); /* We are allowed to do this typecast */ HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const === modified file 'src/tests/testRock.cc' --- src/tests/testRock.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testRock.cc 2012-09-13 16:20:41 +0000 @@ -8,6 +8,8 @@ #include "HttpReply.h" #include "Mem.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreFileSystem.h" #include "StoreSearch.h" @@ -162,8 +164,8 @@ StoreEntry * testRock::createEntry(const int i) { - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); char url[64]; snprintf(url, sizeof(url), "dummy url %i", i); url[sizeof(url) - 1] = '\0'; === modified file 'src/tests/testStoreController.cc' --- src/tests/testStoreController.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testStoreController.cc 2012-09-04 09:10:20 +0000 @@ -6,6 +6,7 @@ #include "SwapDir.h" #include "TestSwapDir.h" #include "Mem.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StoreSearch.h" === modified file 'src/tests/testStoreHashIndex.cc' --- src/tests/testStoreHashIndex.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testStoreHashIndex.cc 2012-09-04 09:10:20 +0000 @@ -8,6 +8,7 @@ #include "StoreHashIndex.h" #include "Mem.h" #include "StoreSearch.h" +#include "SquidConfig.h" #include "SquidTime.h" CPPUNIT_TEST_SUITE_REGISTRATION( testStoreHashIndex ); === modified file 'src/tests/testUfs.cc' --- src/tests/testUfs.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testUfs.cc 2012-09-13 16:20:41 +0000 @@ -8,6 +8,8 @@ #include "HttpReply.h" #include "Mem.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "SwapDir.h" #include "testStoreSupport.h" @@ -139,8 +141,8 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const rep->setHeaders(HTTP_OK, "dummy test object", "x-squid-internal/test", -1, -1, squid_curtime + 100000); === modified file 'src/tools.cc' --- src/tools.cc 2012-09-01 14:38:36 +0000 +++ src/tools.cc 2012-09-04 09:10:20 +0000 @@ -42,6 +42,7 @@ #include "ip/QosConfig.h" #include "MemBuf.h" #include "anyp/PortCfg.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "ipc/Kids.h" === modified file 'src/tunnel.cc' --- src/tunnel.cc 2012-09-01 14:38:36 +0000 +++ src/tunnel.cc 2012-09-13 11:40:32 +0000 @@ -32,23 +32,24 @@ */ #include "squid.h" -#include "errorpage.h" -#include "HttpRequest.h" -#include "fde.h" +#include "acl/FilledChecklist.h" #include "Array.h" +#include "CachePeer.h" +#include "client_side_request.h" +#include "client_side.h" #include "comm.h" #include "comm/Connection.h" #include "comm/ConnOpener.h" #include "comm/Write.h" -#include "client_side_request.h" -#include "acl/FilledChecklist.h" -#include "client_side.h" +#include "errorpage.h" +#include "fde.h" +#include "http.h" +#include "HttpRequest.h" #include "MemBuf.h" -#include "http.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "tools.h" - #if USE_DELAY_POOLS #include "DelayId.h" #endif @@ -530,7 +531,7 @@ TunnelStateData *tunnelState = (TunnelStateData *)data; debugs(26, 3, HERE << server << ", tunnelState=" << tunnelState); - if (tunnelState->request && (tunnelState->request->flags.spoof_client_ip || tunnelState->request->flags.intercepted)) + if (tunnelState->request && (tunnelState->request->flags.spoofClientIp() || tunnelState->request->flags.intercepted())) tunnelStartShoveling(tunnelState); // ssl-bumped connection, be quiet else { AsyncCall::Pointer call = commCbCall(5,5, "tunnelConnectedWriteDone", @@ -604,13 +605,16 @@ debugs(26, 4, HERE << "determine post-connect handling pathway."); if (conn->getPeer()) { tunnelState->request->peer_login = conn->getPeer()->login; - tunnelState->request->flags.proxying = (conn->getPeer()->options.originserver?0:1); + if (conn->getPeer()->options.originserver) + tunnelState->request->flags.setProxying(); + else + tunnelState->request->flags.clearProxying(); } else { tunnelState->request->peer_login = NULL; - tunnelState->request->flags.proxying = 0; + tunnelState->request->flags.clearProxying(); } - if (tunnelState->request->flags.proxying) + if (tunnelState->request->flags.proxying()) tunnelRelayConnectRequest(conn, tunnelState); else { tunnelConnected(conn, tunnelState); @@ -694,7 +698,7 @@ http_state_flags flags; debugs(26, 3, HERE << srv << ", tunnelState=" << tunnelState); memset(&flags, '\0', sizeof(flags)); - flags.proxying = tunnelState->request->flags.proxying; + flags.proxying = tunnelState->request->flags.proxying(); MemBuf mb; mb.init(); mb.Printf("CONNECT %s HTTP/1.1\r\n", tunnelState->url); === modified file 'src/typedefs.h' --- src/typedefs.h 2012-09-03 09:02:20 +0000 +++ src/typedefs.h 2012-09-09 19:41:47 +0000 @@ -45,48 +45,8 @@ size_t kb; } kb_t; -typedef struct _close_handler close_handler; - -typedef struct _dread_ctrl dread_ctrl; - -typedef struct _dwrite_q dwrite_q; - -typedef struct _HttpHeaderFieldAttrs HttpHeaderFieldAttrs; - -typedef struct _domain_ping domain_ping; - -typedef struct _domain_type domain_type; - -typedef struct _DigestFetchState DigestFetchState; - -typedef struct _net_db_name net_db_name; - -typedef struct _net_db_peer net_db_peer; - -typedef struct _netdbEntry netdbEntry; - -typedef struct _icp_common_t icp_common_t; - -typedef struct _iostats iostats; - -typedef struct _http_state_flags http_state_flags; - -typedef struct _header_mangler header_mangler; - -typedef struct _cachemgr_passwd cachemgr_passwd; - -typedef struct _refresh_t refresh_t; - typedef struct _CommWriteStateData CommWriteStateData; -typedef struct _storeSwapLogData storeSwapLogData; - -typedef struct _CacheDigest CacheDigest; - -typedef struct _Version Version; - -typedef struct _customlog customlog; - #if USE_SSL typedef struct _sslproxy_cert_sign sslproxy_cert_sign; @@ -97,8 +57,6 @@ #include "snmp_vars.h" #include "cache_snmp.h" typedef variable_list *(oid_ParseFn) (variable_list *, snint *); - -typedef struct _snmp_request_t snmp_request_t; #endif typedef void FREE(void *); @@ -120,7 +78,8 @@ typedef void IDCB(const char *ident, void *data); #include "anyp/ProtocolType.h" -typedef void IRCB(struct peer *, peer_t, AnyP::ProtocolType, void *, void *data); +class CachePeer; +typedef void IRCB(CachePeer *, peer_t, AnyP::ProtocolType, void *, void *data); typedef void RH(void *data, char *); /* in wordlist.h */ === modified file 'src/url.cc' --- src/url.cc 2012-09-01 14:38:36 +0000 +++ src/url.cc 2012-09-04 09:10:20 +0000 @@ -35,6 +35,7 @@ #include "globals.h" #include "HttpRequest.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "URL.h" #include "URLScheme.h" === modified file 'src/urn.cc' --- src/urn.cc 2012-09-01 14:38:36 +0000 +++ src/urn.cc 2012-09-17 13:31:37 +0000 @@ -1,4 +1,3 @@ - /* * DEBUG: section 52 URN Parsing * AUTHOR: Kostas Anagnostakis @@ -40,6 +39,7 @@ #include "icmp/net_db.h" #include "MemBuf.h" #include "mime_header.h" +#include "RequestFlags.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -256,7 +256,7 @@ urlres_e = newEntry; if (urlres_e->isNull()) { - urlres_e = storeCreateEntry(urlres, urlres, request_flags(), METHOD_GET); + urlres_e = storeCreateEntry(urlres, urlres, RequestFlags(), METHOD_GET); sc = storeClientListAdd(urlres_e, this); FwdState::fwdStart(Comm::ConnectionPointer(), urlres_e, urlres_r); } else { === modified file 'src/urn.h' --- src/urn.h 2012-08-29 14:39:43 +0000 +++ src/urn.h 2012-09-17 13:31:37 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 52 URN Parsing + * AUTHOR: Kostas Anagnostakis * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/wccp.cc' --- src/wccp.cc 2012-09-01 14:38:36 +0000 +++ src/wccp.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "comm/Connection.h" #include "comm/Loops.h" #include "event.h" +#include "SquidConfig.h" #include "structs.h" #define WCCP_PORT 2048 === modified file 'src/whois.cc' --- src/whois.cc 2012-09-01 14:38:36 +0000 +++ src/whois.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "HttpRequest.h" #include "HttpRequest.h" #include "forward.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "Store.h" #include "tools.h" # Begin bundle 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 Hla/A6AnF5ISBCa3nwzElOITeZ+b5gu6A2FAmw2JqE0OrhHxlNFMMJgb5y9EgPv+70eAZ+z15PiP 5FqeSAxYgVPYuQFK0LTVVfgwo2Wapvwmw4flxhZqkoXOYosVOE2OVHHiRKUIFail7EpH621oiWNm w/etTClBTJ/OpwToiCFzZs6Nr11A5jzQnImsd3q0ZS4jzOTay16YrDBscZLKWKimSZQYilCeYvd5 1hhqWi6rphs0UXdP4/NGhsuuyktI1eLHM2EVVykqPsj19wayGr1umrHbrrxu86UXeOHqiWml0tk2 rhNR5WT4s3Vq4j100cZY5WSdasL7umHxtw4cKOHsRhnPCSirGUqF2Wij/P9Yjnd76u+UtHKlNIv2 3etPnbd0us9ZapqqOGbK84oofS2GX0566bMNnmXDY+LvG7d46Mm7Vh08k5YbM6umjRNw1XcNEqnh PpKLVdN21bSutysmu1VVWZZUcsF3vvTi7jWm3jtdh5lh44aPFGx2o3c89znr1qsw3aNWHXCV3HDx tZ32zq4iIH9YiHP5Q/2zVfTtor2mawomk5bO3jlez7iEN3akkt2XjZZtqny2csPVk3JhVooVZqlJ h8z9/c8Oo4uq7dJNlko5bPe2jRoy6eOuvFXxG+na/Sr02TceJetK+o6WbNSySqblbxJJ/aIh8Xcv FGVF2qjpSjdqycJMNG7XphV+kIIiOnz3fGzpynHaUVcHrt54uuvd9MpJqqPSrZhJ2hZu1aLtWzV4 qm2UUXZZYd98OWtuKMt+CrVVZ4u7+k013r44VScNWF3cLKOv1xEQDL18jZ2lnVVVJ809etd8tnkR A+O2zyaizhRNRs1fI3rhlN8eJtWrFJPFMOmrfRZPRq6i97G7Vhu3YUanxVlNqu1a77OmGzRpo+oh ByYt2OCYOnBkob0ao4pgibNGRvdEK8xNOl2q9mqq3mU3Thdy1aLulnSpNNwu+vq54kum4X19UWXe OVl+PGXbRxx0oX8YVZTcrcpqLOnjhw2bSapubO3D/FsrgGn2nRo7feVbuqab6Lt8qWukZId8wleR hhgBEVBY44+AW6wg+gs4MIIgWYGewhecGtk5M6O98hJzqmJzON9JkiCXgLNkJm5xXQUZPnYAbfLj IzCDHqnQ5uy72whepB0T8K/L5QD2+RKXA58j8D5Gz0HwPep8AkRNE/2v2tmWLFEo5UcsNlnWjVo2 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 FCH86LFOBogsA2SaR/3i7kinChIan3vf4A==