/*
- * $Id: HttpHeader.cc,v 1.108 2005/09/17 05:50:07 wessels Exp $
+ * $Id: HttpHeader.cc,v 1.109 2005/12/13 21:41:57 wessels Exp $
*
* DEBUG: section 55 HTTP Header
* AUTHOR: Alex Rousskov
return result;
}
+int
+httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator)
+{
+ int result = 0;
+ const char *pos = NULL;
+ const char *item;
+ int ilen;
+ int mlen = strlen(member);
+
+ assert(hdr);
+ assert(name);
+
+ String header (httpHeaderGetByName(hdr, name));
+
+ while (strListGetItem(&header, separator, &item, &ilen, &pos)) {
+ if (strncmp(item, member, mlen) == 0
+ && (item[mlen] == '=' || item[mlen] == separator || item[mlen] == ';' || item[mlen] == '\0')) {
+ result = 1;
+ break;
+ }
+ }
+
+ return result;
+}
+
void
HttpHeader::removeConnectionHeaderEntries()
{
/*
- * $Id: HttpHeader.h,v 1.7 2003/09/01 03:49:37 robertc Exp $
+ * $Id: HttpHeader.h,v 1.8 2005/12/13 21:41:57 wessels Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
extern HttpHdrSc *httpHeaderGetSc(const HttpHeader *hdr);
SQUIDCEXTERN void httpHeaderAddContRange(HttpHeader *, HttpHdrRangeSpec, ssize_t);
extern int httpHeaderHasListMember(const HttpHeader * hdr, http_hdr_type id, const char *member, const char separator);
+SQUIDCEXTERN int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator);
SQUIDCEXTERN void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask);
int httpMsgIsPersistent(HttpVersion const &http_ver, const HttpHeader * hdr);
void ICAPClientReqmodPrecache::noteSourceStart(MsgPipe *p)
{
debug(93,3)("ICAPClientReqmodPrecache::noteSourceStart() called\n");
+ assert(adapted->data->header); // What should happen instead?
http->takeAdaptedHeaders(adapted->data->header);
noteSourceProgress(p);
}
return TRANSFER_NONE;
}
-#if UNUSED_CODE
void ICAPOptions::insertTransferExt(const char *t, transfer_type t_type)
{
List<TransferPair> **Tail;
};
+void ICAPOptions::cfgTransferListHeader(const HttpHeader *h, const char *fname, transfer_type t_type)
+{
+ const String s = httpHeaderGetByName(h, fname);
+
+ if (!s.size())
+ return;
+
+ if (t_type == TRANSFER_PREVIEW)
+ transfers.preview = parseExtFileList(s.buf(), s.buf() + s.size(), t_type);
+ else if (t_type == TRANSFER_IGNORE)
+ transfers.ignore = parseExtFileList(s.buf(), s.buf() + s.size(), t_type);
+ else if (t_type == TRANSFER_COMPLETE)
+ transfers.complete = parseExtFileList(s.buf(), s.buf() + s.size(), t_type);
+ else
+ fatalf("Unexpected transfer_type at %s:%d", __FILE__,__LINE__);
+}
+
List<String> *ICAPOptions::parseExtFileList(const char *start, const char *end, transfer_type t_type)
{
- const String s = xstrndup(start, end - start - 1);
+ const String s = xstrndup(start, end - start + 1);
const char *item;
const char *pos = NULL;
char *fext = NULL;
return H;
}
-#endif
-
bool ICAPOptions::valid() const
{
return !error;
error = "unsupported status code of OPTIONS response";
// Methods
- if (httpHeaderGetByNameListMember(h, "Methods", "REQMOD", ',').size())
+ if (httpHeaderHasByNameListMember(h, "Methods", "REQMOD", ','))
cfgMethod(ICAP::methodReqmod);
- if (httpHeaderGetByNameListMember(h, "Methods", "RESPMOD", ',').size())
+ if (httpHeaderHasByNameListMember(h, "Methods", "RESPMOD", ','))
cfgMethod(ICAP::methodRespmod);
service = httpHeaderGetByName(h, "Service");
if (theTimestamp < 0)
theTimestamp = squid_curtime;
- if (httpHeaderGetByNameListMember(h, "Allow", "204", ',').size())
+ if (httpHeaderHasListMember(h, HDR_ALLOW, "204", ','))
allow204 = true;
cfgIntHeader(h, "Preview", preview);
-#if 0
-
- if (!strncasecmp("Transfer-Preview", start, 16))
- headers->transfer_preview = parseExtFileList(value_start, end, TRANSFER_PREVIEW);
-
- if (!strncasecmp("Transfer-Ignore", start, 15))
- headers->transfer_ignore = parseExtFileList(value_start, end, TRANSFER_IGNORE);
+ cfgTransferListHeader(h, "Transfer-Preview", TRANSFER_PREVIEW);
- if (!strncasecmp("Transfer-Complete", start, 17))
- headers->transfer_complete = parseExtFileList(value_start, end, TRANSFER_COMPLETE);
+ cfgTransferListHeader(h, "Transfer-Ignore", TRANSFER_IGNORE);
-#endif
+ cfgTransferListHeader(h, "Transfer-Complete", TRANSFER_COMPLETE);
}
void ICAPOptions::cfgMethod(ICAP::Method m)
/*
- * $Id: ICAPOptions.h,v 1.3 2005/12/13 18:38:05 wessels Exp $
+ * $Id: ICAPOptions.h,v 1.4 2005/12/13 21:41:58 wessels Exp $
*
*
* SQUID Web Proxy Cache http://www.squid-cache.org/
private:
void cfgMethod(ICAP::Method m);
void cfgIntHeader(const HttpHeader *h, const char *fname, int &value);
+ void insertTransferExt(const char *t, transfer_type t_type);
+ void cfgTransferListHeader(const HttpHeader *h, const char *fname, transfer_type type);
+ List<String> *ICAPOptions::parseExtFileList(const char *start, const char *end, transfer_type t_type);
};
delete theOptions;
theOptions = newOptions;
+ if (theOptions == NULL)
+ return;
+
/*
* Maybe it would be better if squid.conf just listed the URI and
* then discovered the method via OPTIONS
if (theOptions->method != method)
debugs(93,1, "WARNING: Squid is configured to use ICAP method " << ICAP::methodStr(method) <<
- "for service " << uri.buf() <<
- "but OPTIONS response declares the method is " << ICAP::methodStr(theOptions->method));
+ " for service " << uri.buf() <<
+ " but OPTIONS response declares the method is " << ICAP::methodStr(theOptions->method));
/*
if (skew > theOptions->ttl())
debugs(93, 1, host.buf() << "'s clock is skewed by " << skew << " seconds!");
+#if 0
+
+ List<String> *tmp;
+
+ for (tmp = theOptions->transfers.preview; tmp; tmp=tmp->next)
+ debugs(93,1,"Transfer-Preview: " << tmp->element.buf());
+
+ for (tmp = theOptions->transfers.ignore; tmp; tmp=tmp->next)
+ debugs(93,1,"Transfer-Ignore: " << tmp->element.buf());
+
+ for (tmp = theOptions->transfers.complete; tmp; tmp=tmp->next)
+ debugs(93,1,"Transfer-Complete: " << tmp->element.buf());
+
+#endif
}
static