int result;
external_acl_entry *entry;
const char *key = "";
- debugs(82, 9, "aclMatchExternal: acl=\"" << acl->def->name << "\"");
+ debugs(82, 9, HERE << "acl=\"" << acl->def->name << "\"");
entry = ch->extacl_entry;
if (entry) {
- if (cbdataReferenceValid(entry) && entry->def == acl->def &&
- strcmp((char *)entry->key, key) == 0) {
+ if (cbdataReferenceValid(entry) && entry->def == acl->def) {
/* Ours, use it.. */
} else {
/* Not valid, or not ours.. get rid of it */
+ debugs(82, 9, HERE << "entry " << entry << " not valid or not ours. Discarded.");
+ if (entry) {
+ debugs(82, 9, HERE << "entry def=" << entry->def << ", our def=" << acl->def);
+ key = makeExternalAclKey(ch, acl);
+ debugs(82, 9, HERE << "entry key='" << (char *)entry->key << "', our key='" << key << "'");
+ }
cbdataReferenceDone(ch->extacl_entry);
entry = NULL;
}
external_acl_message = "MISSING REQUIRED INFORMATION";
if (!entry) {
+ debugs(82, 9, HERE << "No helper entry available");
if (acl->def->require_auth) {
int ti;
/* Make sure the user is authenticated */
static void
external_acl_cache_touch(external_acl * def, external_acl_entry * entry)
{
+ // this must not be done when nothing is being cached.
+ if (def->cache_size <= 0 || (def->ttl <= 0 && entry->result == 1) || (def->negative_ttl <= 0 && entry->result != 1))
+ return;
+
dlinkDelete(&entry->lru, &def->lru_list);
dlinkAdd(entry, &entry->lru, &def->lru_list);
}
static int
external_acl_entry_expired(external_acl * def, external_acl_entry * entry)
{
+ if (def->cache_size <= 0)
+ return 1;
+
if (entry->date + (entry->result == 1 ? def->ttl : def->negative_ttl) < squid_curtime)
return 1;
else
static int
external_acl_grace_expired(external_acl * def, external_acl_entry * entry)
{
+ if (def->cache_size <= 0)
+ return 1;
+
int ttl;
ttl = entry->result == 1 ? def->ttl : def->negative_ttl;
ttl = (ttl * (100 - def->grace)) / 100;
static external_acl_entry *
external_acl_cache_add(external_acl * def, const char *key, ExternalACLEntryData const & data)
{
- ExternalACLEntry *entry = static_cast<ExternalACLEntry *>(hash_lookup(def->cache, key));
+ ExternalACLEntry *entry;
+
+ // do not bother caching this result if TTL is going to expire it immediately
+ if (def->cache_size <= 0 || (def->ttl <= 0 && data.result == 1) || (def->negative_ttl <= 0 && data.result != 1)) {
+ debugs(82,6, HERE);
+ entry = new ExternalACLEntry;
+ entry->key = xstrdup(key);
+ entry->update(data);
+ entry->def = def;
+ return entry;
+ }
+
+ entry = static_cast<ExternalACLEntry *>(hash_lookup(def->cache, key));
debugs(82, 2, "external_acl_cache_add: Adding '" << key << "' = " << data.result);
if (entry) {
debugs(82, 3, "ExternalACLEntry::update: updating existing entry");
- entry->update (data);
+ entry->update(data);
external_acl_cache_touch(def, entry);
return entry;
entry = new ExternalACLEntry;
entry->key = xstrdup(key);
- entry->update (data);
+ entry->update(data);
def->add(entry);
static void
external_acl_cache_delete(external_acl * def, external_acl_entry * entry)
{
- assert (entry->def == def);
+ assert(def->cache_size > 0 && entry->def == def);
hash_remove_link(def->cache, entry);
dlinkDelete(&entry->lru, &def->lru_list);
def->cache_entries -= 1;
char *status;
char *token;
char *value;
- char *t;
+ char *t = NULL;
ExternalACLEntryData entryData;
entryData.result = 0;
external_acl_entry *entry = NULL;
entry = NULL;
/* Check for a pending lookup to hook into */
- for (node = def->queue.head; node; node = node->next) {
- externalAclState *oldstatetmp = static_cast<externalAclState *>(node->data);
+ // only possible if we are caching results.
+ if (def->cache_size > 0) {
+ for (node = def->queue.head; node; node = node->next) {
+ externalAclState *oldstatetmp = static_cast<externalAclState *>(node->data);
- if (strcmp(key, oldstatetmp->key) == 0) {
- oldstate = oldstatetmp;
- break;
+ if (strcmp(key, oldstatetmp->key) == 0) {
+ oldstate = oldstatetmp;
+ break;
+ }
}
}