4 #include "HttpHeader.h"
5 #include "HttpHeaderTools.h"
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.
21 class Note
: public RefCountable
24 typedef RefCount
<Note
> Pointer
;
25 /// Stores a value for the note.
26 class Value
: public RefCountable
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
) {}
35 typedef Vector
<Value::Pointer
> Values
;
37 explicit Note(const String
&aKey
): key(aKey
) {}
40 * Adds a value to the note and returns a pointer to the
41 * related Value object.
43 Value::Pointer
addValue(const String
&value
);
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.
50 const char *match(HttpRequest
*request
, HttpReply
*reply
);
53 * Returns the first value for this key or an empty string.
55 const char *firstValue() const { return (values
.size()>0&&values
[0]->value
.defined()?values
[0]->value
.termedBuf():""); }
57 String key
; ///< The note key
58 Values values
; ///< The possible values list for the note
63 * Used to store a notes list.
68 typedef Vector
<Note::Pointer
> NotesList
;
69 typedef NotesList::iterator iterator
; ///< iterates over the notes list
70 typedef NotesList::const_iterator const_iterator
; ///< iterates over the notes list
72 Notes(const char *aDescr
, const char **metasBlacklist
): descr(aDescr
), blacklisted(metasBlacklist
) {}
73 Notes(): descr(NULL
), blacklisted(NULL
) {}
74 ~Notes() { notes
.clean(); }
76 * Parse a notes line and returns a pointer to the
79 Note::Pointer
parse(ConfigParser
&parser
);
81 * Dump the notes list to the given StoreEntry object.
83 void dump(StoreEntry
*entry
, const char *name
);
84 void clean(); /// clean the notes list
86 /// points to the first argument
87 iterator
begin() { return notes
.begin(); }
88 /// points to the end of list
89 iterator
end() { return notes
.end(); }
90 /// return true if the notes list is empty
91 bool empty() { return notes
.empty(); }
94 * Adds a note key and value to the notes list.
95 * If the key name already exists in list, add the given value to its set of values.
97 void add(const String
¬eKey
, const String
¬eValue
);
100 * Adds a set of notes from another notes list to this set.
101 * Creating entries for any new keys needed.
102 * If the key name already exists in list, add the given value to its set of values.
105 * The list entries are all of shared Pointer type. Altering the src object(s) after
106 * using this function will update both Notes lists. Likewise, altering this
107 * destination NotesList will affect any relevant copies of src still in use.
109 void add(const Notes
&src
);
112 * Returns a pointer to an existing Note with given key name or nil.
114 Note::Pointer
find(const String
¬eKey
) const;
116 NotesList notes
; ///< The Note::Pointer objects array list
117 const char *descr
; ///< A short description for notes list
118 const char **blacklisted
; ///< Null terminated list of blacklisted note keys
122 * Adds a note to the notes list and returns a pointer to the
123 * related Note object. If the note key already exists in list,
124 * returns a pointer to the existing object.
126 Note::Pointer
add(const String
¬eKey
);
129 class NotePairs
: public HttpHeader
132 NotePairs() : HttpHeader(hoNote
) {}
134 /// convert a NotesList into a NotesPairs
135 /// appending to any existing entries already present
136 void append(const Notes::NotesList
&src
) {
137 for (Notes::NotesList::const_iterator m
= src
.begin(); m
!= src
.end(); ++m
)
138 for (Note::Values::iterator v
=(*m
)->values
.begin(); v
!= (*m
)->values
.end(); ++v
)
139 putExt((*m
)->key
.termedBuf(), (*v
)->value
.termedBuf());
142 void append(const NotePairs
*src
) {
143 HttpHeader::append(dynamic_cast<const HttpHeader
*>(src
));