--------------------- PatchSet 5990 Date: 2003/10/24 21:41:14 Author: hno Branch: icap_streaming-2_5 Tag: (none) Log: Simplify HTTP header parser and deal properly with headers having \r in the middle of a line. Members: src/HttpHeader.c:1.10.6.7.2.1->1.10.6.7.2.2 Index: squid/src/HttpHeader.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/HttpHeader.c,v retrieving revision 1.10.6.7.2.1 retrieving revision 1.10.6.7.2.2 diff -u -r1.10.6.7.2.1 -r1.10.6.7.2.2 --- squid/src/HttpHeader.c 15 Oct 2003 12:27:50 -0000 1.10.6.7.2.1 +++ squid/src/HttpHeader.c 24 Oct 2003 21:41:14 -0000 1.10.6.7.2.2 @@ -1,6 +1,6 @@ /* - * $Id: HttpHeader.c,v 1.10.6.7.2.1 2003/10/15 12:27:50 hno Exp $ + * $Id: HttpHeader.c,v 1.10.6.7.2.2 2003/10/24 21:41:14 hno Exp $ * * DEBUG: section 55 HTTP Header * AUTHOR: Alex Rousskov @@ -409,24 +409,25 @@ assert(header_start && header_end); debug(55, 7) ("parsing hdr: (%p)\n%s\n", hdr, getStringPrefix(header_start, header_end)); HttpHeaderStats[hdr->owner].parsedCount++; - /* commonn format headers are ":[ws]" lines delimited by */ + /* common format headers are ":[ws]" lines delimited by . + * continuation lines start with a (single) space or tab */ while (field_start < header_end) { const char *field_end = field_start; const char *field_ptr = field_start; do { - int l = strcspn(field_ptr, "\r\n"); - if (l == 0) - break; - field_end = field_ptr = field_ptr + l; - /* skip CRLF */ - if (*field_ptr == '\r') - field_ptr++; - if (*field_ptr == '\n') - field_ptr++; - } - while (field_ptr < header_end && (*field_ptr == ' ' || *field_ptr == '\t')); - if (!*field_end || field_end > header_end) - return httpHeaderReset(hdr); /* missing */ + for (field_ptr = field_start; field_ptr < header_end && *field_ptr != '\n'; field_ptr++) { + switch (*field_ptr) { + case '\r': + continue; + default: + field_end = field_ptr + 1; + break; + } + } + if (field_ptr >= header_end || *field_ptr != '\n') + return httpHeaderReset(hdr); /* missing */ + field_ptr++; + } while (field_ptr < header_end && (*field_ptr == ' ' || *field_ptr == '\t')); if (field_start == field_end) break; /* blank line */ e = httpHeaderEntryParseCreate(field_start, field_end); @@ -435,12 +436,7 @@ else debug(55, 2) ("warning: ignoring unparseable http header field near '%s'\n", getStringPrefix(field_start, field_end)); - field_start = field_end; - /* skip CRLF */ - if (*field_start == '\r') - field_start++; - if (*field_start == '\n') - field_start++; + field_start = field_ptr; } return 1; /* even if no fields where found, it is a valid header */ }