]> git.ipfire.org Git - thirdparty/squid.git/blob - src/Notes.h
merge from SslServerCertValidator r12332
[thirdparty/squid.git] / src / Notes.h
1 #ifndef SQUID_NOTES_H
2 #define SQUID_NOTES_H
3
4 #include "HttpHeader.h"
5 #include "HttpHeaderTools.h"
6 #include "typedefs.h"
7
8 #if HAVE_STRING
9 #include <string>
10 #endif
11
12 class HttpRequest;
13 class HttpReply;
14
15 /**
16 * Used to store notes. The notes are custom key:value pairs
17 * ICAP request headers or ECAP options used to pass
18 * custom transaction-state related meta information to squid
19 * internal subsystems or to addaptation services.
20 */
21 class Note: public RefCountable
22 {
23 public:
24 typedef RefCount<Note> Pointer;
25 /// Stores a value for the note.
26 class Value: public RefCountable
27 {
28 public:
29 typedef RefCount<Value> Pointer;
30 String value; ///< a note value
31 ACLList *aclList; ///< The access list used to determine if this value is valid for a request
32 explicit Value(const String &aVal) : value(aVal), aclList(NULL) {}
33 ~Value();
34 };
35 typedef Vector<Value::Pointer> Values;
36
37 explicit Note(const String &aKey): key(aKey) {}
38
39 /**
40 * Adds a value to the note and returns a pointer to the
41 * related Value object.
42 */
43 Value::Pointer addValue(const String &value);
44
45 /**
46 * Walks through the possible values list of the note and selects
47 * the first value which matches the given HttpRequest and HttpReply
48 * or NULL if none matches.
49 */
50 const char *match(HttpRequest *request, HttpReply *reply);
51 String key; ///< The note key
52 Values values; ///< The possible values list for the note
53 };
54
55 class ConfigParser;
56 /**
57 * Used to store a notes list.
58 */
59 class Notes
60 {
61 public:
62 typedef Vector<Note::Pointer> NotesList;
63 typedef NotesList::iterator iterator; ///< iterates over the notes list
64
65 Notes(const char *aDescr, const char **metasBlacklist): descr(aDescr), blacklisted(metasBlacklist) {}
66 Notes(): descr(NULL), blacklisted(NULL) {}
67 ~Notes() { notes.clean(); }
68 /**
69 * Parse a notes line and returns a pointer to the
70 * parsed Note object.
71 */
72 Note::Pointer parse(ConfigParser &parser);
73 /**
74 * Dump the notes list to the given StoreEntry object.
75 */
76 void dump(StoreEntry *entry, const char *name);
77 void clean(); /// clean the notes list
78
79 /// points to the first argument
80 iterator begin() { return notes.begin(); }
81 /// points to the end of list
82 iterator end() { return notes.end(); }
83 /// return true if the notes list is empty
84 bool empty() { return notes.empty(); }
85
86 NotesList notes; ///< The Note::Pointer objects array list
87 const char *descr; ///< A short description for notes list
88 const char **blacklisted; ///< Null terminated list of blacklisted note keys
89 private:
90 /**
91 * Adds a note to the notes list and returns a pointer to the
92 * related Note object. If the note key already exists in list,
93 * returns a pointer to the existing object.
94 */
95 Note::Pointer add(const String &noteKey);
96 };
97
98 class NotePairs : public HttpHeader
99 {
100 public:
101 NotePairs() : HttpHeader(hoNote) {}
102 };
103
104 #endif