keep_alive = aRep->keep_alive;
return true;
}
+
+void HttpReply::removeStaleWarnings()
+{
+ String warning;
+ if (header.getList(HDR_WARNING, &warning)) {
+ const String newWarning = removeStaleWarningValues(warning);
+ if (warning.size() && warning.size() == newWarning.size())
+ return; // some warnings are there and none changed
+ header.delById(HDR_WARNING);
+ if (newWarning.size()) { // some warnings left
+ HttpHeaderEntry *const e =
+ new HttpHeaderEntry(HDR_WARNING, NULL, 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 = 0;
+ int len = 0;
+ const char *pos = 0;
+ 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 = parse_rfc1123(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;
+}
*/
HttpReply *clone() const;
+ /// Remove Warnings with warn-date different from Date value
+ void removeStaleWarnings();
+
private:
/** initialize */
void init();
*/
void calcMaxBodySize(HttpRequest& request);
+ String removeStaleWarningValues(const String &value);
+
mutable int64_t bodySizeMax; /**< cached result of calcMaxBodySize */
protected: