/*
- * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
#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;
+ if (entry->name.cmp(name.termedBuf()) != 0)
+ return false; // name mismatch
- debugs(28, 3, "Checking " << name);
-
- if (values->empty())
- return (note->findFirst(name.termedBuf()) != NULL);
-
- for (std::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;
-}
-
-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.termedBuf());
}
SBufList
ACLNoteData::dump() const
{
SBufList sl;
- sl.push_back(SBuf(name));
+ sl.push_back(StringToSBuf(name));
+#if __cplusplus >= 201103L
+ sl.splice(sl.end(), values->dump());
+#else
// temp is needed until c++11 move constructor
SBufList temp = values->dump();
sl.splice(sl.end(), temp);
+#endif
return sl;
}
void
ACLNoteData::parse()
{
- char* t = strtokFile();
+ char* t = ConfigParser::strtokFile();
assert (t != NULL);
name = t;
values->parse();
return name.size() == 0;
}
-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;
}