+/*
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
#include "squid.h"
#include "acl/Acl.h"
#include "acl/Checklist.h"
#include "acl/NoteData.h"
#include "acl/StringData.h"
-#include "cache_cf.h"
#include "ConfigParser.h"
#include "Debug.h"
-#include "HttpRequest.h"
-#include "Notes.h"
+#include "sbuf/StringConvert.h"
#include "wordlist.h"
ACLNoteData::ACLNoteData() : values(new ACLStringData)
}
bool
-ACLNoteData::matchNotes(NotePairs *note)
+ACLNoteData::match(NotePairs::Entry *entry)
{
- if (note == NULL)
- return false;
-
- debugs(28, 3, "Checking " << name);
-
- if (values->empty())
- return (note->findFirst(name.termedBuf()) != NULL);
-
- for (Vector<NotePairs::Entry *>::iterator i = note->entries.begin(); i!= note->entries.end(); ++i) {
- if ((*i)->name.cmp(name.termedBuf()) == 0) {
- if (values->match((*i)->value.termedBuf()))
- return true;
- }
- }
- return false;
-}
+ if (entry->name().cmp(name) != 0)
+ return false; // name mismatch
-bool
-ACLNoteData::match(HttpRequest *request)
-{
- if (request->notes != NULL && matchNotes(request->notes.getRaw()))
- return true;
-#if USE_ADAPTATION
- const Adaptation::History::Pointer ah = request->adaptLogHistory();
- if (ah != NULL && ah->metaHeaders != NULL && matchNotes(ah->metaHeaders.getRaw()))
- return true;
-#endif
- return false;
+ // a name-only note ACL matches any value; others require a values match
+ return values->empty() ||
+ values->match(entry->value());
}
-wordlist *
-ACLNoteData::dump()
+SBufList
+ACLNoteData::dump() const
{
- wordlist *W = NULL;
- wordlistAdd(&W, name.termedBuf());
- wordlist * dumpR = values->dump();
- wordlistAddWl(&W, dumpR);
- wordlistDestroy(&dumpR);
- return W;
+ SBufList sl;
+ sl.push_back(name);
+ sl.splice(sl.end(), values->dump());
+ return sl;
}
void
ACLNoteData::parse()
{
- char* t = strtokFile();
+ char* t = ConfigParser::strtokFile();
assert (t != NULL);
name = t;
values->parse();
bool
ACLNoteData::empty() const
{
- return name.undefined();
+ return name.isEmpty();
}
-ACLData<HttpRequest *> *
+ACLData<NotePairs::Entry *> *
ACLNoteData::clone() const
{
ACLNoteData * result = new ACLNoteData;
- result->values = values->clone();
+ result->values = dynamic_cast<ACLStringData*>(values->clone());
+ assert(result->values);
result->name = name;
return result;
}
+