/*
- * $Id: HttpHeader.cc,v 1.130 2007/04/30 16:56:09 wessels Exp $
+ * $Id: HttpHeader.cc,v 1.131 2007/05/07 18:12:28 wessels Exp $
*
* DEBUG: section 55 HTTP Header
* AUTHOR: Alex Rousskov
debugs(55, 7, "Updating header '" << HeadersAttrs[e->id].name << "' in cached entry");
- delByName(e->name.buf());
+ if (e->id != HDR_OTHER)
+ delById(e->id);
+ else
+ delByName(e->name.buf());
addEntry(e->clone());
}
debugs(55, 9, "deleting '" << name << "' fields in hdr " << this);
while ((e = getEntry(&pos))) {
- if (!e->name.caseCmp(name)) {
- delAt(pos);
- count++;
- } else
+ if (!e->name.caseCmp(name))
+ delAt(pos, count);
+ else
CBIT_SET(mask, e->id);
}
return 0;
while ((e = getEntry(&pos))) {
- if (e->id == id) {
- delAt(pos);
- count++;
- }
+ if (e->id == id)
+ delAt(pos, count);
}
CBIT_CLR(mask, id);
/*
* deletes an entry at pos and leaves a gap; leaving a gap makes it
* possible to iterate(search) and delete fields at the same time
+ * NOTE: Does not update the header mask. Caller must follow up with
+ * a call to refreshMask() if headers_deleted was incremented.
*/
void
-HttpHeader::delAt(HttpHeaderPos pos)
+HttpHeader::delAt(HttpHeaderPos pos, int &headers_deleted)
{
HttpHeaderEntry *e;
assert(pos >= HttpHeaderInitPos && pos < (ssize_t)entries.count);
len -= e->name.size() + 2 + e->value.size() + 2;
assert(len >= 0);
delete e;
+ ++headers_deleted;
}
+/*
+ * Refreshes the header mask. Required after delAt() calls.
+ */
+void
+HttpHeader::refreshMask()
+{
+ httpHeaderMaskInit(&mask, 0);
+ debugs(55, 7, "refreshing the mask in hdr " << this);
+ HttpHeaderPos pos = HttpHeaderInitPos;
+ while (HttpHeaderEntry *e = getEntry(&pos)) {
+ CBIT_SET(mask, e->id);
+ }
+}
/* appends an entry;
* does not call e->clone() so one should not reuse "*e"
* from strConnection first?
*/
+ int headers_deleted = 0;
while ((e = getEntry(&pos))) {
if (strListIsMember(&strConnection, e->name.buf(), ','))
- delAt(pos);
+ delAt(pos, headers_deleted);
}
+ if (headers_deleted)
+ refreshMask();
delById(HDR_CONNECTION);
}
/*
- * $Id: HttpHeader.h,v 1.18 2006/10/02 09:52:06 adrian Exp $
+ * $Id: HttpHeader.h,v 1.19 2007/05/07 18:12:28 wessels Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
HttpHeaderEntry *findEntry(http_hdr_type id) const;
int delByName(const char *name);
int delById(http_hdr_type id);
- void delAt(HttpHeaderPos pos);
+ void delAt(HttpHeaderPos pos, int &headers_deleted);
+ void refreshMask();
void addEntry(HttpHeaderEntry * e);
void insertEntry(HttpHeaderEntry * e);
String getList(http_hdr_type id) const;
/*
- * $Id: HttpHeaderTools.cc,v 1.58 2007/04/28 22:26:37 hno Exp $
+ * $Id: HttpHeaderTools.cc,v 1.59 2007/05/07 18:12:28 wessels Exp $
*
* DEBUG: section 66 HTTP Header Tools
* AUTHOR: Alex Rousskov
HttpHeaderEntry *e;
HttpHeaderPos p = HttpHeaderInitPos;
+ int headers_deleted = 0;
while ((e = l->getEntry(&p)))
if (0 == httpHdrMangle(e, request, req_or_rep))
- l->delAt(p);
+ l->delAt(p, headers_deleted);
+
+ if (headers_deleted)
+ l->refreshMask();
}
/*
/*
- * $Id: client_side_reply.cc,v 1.122 2007/04/30 16:56:09 wessels Exp $
+ * $Id: client_side_reply.cc,v 1.123 2007/05/07 18:12:28 wessels Exp $
*
* DEBUG: section 88 Client-side Reply Routines
* AUTHOR: Robert Collins (Originally Duane Wessels in client_side.c)
hdr->delById(HDR_ETAG);
#endif
+ // TODO: Should ESIInclude.cc that calls removeConnectionHeaderEntries
+ // also delete HDR_PROXY_CONNECTION and HDR_KEEP_ALIVE like we do below?
+
+ // XXX: Should HDR_PROXY_CONNECTION by studied instead of HDR_CONNECTION?
+ // httpHeaderHasConnDir does that but we do not. Is this is a bug?
hdr->delById(HDR_PROXY_CONNECTION);
/* here: Keep-Alive is a field-name, not a connection directive! */
- hdr->delByName("Keep-Alive");
+ hdr->delById(HDR_KEEP_ALIVE);
/* remove Set-Cookie if a hit */
if (is_hit)
HttpHeaderPos pos = HttpHeaderInitPos;
HttpHeaderEntry *e;
+ int headers_deleted = 0;
while ((e = hdr->getEntry(&pos))) {
if (e->id == HDR_WWW_AUTHENTICATE || e->id == HDR_PROXY_AUTHENTICATE) {
const char *value = e->value.buf();
||
(strncasecmp(value, "Negotiate", 9) == 0 &&
(value[9] == '\0' || value[9] == ' ')))
- hdr->delAt(pos);
+ hdr->delAt(pos, headers_deleted);
}
}
+ if (headers_deleted)
+ hdr->refreshMask();
}
/* Handle authentication headers */