return true;
}
-void HttpReply::removeStaleWarnings()
-{
- String warning;
- if (header.getList(Http::HdrType::WARNING, &warning)) {
- const String newWarning = removeStaleWarningValues(warning);
- if (warning.size() && warning.size() == newWarning.size())
- return; // some warnings are there and none changed
- header.delById(Http::HdrType::WARNING);
- if (newWarning.size()) { // some warnings left
- HttpHeaderEntry *const e =
- new HttpHeaderEntry(Http::HdrType::WARNING, SBuf(), newWarning.termedBuf());
- header.addEntry(e);
- }
- }
-}
-
-/**
- * Remove warning-values with warn-date different from Date value from
- * a single header entry. Returns a string with all valid warning-values.
- */
-String HttpReply::removeStaleWarningValues(const String &value)
-{
- String newValue;
- const char *item = nullptr;
- int len = 0;
- const char *pos = nullptr;
- while (strListGetItem(&value, ',', &item, &len, &pos)) {
- bool keep = true;
- // Does warning-value have warn-date (which contains quoted date)?
- // We scan backwards, looking for two quoted strings.
- // warning-value = warn-code SP warn-agent SP warn-text [SP warn-date]
- const char *p = item + len - 1;
-
- while (p >= item && xisspace(*p)) --p; // skip whitespace
-
- // warning-value MUST end with quote
- if (p >= item && *p == '"') {
- const char *const warnDateEnd = p;
- --p;
- while (p >= item && *p != '"') --p; // find the next quote
-
- const char *warnDateBeg = p + 1;
- --p;
- while (p >= item && xisspace(*p)) --p; // skip whitespace
-
- if (p >= item && *p == '"' && warnDateBeg - p > 2) {
- // found warn-text
- String warnDate;
- warnDate.append(warnDateBeg, warnDateEnd - warnDateBeg);
- const time_t time = Time::ParseRfc1123(warnDate.termedBuf());
- keep = (time > 0 && time == date); // keep valid and matching date
- }
- }
-
- if (keep) {
- if (newValue.size())
- newValue.append(", ");
- newValue.append(item, len);
- }
- }
-
- return newValue;
-}
-
bool
HttpReply::olderThan(const HttpReply *them) const
{