* we do NOT want the indirect client address to be tested here.
*/
ACLFilledChecklist ch(Config.accessList.miss, request, NULL);
+ ch.al = al;
ch.src_addr = request->client_addr;
+ ch.syncAle(request, nullptr);
if (ch.fastCheck().denied()) {
err_type page_id;
page_id = aclGetDenyInfoPage(&Config.denyInfoList, AclMatchedName, 1);
bool retriable = checkRetriable();
if (!retriable && Config.accessList.serverPconnForNonretriable) {
ACLFilledChecklist ch(Config.accessList.serverPconnForNonretriable, request, NULL);
+ ch.al = al;
+ ch.syncAle(request, nullptr);
retriable = ch.fastCheck().allowed();
}
// always call shared pool first because we need to close an idle
if (Config.accessList.spoof_client_ip) {
ACLFilledChecklist *checklist = new ACLFilledChecklist(Config.accessList.spoof_client_ip, this, clientConnection->rfc931);
checklist->al = al;
+ checklist->syncAle(this, nullptr);
flags.spoofClientIp = checklist->fastCheck().allowed();
delete checklist;
} else
typedef void STABH(void *);
class store_client;
+class PeerSelector;
class MemObject
{
struct timeval start_ping;
IRCB *ping_reply_callback;
- void *ircb_data;
+ PeerSelector *ircb_data;
struct {
STABH *callback;
Note::match(HttpRequest *request, HttpReply *reply, const AccessLogEntry::Pointer &al, SBuf &matched)
{
ACLFilledChecklist ch(nullptr, request, nullptr);
+ ch.al = al;
ch.reply = reply;
+ ch.syncAle(request, nullptr);
if (reply)
HTTPMSGLOCK(ch.reply);
} else {
// make sure the ALE has as much data as possible
if (requiresAle())
- checklist->syncAle();
+ checklist->verifyAle();
// have to cast because old match() API is missing const
result = const_cast<ACL*>(this)->match(checklist);
#include <stack>
#include <vector>
+class HttpRequest;
+
/// ACL checklist callback
typedef void ACLCB(allow_t, void *);
virtual bool hasRequest() const = 0;
virtual bool hasReply() const = 0;
virtual bool hasAle() const = 0;
- virtual void syncAle() const = 0;
+ /// assigns uninitialized adapted_request and url ALE components
+ virtual void syncAle(HttpRequest *adaptedRequest, const char *logUri) const = 0;
+ /// warns if there are uninitialized ALE components and fills them
+ virtual void verifyAle() const = 0;
/// change the current ACL list
/// \return a pointer to the old list value (may be nullptr)
}
void
-ACLFilledChecklist::syncAle() const
+ACLFilledChecklist::verifyAle() const
{
// make sure the ALE fields used by Format::assemble to
// fill the old external_acl_type codes are set if any
if (request) {
if (!al->request) {
showDebugWarning("HttpRequest object");
+ // XXX: al->request should be original,
+ // but the request may be already adapted
al->request = request;
HTTPMSGLOCK(al->request);
}
if (al->url.isEmpty()) {
showDebugWarning("URL");
+ // XXX: al->url should be the request URL from client,
+ // but request->url may be different (e.g.,redirected)
al->url = request->url.absolute();
}
}
#endif
}
+void
+ACLFilledChecklist::syncAle(HttpRequest *adaptedRequest, const char *logUri) const
+{
+ if (!al)
+ return;
+ if (!al->adapted_request) {
+ al->adapted_request = adaptedRequest;
+ HTTPMSGLOCK(al->adapted_request);
+ }
+ if (al->url.isEmpty())
+ al->url = logUri;
+}
+
ConnStateData *
ACLFilledChecklist::conn() const
{
virtual bool hasRequest() const { return request != NULL; }
virtual bool hasReply() const { return reply != NULL; }
virtual bool hasAle() const { return al != NULL; }
- virtual void syncAle() const;
+ virtual void syncAle(HttpRequest *adaptedRequest, const char *logUri) const;
+ virtual void verifyAle() const;
public:
Ip::Address src_addr;
if ((acl_checklist->reply = filter.reply))
HTTPMSGLOCK(acl_checklist->reply);
acl_checklist->al = filter.al;
+ acl_checklist->syncAle(filter.request, nullptr);
acl_checklist->nonBlockingCheck(AccessCheckCallbackWrapper, this);
return;
}
#include "HttpRequest.h"
#include "mgr/Registration.h"
#include "neighbors.h"
+#include "PeerSelectState.h"
#include "SquidConfig.h"
#include "Store.h"
#include "URL.h"
}
CachePeer *
-carpSelectParent(HttpRequest * request)
+carpSelectParent(PeerSelector *ps)
{
+ assert(ps);
+ HttpRequest *request = ps->request;
+
int k;
CachePeer *p = NULL;
CachePeer *tp;
debugs(39, 3, "carpSelectParent: key=" << key << " name=" << tp->name << " combined_hash=" << combined_hash <<
" score=" << std::setprecision(0) << score);
- if ((score > high_score) && peerHTTPOkay(tp, request)) {
+ if ((score > high_score) && peerHTTPOkay(tp, ps)) {
p = tp;
high_score = score;
}
#define SQUID_CARP_H_
class CachePeer;
-class HttpRequest;
+class PeerSelector;
void carpInit(void);
-CachePeer *carpSelectParent(HttpRequest *);
+CachePeer *carpSelectParent(PeerSelector *);
#endif /* SQUID_CARP_H_ */
al->adapted_request = request;
HTTPMSGLOCK(al->adapted_request);
}
+ // no need checklist.syncAle(): already synced
+ checklist.al = al;
accessLogLog(al, &checklist);
bool updatePerformanceCounters = true;
if (Config.accessList.stats_collection) {
ACLFilledChecklist statsCheck(Config.accessList.stats_collection, request, NULL);
+ statsCheck.al = al;
if (al->reply) {
statsCheck.reply = al->reply;
HTTPMSGLOCK(statsCheck.reply);
bool allowDomainMismatch = false;
if (Config.ssl_client.cert_error) {
ACLFilledChecklist check(Config.ssl_client.cert_error, request, dash_str);
+ check.al = http->al;
check.sslErrors = new Security::CertErrors(Security::CertError(SQUID_X509_V_ERR_DOMAIN_MISMATCH, srvCert));
+ check.syncAle(request, http->log_uri);
allowDomainMismatch = check.fastCheck().allowed();
delete check.sslErrors;
check.sslErrors = NULL;
{
if (conn->mayTunnelUnsupportedProto()) {
ACLFilledChecklist checklist(Config.accessList.on_unsupported_protocol, request.getRaw(), nullptr);
+ checklist.al = (context && context->http) ? context->http->al : nullptr;
checklist.requestErrorType = requestError;
checklist.src_addr = conn->clientConnection->remote;
checklist.my_addr = conn->clientConnection->local;
checklist.conn(conn);
+ ClientHttpRequest *http = context ? context->http : nullptr;
+ const char *log_uri = http ? http->log_uri : nullptr;
+ checklist.syncAle(request.getRaw(), log_uri);
allow_t answer = checklist.fastCheck();
if (answer.allowed() && answer.kind == 1) {
debugs(33, 3, "Request will be tunneled to server");
HTTPMSGUNLOCK(acl_checklist->al->request);
acl_checklist->al->request = request;
HTTPMSGLOCK(acl_checklist->al->request);
+ Http::StreamPointer context = pipeline.front();
+ ClientHttpRequest *http = context ? context->http : nullptr;
+ const char *log_uri = http ? http->log_uri : nullptr;
+ acl_checklist->syncAle(request, log_uri);
acl_checklist->nonBlockingCheck(httpsSslBumpAccessCheckDone, this);
#else
fatal("FATAL: SSL-Bump requires --with-openssl");
acl_checklist->banAction(allow_t(ACCESS_ALLOWED, Ssl::bumpNone));
acl_checklist->banAction(allow_t(ACCESS_ALLOWED, Ssl::bumpClientFirst));
acl_checklist->banAction(allow_t(ACCESS_ALLOWED, Ssl::bumpServerFirst));
+ const char *log_uri = http ? http->log_uri : nullptr;
+ acl_checklist->syncAle(sslServerBump->request.getRaw(), log_uri);
acl_checklist->nonBlockingCheck(httpsSslBumpStep2AccessCheckDone, this);
return;
}
{
checklist.setRequest(http->request);
checklist.al = http->al;
+ checklist.syncAle(http->request, http->log_uri);
// TODO: If http->getConn is always http->request->clientConnectionManager,
// then call setIdent() inside checklist.setRequest(). Otherwise, restore
// Set appropriate MARKs and CONNMARKs if needed.
if (getConn() && Comm::IsConnOpen(getConn()->clientConnection)) {
ACLFilledChecklist ch(nullptr, request, nullptr);
+ ch.al = calloutContext->http->al;
ch.src_addr = request->client_addr;
ch.my_addr = request->my_addr;
+ ch.syncAle(request, log_uri);
if (!calloutContext->toClientMarkingDone) {
calloutContext->toClientMarkingDone = true;
ACLFilledChecklist ch(nullptr, nullptr, nullptr);
ch.src_addr = conn->remote;
ch.my_addr = conn->local;
+ ch.al = al;
accessLogLog(al, &ch);
}
// check whether the 1xx response forwarding is allowed by squid.conf
if (Config.accessList.reply) {
ACLFilledChecklist ch(Config.accessList.reply, originalRequest().getRaw());
+ ch.al = fwd->al;
ch.reply = reply;
+ ch.syncAle(originalRequest().getRaw(), nullptr);
HTTPMSGLOCK(ch.reply);
if (!ch.fastCheck().allowed()) { // TODO: support slow lookups?
debugs(11, 3, HERE << "ignoring denied 1xx");
}
ACLFilledChecklist ch(Config.accessList.brokenPosts, originalRequest().getRaw());
+ ch.al = fwd->al;
+ ch.syncAle(originalRequest().getRaw(), nullptr);
if (!ch.fastCheck().allowed()) {
debugs(11, 5, HERE << "didn't match brokenPosts");
return false;
#include "mgr/Registration.h"
#include "mime_header.h"
#include "neighbors.h"
+#include "PeerSelectState.h"
#include "SquidConfig.h"
#include "SquidTime.h"
#include "Store.h"
}
CachePeer *
-netdbClosestParent(HttpRequest * request)
+netdbClosestParent(PeerSelector *ps)
{
#if USE_ICMP
+ assert(ps);
+ HttpRequest *request = ps->request;
+
CachePeer *p = NULL;
netdbEntry *n;
const ipcache_addrs *ia;
if (neighborType(p, request->url) != PEER_PARENT)
continue;
- if (!peerHTTPOkay(p, request)) /* not allowed */
+ if (!peerHTTPOkay(p, ps)) /* not allowed */
continue;
return p;
class CachePeer;
class HttpRequest;
class netdbEntry;
+class PeerSelector;
class StoreEntry;
class URL;
void netdbExchangeStart(void *);
void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double);
-CachePeer *netdbClosestParent(HttpRequest *);
+CachePeer *netdbClosestParent(PeerSelector *);
void netdbHostData(const char *host, int *samp, int *rtt, int *hops);
#endif /* ICMP_NET_DB_H */
/* count mcast group peers every 15 minutes */
#define MCAST_COUNT_RATE 900
-bool peerAllowedToUse(const CachePeer *, HttpRequest *);
-static int peerWouldBePinged(const CachePeer *, HttpRequest *);
+bool peerAllowedToUse(const CachePeer *, PeerSelector *);
+static int peerWouldBePinged(const CachePeer *, PeerSelector *);
static void neighborRemove(CachePeer *);
static void neighborAlive(CachePeer *, const MemObject *, const icp_common_t *);
#if USE_HTCP
* \return Whether it is appropriate to fetch REQUEST from PEER.
*/
bool
-peerAllowedToUse(const CachePeer * p, HttpRequest * request)
+peerAllowedToUse(const CachePeer * p, PeerSelector * ps)
{
-
+ assert(ps);
+ HttpRequest *request = ps->request;
assert(request != NULL);
if (neighborType(p, request->url) == PEER_SIBLING) {
return true;
ACLFilledChecklist checklist(p->access, request, NULL);
-
+ checklist.al = ps->al;
+ checklist.syncAle(request, nullptr);
return checklist.fastCheck().allowed();
}
/* Return TRUE if it is okay to send an ICP request to this CachePeer. */
static int
-peerWouldBePinged(const CachePeer * p, HttpRequest * request)
+peerWouldBePinged(const CachePeer * p, PeerSelector * ps)
{
+ assert(ps);
+ HttpRequest *request = ps->request;
+
if (p->icp.port == 0)
return 0;
if (!request->flags.hierarchical)
return 0;
- if (!peerAllowedToUse(p, request))
+ if (!peerAllowedToUse(p, ps))
return 0;
/* Ping dead peers every timeout interval */
/* Return TRUE if it is okay to send an HTTP request to this CachePeer. */
int
-peerHTTPOkay(const CachePeer * p, HttpRequest * request)
+peerHTTPOkay(const CachePeer * p, PeerSelector * ps)
{
if (!peerCanOpenMore(p) && !peerHasConnAvailable(p))
return 0;
- if (!peerAllowedToUse(p, request))
+ if (!peerAllowedToUse(p, ps))
return 0;
if (!neighborUp(p))
}
int
-neighborsCount(HttpRequest * request)
+neighborsCount(PeerSelector *ps)
{
CachePeer *p = NULL;
int count = 0;
for (p = Config.peers; p; p = p->next)
- if (peerWouldBePinged(p, request))
+ if (peerWouldBePinged(p, ps))
++count;
debugs(15, 3, "neighborsCount: " << count);
}
CachePeer *
-getFirstUpParent(HttpRequest * request)
+getFirstUpParent(PeerSelector *ps)
{
+ assert(ps);
+ HttpRequest *request = ps->request;
+
CachePeer *p = NULL;
for (p = Config.peers; p; p = p->next) {
if (neighborType(p, request->url) != PEER_PARENT)
continue;
- if (!peerHTTPOkay(p, request))
+ if (!peerHTTPOkay(p, ps))
continue;
break;
}
CachePeer *
-getRoundRobinParent(HttpRequest * request)
+getRoundRobinParent(PeerSelector *ps)
{
+ assert(ps);
+ HttpRequest *request = ps->request;
+
CachePeer *p;
CachePeer *q = NULL;
if (neighborType(p, request->url) != PEER_PARENT)
continue;
- if (!peerHTTPOkay(p, request))
+ if (!peerHTTPOkay(p, ps))
continue;
if (p->weight == 0)
}
CachePeer *
-getWeightedRoundRobinParent(HttpRequest * request)
+getWeightedRoundRobinParent(PeerSelector *ps)
{
+ assert(ps);
+ HttpRequest *request = ps->request;
+
CachePeer *p;
CachePeer *q = NULL;
int weighted_rtt;
if (neighborType(p, request->url) != PEER_PARENT)
continue;
- if (!peerHTTPOkay(p, request))
+ if (!peerHTTPOkay(p, ps))
continue;
if (q && q->rr_count < p->rr_count)
}
CachePeer *
-getDefaultParent(HttpRequest * request)
+getDefaultParent(PeerSelector *ps)
{
+ assert(ps);
+ HttpRequest *request = ps->request;
+
CachePeer *p = NULL;
for (p = Config.peers; p; p = p->next) {
if (!p->options.default_parent)
continue;
- if (!peerHTTPOkay(p, request))
+ if (!peerHTTPOkay(p, ps))
continue;
debugs(15, 3, "getDefaultParent: returning " << p->host);
neighborsUdpPing(HttpRequest * request,
StoreEntry * entry,
IRCB * callback,
- void *callback_data,
+ PeerSelector *ps,
int *exprep,
int *timeout)
{
mem->ping_reply_callback = callback;
- mem->ircb_data = callback_data;
+ mem->ircb_data = ps;
reqnum = icpSetCacheKey((const cache_key *)entry->key);
debugs(15, 5, "neighborsUdpPing: Peer " << p->host);
- if (!peerWouldBePinged(p, request))
+ if (!peerWouldBePinged(p, ps))
continue; /* next CachePeer */
++peers_pinged;
/* lookup the digest of a given CachePeer */
lookup_t
-peerDigestLookup(CachePeer * p, HttpRequest * request)
+peerDigestLookup(CachePeer * p, PeerSelector * ps)
{
#if USE_CACHE_DIGESTS
+ assert(ps);
+ HttpRequest *request = ps->request;
const cache_key *key = request ? storeKeyPublicByRequest(request) : NULL;
assert(p);
assert(request);
if (!p->digest) {
debugs(15, 5, "peerDigestLookup: gone!");
return LOOKUP_NONE;
- } else if (!peerHTTPOkay(p, request)) {
+ } else if (!peerHTTPOkay(p, ps)) {
debugs(15, 5, "peerDigestLookup: !peerHTTPOkay");
return LOOKUP_NONE;
} else if (!p->digest->flags.needed) {
/* select best CachePeer based on cache digests */
CachePeer *
-neighborsDigestSelect(HttpRequest * request)
+neighborsDigestSelect(PeerSelector *ps)
{
CachePeer *best_p = NULL;
#if USE_CACHE_DIGESTS
+ assert(ps);
+ HttpRequest *request = ps->request;
int best_rtt = 0;
int choice_count = 0;
if (i == 1)
first_ping = p;
- lookup = peerDigestLookup(p, request);
+ lookup = peerDigestLookup(p, ps);
if (lookup == LOOKUP_NONE)
continue;
* * from being used
*/
static int
-ignoreMulticastReply(CachePeer * p, MemObject * mem)
+ignoreMulticastReply(CachePeer * p, PeerSelector * ps)
{
if (p == NULL)
return 0;
if (!p->options.mcast_responder)
return 0;
- if (peerHTTPOkay(p, mem->request.getRaw()))
+ if (peerHTTPOkay(p, ps))
return 0;
return 1;
return;
}
+ if (!mem->ircb_data) {
+ debugs(12, DBG_IMPORTANT, "BUG: missing ICP callback data for " << *entry);
+ neighborCountIgnored(p);
+ return;
+ }
+
debugs(15, 3, "neighborsUdpAck: " << opcode_d << " for '" << storeKeyText(key) << "' from " << (p ? p->host : "source") << " ");
if (p) {
ntype = neighborType(p, mem->request->url);
}
- if (ignoreMulticastReply(p, mem)) {
+ if (ignoreMulticastReply(p, mem->ircb_data)) {
neighborCountIgnored(p);
} else if (opcode == ICP_MISS) {
if (p == NULL) {
return;
}
+ if (!mem->ircb_data) {
+ debugs(12, DBG_IMPORTANT, "BUG: missing HTCP callback data for " << *e);
+ neighborCountIgnored(p);
+ return;
+ }
+
if (p) {
ntype = neighborType(p, mem->request->url);
neighborUpdateRtt(p, mem);
}
- if (ignoreMulticastReply(p, mem)) {
+ if (ignoreMulticastReply(p, mem->ircb_data)) {
neighborCountIgnored(p);
return;
}
class CachePeer;
class StoreEntry;
class URL;
+class PeerSelector;
CachePeer *getFirstPeer(void);
-CachePeer *getFirstUpParent(HttpRequest *);
+CachePeer *getFirstUpParent(PeerSelector *);
CachePeer *getNextPeer(CachePeer *);
-CachePeer *getSingleParent(HttpRequest *);
-int neighborsCount(HttpRequest *);
+CachePeer *getSingleParent(PeerSelector *);
+int neighborsCount(PeerSelector *);
int neighborsUdpPing(HttpRequest *,
StoreEntry *,
IRCB * callback,
- void *data,
+ PeerSelector *ps,
int *exprep,
int *timeout);
void neighborAddAcl(const char *, const char *);
#endif
CachePeer *peerFindByName(const char *);
CachePeer *peerFindByNameAndPort(const char *, unsigned short);
-CachePeer *getDefaultParent(HttpRequest * request);
-CachePeer *getRoundRobinParent(HttpRequest * request);
-CachePeer *getWeightedRoundRobinParent(HttpRequest * request);
+CachePeer *getDefaultParent(PeerSelector*);
+CachePeer *getRoundRobinParent(PeerSelector*);
+CachePeer *getWeightedRoundRobinParent(PeerSelector*);
void peerClearRRStart(void);
void peerClearRR(void);
-lookup_t peerDigestLookup(CachePeer * p, HttpRequest * request);
-CachePeer *neighborsDigestSelect(HttpRequest * request);
+lookup_t peerDigestLookup(CachePeer * p, PeerSelector *);
+CachePeer *neighborsDigestSelect(PeerSelector *);
void peerNoteDigestLookup(HttpRequest * request, CachePeer * p, lookup_t lookup);
void peerNoteDigestGone(CachePeer * p);
int neighborUp(const CachePeer * e);
void peerConnectFailed(CachePeer *);
void peerConnectSucceded(CachePeer *);
void dump_peer_options(StoreEntry *, CachePeer *);
-int peerHTTPOkay(const CachePeer *, HttpRequest *);
+int peerHTTPOkay(const CachePeer *, PeerSelector *);
// TODO: Consider moving this method to CachePeer class.
/// \returns the effective connect timeout for the given peer
}
static int
-peerSelectIcpPing(HttpRequest * request, int direct, StoreEntry * entry)
+peerSelectIcpPing(PeerSelector *ps, int direct, StoreEntry * entry)
{
+ assert(ps);
+ HttpRequest *request = ps->request;
+
int n;
assert(entry);
assert(entry->ping_status == PING_NONE);
if (direct != DIRECT_NO)
return 0;
- n = neighborsCount(request);
+ n = neighborsCount(ps);
debugs(44, 3, "counted " << n << " neighbors");
ACLFilledChecklist *ch = new ACLFilledChecklist(Config.accessList.AlwaysDirect, request, NULL);
ch->al = al;
acl_checklist = ch;
+ acl_checklist->syncAle(request, nullptr);
acl_checklist->nonBlockingCheck(CheckAlwaysDirectDone, this);
return;
} else if (never_direct == ACCESS_DUNNO) {
ACLFilledChecklist *ch = new ACLFilledChecklist(Config.accessList.NeverDirect, request, NULL);
ch->al = al;
acl_checklist = ch;
+ acl_checklist->syncAle(request, nullptr);
acl_checklist->nonBlockingCheck(CheckNeverDirectDone, this);
return;
} else if (request->flags.noDirect) {
resolveSelected();
}
-bool peerAllowedToUse(const CachePeer * p, HttpRequest * request);
+bool peerAllowedToUse(const CachePeer *, PeerSelector*);
/// Selects a pinned connection if it exists, is valid, and is allowed.
void
return;
CachePeer *pear = request->pinnedConnection()->pinnedPeer();
if (Comm::IsConnOpen(request->pinnedConnection()->validatePinnedConnection(request, pear))) {
- const bool usePinned = pear ? peerAllowedToUse(pear, request) : (direct != DIRECT_NO);
+ const bool usePinned = pear ? peerAllowedToUse(pear, this) : (direct != DIRECT_NO);
if (usePinned) {
addSelection(pear, PINNED);
if (entry)
}
#if USE_CACHE_DIGESTS
- if ((p = neighborsDigestSelect(request))) {
+ if ((p = neighborsDigestSelect(this))) {
if (neighborType(p, request->url) == PEER_PARENT)
code = CD_PARENT_HIT;
else
code = CD_SIBLING_HIT;
} else
#endif
- if ((p = netdbClosestParent(request))) {
+ if ((p = netdbClosestParent(this))) {
code = CLOSEST_PARENT;
- } else if (peerSelectIcpPing(request, direct, entry)) {
+ } else if (peerSelectIcpPing(this, direct, entry)) {
debugs(44, 3, "Doing ICP pings");
ping.start = current_time;
ping.n_sent = neighborsUdpPing(request,
if (direct == DIRECT_YES)
return;
- if ((p = peerSourceHashSelectParent(request))) {
+ if ((p = peerSourceHashSelectParent(this))) {
code = SOURCEHASH_PARENT;
#if USE_AUTH
- } else if ((p = peerUserHashSelectParent(request))) {
+ } else if ((p = peerUserHashSelectParent(this))) {
code = USERHASH_PARENT;
#endif
- } else if ((p = carpSelectParent(request))) {
+ } else if ((p = carpSelectParent(this))) {
code = CARP;
- } else if ((p = getRoundRobinParent(request))) {
+ } else if ((p = getRoundRobinParent(this))) {
code = ROUNDROBIN_PARENT;
- } else if ((p = getWeightedRoundRobinParent(request))) {
+ } else if ((p = getWeightedRoundRobinParent(this))) {
code = ROUNDROBIN_PARENT;
- } else if ((p = getFirstUpParent(request))) {
+ } else if ((p = getFirstUpParent(this))) {
code = FIRSTUP_PARENT;
- } else if ((p = getDefaultParent(request))) {
+ } else if ((p = getDefaultParent(this))) {
code = DEFAULT_PARENT;
}
if (neighborType(p, request->url) != PEER_PARENT)
continue;
- if (!peerHTTPOkay(p, request))
+ if (!peerHTTPOkay(p, this))
continue;
addSelection(p, ANY_OLD_PARENT);
* simply are not configured to handle the request.
*/
/* Add default parent as a last resort */
- if ((p = getDefaultParent(request))) {
+ if ((p = getDefaultParent(this))) {
addSelection(p, DEFAULT_PARENT);
}
}
if (p && request)
peerNoteDigestLookup(request, p,
- peerDigestLookup(p, request, entry));
+ peerDigestLookup(p, this));
#endif
#include "HttpRequest.h"
#include "mgr/Registration.h"
#include "neighbors.h"
+#include "PeerSelectState.h"
#include "SquidConfig.h"
#include "Store.h"
}
CachePeer *
-peerSourceHashSelectParent(HttpRequest * request)
+peerSourceHashSelectParent(PeerSelector *ps)
{
int k;
const char *c;
if (n_sourcehash_peers == 0)
return NULL;
+ assert(ps);
+ HttpRequest *request = ps->request;
+
key = request->client_addr.toStr(ntoabuf, sizeof(ntoabuf));
/* calculate hash key */
debugs(39, 3, "peerSourceHashSelectParent: " << tp->name << " combined_hash " << combined_hash <<
" score " << std::setprecision(0) << score);
- if ((score > high_score) && peerHTTPOkay(tp, request)) {
+ if ((score > high_score) && peerHTTPOkay(tp, ps)) {
p = tp;
high_score = score;
}
#define SQUID_PEER_SOURCEHASH_H_
class CachePeer;
-class HttpRequest;
+class PeerSelector;
void peerSourceHashInit(void);
-CachePeer * peerSourceHashSelectParent(HttpRequest * request);
+CachePeer * peerSourceHashSelectParent(PeerSelector*);
#endif /* SQUID_PEER_SOURCEHASH_H_ */
#include "HttpRequest.h"
#include "mgr/Registration.h"
#include "neighbors.h"
+#include "PeerSelectState.h"
#include "SquidConfig.h"
#include "Store.h"
}
CachePeer *
-peerUserHashSelectParent(HttpRequest * request)
+peerUserHashSelectParent(PeerSelector *ps)
{
int k;
const char *c;
if (n_userhash_peers == 0)
return NULL;
+ assert(ps);
+ HttpRequest *request = ps->request;
+
if (request->auth_user_request != NULL)
key = request->auth_user_request->username();
debugs(39, 3, "peerUserHashSelectParent: " << tp->name << " combined_hash " << combined_hash <<
" score " << std::setprecision(0) << score);
- if ((score > high_score) && peerHTTPOkay(tp, request)) {
+ if ((score > high_score) && peerHTTPOkay(tp, ps)) {
p = tp;
high_score = score;
}
class CachePeer;
class HttpRequest;
+class PeerSelector;
void peerUserHashInit(void);
-CachePeer * peerUserHashSelectParent(HttpRequest * request);
+CachePeer * peerUserHashSelectParent(PeerSelector *);
#endif /* SQUID_PEER_USERHASH_H_ */
if (acl_access *acl = ::Config.ssl_client.cert_error) {
ACLFilledChecklist *check = new ACLFilledChecklist(acl, request.getRaw(), dash_str);
check->al = al;
+ check->syncAle(request.getRaw(), nullptr);
// check->fd(fd); XXX: need client FD here
SSL_set_ex_data(serverSession.get(), ssl_ex_index_cert_error_check, check);
}
if (acl_access *acl = ::Config.ssl_client.cert_error) {
check = new ACLFilledChecklist(acl, request.getRaw(), dash_str);
check->al = al;
+ check->syncAle(request.getRaw(), nullptr);
}
Security::CertErrors *errs = nullptr;
acl_checklist->banAction(allow_t(ACCESS_ALLOWED, Ssl::bumpSplice));
if (!srvBio->canBump())
acl_checklist->banAction(allow_t(ACCESS_ALLOWED, Ssl::bumpBump));
+ acl_checklist->syncAle(request.getRaw(), nullptr);
acl_checklist->nonBlockingCheck(Ssl::PeekingPeerConnector::cbCheckForPeekAndSpliceDone, this);
}
#include "tests/STUB.h"
class CachePeer;
-class HttpRequest;
+class PeerSelector;
void carpInit(void) STUB
-CachePeer * carpSelectParent(HttpRequest *) STUB_RETVAL(NULL)
+CachePeer *carpSelectParent(PeerSelector *ps) STUB_RETVAL(nullptr)
void netdbBinaryExchange(StoreEntry *) STUB
void netdbExchangeStart(void *) STUB
void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double) STUB
-CachePeer *netdbClosestParent(HttpRequest *) STUB_RETVAL(NULL)
+CachePeer *netdbClosestParent(PeerSelector *) STUB_RETVAL(nullptr)
void netdbHostData(const char *host, int *samp, int *rtt, int *hops) STUB
* default is to allow.
*/
ACLFilledChecklist ch(Config.accessList.miss, request, NULL);
+ ch.al = http->al;
ch.src_addr = request->client_addr;
ch.my_addr = request->my_addr;
+ ch.syncAle(request, http->log_uri);
if (ch.fastCheck().denied()) {
debugs(26, 4, HERE << "MISS access forbidden.");
err = new ErrorState(ERR_FORWARDING_DENIED, Http::scForbidden, request);