2 * SQUID Web Proxy Cache http://www.squid-cache.org/
3 * ----------------------------------------------------------
5 * Squid is the result of efforts by numerous individuals from
6 * the Internet community; see the CONTRIBUTORS file for full
7 * details. Many organizations have provided support for Squid's
8 * development; see the SPONSORS file for full details. Squid is
9 * Copyrighted (C) 2001 by the Regents of the University of
10 * California; see the COPYRIGHT file for full details. Squid
11 * incorporates software developed and/or copyrighted by other
12 * sources; see the CREDITS file for full details.
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
29 #ifndef SQUID_STRUCTS_H
30 #define SQUID_STRUCTS_H
37 /* needed for the global config */
38 #include "HttpHeader.h"
41 #include "icp_opcode.h"
44 #include <openssl/ssl.h>
47 #define PEER_MULTICAST_SIBLINGS 1
49 struct acl_name_list
{
50 char name
[ACL_NAME_SZ
];
54 struct acl_deny_info_list
{
57 acl_name_list
*acl_list
;
58 acl_deny_info_list
*next
;
64 struct _header_mangler
{
65 acl_access
*access_list
;
73 struct _snmp_request_t
{
84 ACLChecklist
*acl_checklist
;
87 struct snmp_session session
;
132 #include "DelayConfig.h"
133 #include "ClientDelayConfig.h"
137 #include "icmp/IcmpConfig.h"
140 #include "HelperChildConfig.h"
142 /* forward decl for SquidConfig, see RemovalPolicy.h */
144 class CpuAffinityMap
;
145 class RemovalPolicySettings
;
149 /// Used for boolean enabled/disabled options with complex default logic.
150 /// Allows Squid to compute the right default after configuration.
151 /// Checks that not-yet-defined option values are not used.
153 // TODO: generalize to non-boolean option types
157 /// returns true iff enabled; asserts if the option has not been configured
158 operator void *() const; // TODO: use a fancy/safer version of the operator
160 /// enables or disables the option;
161 void configure(bool beSet
);
163 /// whether the option was enabled or disabled, by user or Squid
164 bool configured() const { return option
!= 0; }
167 enum { optUnspecified
= -1, optDisabled
= 0, optEnabled
= 1 };
168 int option
; ///< configured value or zero
174 /* These should be for the Store::Root instance.
175 * this needs pluggable parsing to be done smoothly.
181 YesNoNone memShared
; ///< whether the memory cache is shared among workers
189 int64_t readAheadGap
;
190 RemovalPolicySettings
*replPolicy
;
191 RemovalPolicySettings
*memPolicy
;
192 #if USE_HTTP_VIOLATIONS
196 time_t negativeDnsTtl
;
197 time_t positiveDnsTtl
;
198 time_t shutdownLifetime
;
199 time_t backgroundPingRate
;
209 time_t persistent_request
;
213 int icp_query
; /* msec */
214 int icp_query_max
; /* msec */
215 int icp_query_min
; /* msec */
216 int mcast_icp_query
; /* msec */
221 time_msec_t idns_retransmit
;
222 time_msec_t idns_query
;
226 size_t maxRequestHeaderSize
;
227 int64_t maxRequestBodySize
;
228 int64_t maxChunkedRequestBodySize
;
229 size_t maxRequestBufferSize
;
230 size_t maxReplyHeaderSize
;
231 acl_size_t
*ReplyBodySize
;
246 http_port_list
*http
;
249 https_port_list
*https
;
271 Ip::Address_list
*router
;
273 int forwarding_method
;
275 int assignment_method
;
286 char *as_whois_server
;
291 customlog
*accesslogs
;
301 char *visible_appname_string
;
302 char *effectiveGroup
;
324 HelperChildConfig dnsChildren
;
327 HelperChildConfig redirectChildren
;
328 time_t authenticateGCInterval
;
329 time_t authenticateTTL
;
330 time_t authenticateIpTTL
;
336 size_t appendDomainLen
;
339 char *mimeTablePathname
;
341 char *visibleHostname
;
342 char *uniqueHostname
;
343 wordlist
*hostnameAliases
;
355 Ip::Address udp_incoming
;
356 Ip::Address udp_outgoing
;
358 Ip::Address snmp_incoming
;
359 Ip::Address snmp_outgoing
;
361 /* FIXME INET6 : this should really be a CIDR value */
362 Ip::Address client_netmask
;
365 size_t udpMaxHitObjsz
;
366 wordlist
*hierarchy_stoplist
;
367 wordlist
*mcast_group_list
;
368 wordlist
*dns_nameservers
;
383 cachemgr_passwd
*passwd_list
;
386 int objectsPerBucket
;
387 int64_t avgObjectSize
;
388 int64_t maxObjectSize
;
389 int64_t minObjectSize
;
390 size_t maxInMemObjSize
;
412 int test_reachability
;
413 int half_closed_clients
;
415 #if USE_HTTP_VIOLATIONS
421 int redir_rewrites_host
;
423 int nonhierarchical_direct
;
424 int strip_query_terms
;
425 int redirector_bypass
;
426 int ignore_unknown_nameservers
;
430 #if USE_CACHE_DIGESTS
432 int digest_generation
;
435 int log_ip_on_direct
;
437 int vary_ignore_expire
;
438 int pipeline_prefetch
;
439 int surrogate_is_remote
;
440 int request_entities
;
441 int detect_broken_server_pconns
;
442 int balance_on_multiple_ip
;
443 int relaxed_header_parser
;
445 int allow_underscore
;
448 int httpd_suppress_version_string
;
449 int global_internal_static
;
452 #if FOLLOW_X_FORWARDED_FOR
453 int acl_uses_indirect_client
;
454 int delay_pool_uses_indirect_client
;
455 int log_uses_indirect_client
;
457 int tproxy_uses_indirect_client
;
459 #endif /* FOLLOW_X_FORWARDED_FOR */
461 int WIN32_IpAddrChangeMonitor
;
462 int memory_cache_first
;
463 int memory_cache_disk
;
466 int forward_max_tries
;
472 acl_access
*adapted_http
;
475 acl_access
*NeverDirect
;
476 acl_access
*AlwaysDirect
;
484 #if USE_HTTP_VIOLATIONS
485 acl_access
*brokenPosts
;
487 acl_access
*redirector
;
489 acl_address
*outgoing_address
;
493 acl_access
*htcp_clr
;
497 acl_access
*ssl_bump
;
499 #if FOLLOW_X_FORWARDED_FOR
500 acl_access
*followXFF
;
501 #endif /* FOLLOW_X_FORWARDED_FOR */
507 acl_deny_info_list
*denyInfoList
;
523 RefCount
<SwapDir
> *swapDirs
;
526 ///< number of disk processes required to support all cache_dirs
530 * I'm sick of having to keep doing this ..
532 #define INDEXSD(i) (Config.cacheSwap.swapDirs[(i)].getRaw())
538 char *errorDirectory
;
540 char *errorDefaultLanguage
;
541 int errorLogMissingLanguages
;
543 char *errorStylesheet
;
556 ClientDelayConfig ClientDelay
;
567 int max_open_disk_fds
;
569 acl_size_t
*rangeOffsetLimit
;
570 #if MULTICAST_MISS_STREAM
581 /* one access list per header type we know of */
582 header_mangler request_header_access
[HDR_ENUM_END
];
583 /* one access list per header type we know of */
584 header_mangler reply_header_access
[HDR_ENUM_END
];
587 #if USE_CACHE_DIGESTS
591 time_t rebuild_period
;
592 time_t rewrite_period
;
593 size_t swapout_chunk_size
;
594 int rebuild_chunk_percentage
;
600 int unclean_shutdown
;
605 wordlist
*ext_methods
;
612 char *store_dir_select_algorithm
;
613 int sleep_after_fork
; /* microseconds */
614 time_t minimum_expiry_time
; /* seconds */
615 external_acl
*externalAclHelperList
;
629 acl_access
*cert_error
;
636 int max_filedescriptors
;
638 CpuAffinityMap
*cpuAffinityMap
;
640 #if USE_LOADABLE_MODULES
641 wordlist
*loadable_module_names
;
644 int client_ip_max_connections
;
647 ssize_t packet_max
; ///< maximum size EDNS advertised for DNS replies.
651 SQUIDCEXTERN SquidConfig Config
;
653 struct SquidConfig2
{
656 int mangle_request_headers
;
658 uid_t effectiveUserID
;
659 gid_t effectiveGroupID
;
662 SQUIDCEXTERN SquidConfig2 Config2
;
664 struct _close_handler
{
690 /* ETag support is rudimantal;
691 * this struct is likely to change
692 * Note: "str" points to memory in HttpHeaderEntry (for now)
693 * so ETags should be used as tmp variables only (for now) */
696 const char *str
; /* quoted-string */
697 int weak
; /* true if it is a weak validator */
702 void *wrt_handle_data
;
704 dwrite_q
*write_q_tail
;
713 unsigned long *file_map
;
717 * Note: HttpBody is used only for messages with a small content that is
718 * known a priory (e.g., error messages).
728 #include "SquidString.h"
729 /* http header extention field */
731 class HttpHdrExtField
733 String name
; /* field-name from HTTP/1.1 (no column after name) */
734 String value
; /* field-value from HTTP/1.1 */
737 /* http cache control header field */
752 /* some fields can hold either time or etag specs (e.g. If-Range) */
755 ETag tag
; /* entity tag */
757 int valid
; /* true if struct is usable */
760 /* per field statistics */
762 class HttpHeaderFieldStat
766 HttpHeaderFieldStat() : aliveCount(0), seenCount(0), parsCount(0), errCount(0), repCount(0) {}
768 int aliveCount
; /* created but not destroyed (count) */
769 int seenCount
; /* #fields we've seen */
770 int parsCount
; /* #parsing attempts */
771 int errCount
; /* #pasring errors */
772 int repCount
; /* #repetitons */
775 /* compiled version of HttpHeaderFieldAttrs plus stats */
777 class HttpHeaderFieldInfo
781 HttpHeaderFieldInfo() : id (HDR_ACCEPT
), type (ftInvalid
) {}
786 HttpHeaderFieldStat stat
;
789 struct _http_state_flags
{
790 unsigned int proxying
:1;
791 unsigned int keepalive
:1;
792 unsigned int only_if_cached
:1;
793 unsigned int handling1xx
:1; ///< we are ignoring or forwarding 1xx response
794 unsigned int headers_parsed
:1;
795 unsigned int front_end_https
:2;
796 unsigned int originpeer
:1;
797 unsigned int keepalive_broken
:1;
798 unsigned int abuse_detected
:1;
799 unsigned int request_sent
:1;
800 unsigned int do_next_read
:1;
801 unsigned int consume_body_data
:1;
802 unsigned int chunked
:1; ///< reading a chunked response; TODO: rename
803 unsigned int chunked_request
:1; ///< writing a chunked request
804 unsigned int sentLastChunk
:1; ///< do not try to write last-chunk again
807 struct _ipcache_addrs
{
808 Ip::Address
*in_addrs
;
809 unsigned char *bad_mask
;
812 unsigned char badcount
;
815 struct _domain_ping
{
817 int do_ping
; /* boolean */
821 struct _domain_type
{
827 #if USE_CACHE_DIGESTS
829 /* statistics for cache digests and other hit "predictors" */
831 struct _cd_guess_stats
{
832 /* public, read-only */
837 int close_hits
; /* tmp, remove it later */
858 int n_keepalives_sent
;
859 int n_keepalives_recv
;
863 time_t last_connect_failure
;
864 time_t last_connect_probe
;
865 int logged_state
; /* so we can print dead/revived msgs */
866 int conn_open
; /* current opened connections */
871 int counts
[ICP_END
+1];
884 domain_ping
*peer_domain
;
885 domain_type
*typelist
;
889 unsigned int proxy_only
:1;
890 unsigned int no_query
:1;
891 unsigned int background_ping
:1;
892 unsigned int no_digest
:1;
893 unsigned int default_parent
:1;
894 unsigned int roundrobin
:1;
895 unsigned int weighted_roundrobin
:1;
896 unsigned int mcast_responder
:1;
897 unsigned int closest_only
:1;
900 unsigned int htcp_oldsquid
:1;
901 unsigned int htcp_no_clr
:1;
902 unsigned int htcp_no_purge_clr
:1;
903 unsigned int htcp_only_clr
:1;
904 unsigned int htcp_forward_clr
:1;
906 unsigned int no_netdb_exchange
:1;
908 unsigned int no_delay
:1;
910 unsigned int allow_miss
:1;
913 unsigned int userhash
:1;
915 unsigned int sourcehash
:1;
916 unsigned int originserver
:1;
917 unsigned int no_tproxy
:1;
918 #if PEER_MULTICAST_SIBLINGS
919 unsigned int mcast_siblings
:1;
927 double avg_n_members
;
929 int n_replies_expected
;
934 unsigned int count_event_pending
:1;
935 unsigned int counting
:1;
938 #if USE_CACHE_DIGESTS
944 int tcp_up
; /* 0 if a connect() fails */
946 Ip::Address addresses
[10];
954 double load_multiplier
;
955 double load_factor
; /* normalized weight value */
960 double load_multiplier
;
961 double load_factor
; /* normalized weight value */
966 double load_multiplier
;
967 double load_factor
; /* normalized weight value */
970 char *login
; /* Proxy authorization */
971 time_t connect_timeout
;
972 int connect_fail_limit
;
974 char *domain
; /* Forced domain */
989 SSL_SESSION
*sslSession
;
996 struct _net_db_name
{
997 hash_link hash
; /* must be first */
999 netdbEntry
*net_db_entry
;
1002 struct _net_db_peer
{
1003 const char *peername
;
1009 struct _netdbEntry
{
1010 hash_link hash
; /* must be first */
1011 char network
[MAX_IPSTRLEN
];
1016 time_t next_ping_time
;
1017 time_t last_use_time
;
1027 enum { histSize
= 16 };
1032 int read_hist
[histSize
];
1034 int write_hist
[histSize
];
1041 struct request_flags
{
1042 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),spoof_client_ip(0),internal(0),internalclient(0),must_keepalive(0),chunked_reply(0),stream_error(0),sslBumped(0),destinationIPLookedUp_(0) {
1043 #if USE_HTTP_VIOLATIONS
1046 #if FOLLOW_X_FORWARDED_FOR
1047 done_follow_x_forwarded_for
= 0;
1048 #endif /* FOLLOW_X_FORWARDED_FOR */
1051 unsigned int range
:1;
1052 unsigned int nocache
:1;
1054 unsigned int auth
:1;
1055 unsigned int cachable
:1;
1056 unsigned int hierarchical
:1;
1057 unsigned int loopdetect
:1;
1058 unsigned int proxy_keepalive
:1;
1059 unsigned int proxying
:
1060 1; /* this should be killed, also in httpstateflags */
1061 unsigned int refresh
:1;
1062 unsigned int redirected
:1;
1063 unsigned int need_validation
:1;
1064 unsigned int fail_on_validation_err
:1; ///< whether we should fail if validation fails
1065 unsigned int stale_if_hit
:1; ///< reply is stale if it is a hit
1066 #if USE_HTTP_VIOLATIONS
1067 unsigned int nocache_hack
:1; /* for changing/ignoring no-cache requests */
1069 unsigned int accelerated
:1;
1070 unsigned int ignore_cc
:1;
1071 unsigned int intercepted
:1; /**< transparently intercepted request */
1072 unsigned int spoof_client_ip
:1; /**< spoof client ip if possible */
1073 unsigned int internal
:1;
1074 unsigned int internalclient
:1;
1075 unsigned int must_keepalive
:1;
1076 unsigned int connection_auth
:1; /** Request wants connection oriented auth */
1077 unsigned int connection_auth_disabled
:1; /** Connection oriented auth can not be supported */
1078 unsigned int connection_proxy_auth
:1; /** Request wants connection oriented auth */
1079 unsigned int pinned
:1; /* Request sent on a pinned connection */
1080 unsigned int auth_sent
:1; /* Authentication forwarded */
1081 unsigned int no_direct
:1; /* Deny direct forwarding unless overriden by always_direct. Used in accelerator mode */
1082 unsigned int chunked_reply
:1; /**< Reply with chunked transfer encoding */
1083 unsigned int stream_error
:1; /**< Whether stream error has occured */
1084 unsigned int sslBumped
:1; /**< ssl-bumped request*/
1086 // When adding new flags, please update cloneAdaptationImmune() as needed.
1088 bool resetTCP() const;
1090 void clearResetTCP();
1091 void destinationIPLookupCompleted();
1092 bool destinationIPLookedUp() const;
1094 // returns a partial copy of the flags that includes only those flags
1095 // that are safe for a related (e.g., ICAP-adapted) request to inherit
1096 request_flags
cloneAdaptationImmune() const;
1098 #if FOLLOW_X_FORWARDED_FOR
1099 unsigned int done_follow_x_forwarded_for
;
1100 #endif /* FOLLOW_X_FORWARDED_FOR */
1103 unsigned int reset_tcp
:1;
1104 unsigned int destinationIPLookedUp_
:1;
1110 struct _link_list
*next
;
1113 struct _cachemgr_passwd
{
1116 cachemgr_passwd
*next
;
1120 const char *pattern
;
1121 regex_t compiled_pattern
;
1128 unsigned int icase
:1;
1129 unsigned int refresh_ims
:1;
1130 unsigned int store_stale
:1;
1131 #if USE_HTTP_VIOLATIONS
1132 unsigned int override_expire
:1;
1133 unsigned int override_lastmod
:1;
1134 unsigned int reload_into_ims
:1;
1135 unsigned int ignore_reload
:1;
1136 unsigned int ignore_no_cache
:1;
1137 unsigned int ignore_no_store
:1;
1138 unsigned int ignore_must_revalidate
:1;
1139 unsigned int ignore_private
:1;
1140 unsigned int ignore_auth
:1;
1147 * "very generic" histogram;
1148 * see important comments on hbase_f restrictions in StatHist.c
1157 hbase_f
*val_in
; /* e.g., log() for log-based histogram */
1158 hbase_f
*val_out
; /* e.g., exp() for log based histogram */
1162 * if you add a field to StatCounters,
1163 * you MUST sync statCountersInitSpecial, statCountersClean, and statCountersCopy
1166 struct _StatCounters
{
1177 kb_t hit_kbytes_out
;
1178 StatHist miss_svc_time
;
1179 StatHist nm_svc_time
;
1180 StatHist nh_svc_time
;
1181 StatHist hit_svc_time
;
1182 StatHist all_svc_time
;
1192 } all
, http
, ftp
, other
;
1205 int replies_dropped
;
1212 StatHist query_svc_time
;
1213 StatHist reply_svc_time
;
1238 #if USE_CACHE_DIGESTS
1240 cd_guess_stats guess
;
1243 StatHist on_xition_count
;
1250 unsigned long int select_loops
;
1255 struct timeval timestamp
;
1256 StatHist comm_icp_incoming
;
1257 StatHist comm_dns_incoming
;
1258 StatHist comm_http_incoming
;
1259 StatHist select_fds_hist
;
1284 int aborted_requests
;
1293 /* per header statistics */
1295 struct _HttpHeaderStat
{
1297 HttpHeaderMask
*owner_mask
;
1299 StatHist hdrUCountDistr
;
1300 StatHist fieldTypeDistr
;
1301 StatHist ccTypeDistr
;
1302 StatHist scTypeDistr
;
1308 int busyDestroyedCount
;
1312 struct _CacheDigest
{
1313 /* public, read-only */
1314 char *mask
; /* bit mask */
1315 int mask_size
; /* mask size in bytes */
1316 int capacity
; /* expected maximum for .count, not a hard limit */
1317 int bits_per_entry
; /* number of bits allocated for each entry from capacity */
1318 int count
; /* number of digested entries */
1319 int del_count
; /* number of deletions performed so far */
1323 struct _store_rebuild_data
{
1324 int objcount
; /* # objects successfully reloaded */
1325 int expcount
; /* # objects expired */
1326 int scancount
; /* # entries scanned or read from state file */
1327 int clashcount
; /* # swapfile clashes avoided */
1328 int dupcount
; /* # duplicates purged */
1329 int cancelcount
; /* # SWAP_LOG_DEL objects purged */
1330 int invalid
; /* # bad lines */
1331 int badflags
; /* # bad e->flags */
1339 #include "log/Formats.h"
1343 logformat
*logFormat
;
1346 Log::Format::log_type type
;
1349 #endif /* SQUID_STRUCTS_H */