diff -u -r -N squid-3.0.STABLE15/ChangeLog squid-3.0.STABLE16-RC1/ChangeLog --- squid-3.0.STABLE15/ChangeLog 2009-05-06 23:11:25.000000000 +1200 +++ squid-3.0.STABLE16-RC1/ChangeLog 2009-05-16 00:47:46.000000000 +1200 @@ -1,3 +1,8 @@ +Changes to squid-3.0.STABLE16-RC1 (16 May 2009): + + - Bug 1148 Ported from 3.1: Chunked Transfer Encoding + - Bug 2648: NTLM helpers not shutting down when deferred + Changes to squid-3.0.STABLE15 (06 May 2009): - Regression Bug 2635: Incorrect Max-Forwards header type diff -u -r -N squid-3.0.STABLE15/configure squid-3.0.STABLE16-RC1/configure --- squid-3.0.STABLE15/configure 2009-05-06 23:11:43.000000000 +1200 +++ squid-3.0.STABLE16-RC1/configure 2009-05-16 00:47:59.000000000 +1200 @@ -1,7 +1,7 @@ #! /bin/sh # From configure.in Revision: 1.488.2.3 . # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.62 for Squid Web Proxy 3.0.STABLE15. +# Generated by GNU Autoconf 2.62 for Squid Web Proxy 3.0.STABLE16-RC1. # # Report bugs to . # @@ -751,8 +751,8 @@ # Identity of this package. PACKAGE_NAME='Squid Web Proxy' PACKAGE_TARNAME='squid' -PACKAGE_VERSION='3.0.STABLE15' -PACKAGE_STRING='Squid Web Proxy 3.0.STABLE15' +PACKAGE_VERSION='3.0.STABLE16-RC1' +PACKAGE_STRING='Squid Web Proxy 3.0.STABLE16-RC1' PACKAGE_BUGREPORT='http://www.squid-cache.org/bugs/' ac_unique_file="src/main.cc" @@ -1663,7 +1663,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Squid Web Proxy 3.0.STABLE15 to adapt to many kinds of systems. +\`configure' configures Squid Web Proxy 3.0.STABLE16-RC1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1733,7 +1733,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Squid Web Proxy 3.0.STABLE15:";; + short | recursive ) echo "Configuration of Squid Web Proxy 3.0.STABLE16-RC1:";; esac cat <<\_ACEOF @@ -2045,7 +2045,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Squid Web Proxy configure 3.0.STABLE15 +Squid Web Proxy configure 3.0.STABLE16-RC1 generated by GNU Autoconf 2.62 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -2059,7 +2059,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Squid Web Proxy $as_me 3.0.STABLE15, which was +It was created by Squid Web Proxy $as_me 3.0.STABLE16-RC1, which was generated by GNU Autoconf 2.62. Invocation command line was $ $0 $@ @@ -2777,7 +2777,7 @@ # Define the identity of the package. PACKAGE='squid' - VERSION='3.0.STABLE15' + VERSION='3.0.STABLE16-RC1' cat >>confdefs.h <<_ACEOF @@ -47802,7 +47802,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Squid Web Proxy $as_me 3.0.STABLE15, which was +This file was extended by Squid Web Proxy $as_me 3.0.STABLE16-RC1, which was generated by GNU Autoconf 2.62. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -47855,7 +47855,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -Squid Web Proxy config.status 3.0.STABLE15 +Squid Web Proxy config.status 3.0.STABLE16-RC1 configured by $0, generated by GNU Autoconf 2.62, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff -u -r -N squid-3.0.STABLE15/configure.in squid-3.0.STABLE16-RC1/configure.in --- squid-3.0.STABLE15/configure.in 2009-05-06 23:11:43.000000000 +1200 +++ squid-3.0.STABLE16-RC1/configure.in 2009-05-16 00:47:59.000000000 +1200 @@ -1,7 +1,7 @@ dnl Configuration input file for Squid dnl dnl -AC_INIT(Squid Web Proxy, 3.0.STABLE15, http://www.squid-cache.org/bugs/, squid) +AC_INIT(Squid Web Proxy, 3.0.STABLE16-RC1, http://www.squid-cache.org/bugs/, squid) AC_PREREQ(2.52) AM_CONFIG_HEADER(include/autoconf.h) AC_CONFIG_AUX_DIR(cfgaux) diff -u -r -N squid-3.0.STABLE15/include/version.h squid-3.0.STABLE16-RC1/include/version.h --- squid-3.0.STABLE15/include/version.h 2009-05-06 23:11:43.000000000 +1200 +++ squid-3.0.STABLE16-RC1/include/version.h 2009-05-16 00:47:59.000000000 +1200 @@ -9,5 +9,5 @@ */ #ifndef SQUID_RELEASE_TIME -#define SQUID_RELEASE_TIME 1241608284 +#define SQUID_RELEASE_TIME 1242391665 #endif diff -u -r -N squid-3.0.STABLE15/RELEASENOTES.html squid-3.0.STABLE16-RC1/RELEASENOTES.html --- squid-3.0.STABLE15/RELEASENOTES.html 2009-05-06 23:12:25.000000000 +1200 +++ squid-3.0.STABLE16-RC1/RELEASENOTES.html 2009-05-16 00:48:42.000000000 +1200 @@ -2,10 +2,10 @@ - Squid 3.0.STABLE15 release notes + Squid 3.0.STABLE16-RC1 release notes -

Squid 3.0.STABLE15 release notes

+

Squid 3.0.STABLE16-RC1 release notes

Squid Developers


@@ -15,7 +15,7 @@

1. Notice

-

The Squid Team are pleased to announce the release of Squid-3.0.STABLE15.

+

The Squid Team are pleased to announce the release of Squid-3.0.STABLE16-RC1.

This new release is available for download from http://www.squid-cache.org/Versions/v3/3.0/ or the mirrors.

@@ -652,6 +652,32 @@

+
chunked_request_body_max_size
+

New tag to fix handling of chunked requests. +

+        A broken or confused HTTP/1.1 client may send a chunked HTTP
+        request to Squid. Squid does not have full support for that
+        feature yet. To cope with such requests, Squid buffers the
+        entire request and then dechunks request body to create a
+        plain HTTP/1.0 request with a known content length. The plain
+        request is then used by the rest of Squid code as usual.
+
+        The option value specifies the maximum size of the buffer used
+        to hold the request before the conversion. If the chunked
+        request size exceeds the specified limit, the conversion
+        fails, and the client receives an "unsupported request" error,
+        as if dechunking was disabled.
+
+        Dechunking is enabled by default. To disable conversion of
+        chunked requests, set the maximum to zero.
+
+        Request dechunking feature and this option in particular are a
+        temporary hack. When chunking requests and responses are fully
+        supported, there will be no need to buffer a chunked request.
+        
+
+

+

diff -u -r -N squid-3.0.STABLE15/src/cf.data.pre squid-3.0.STABLE16-RC1/src/cf.data.pre --- squid-3.0.STABLE15/src/cf.data.pre 2009-05-06 23:11:41.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/cf.data.pre 2009-05-16 00:47:57.000000000 +1200 @@ -2826,6 +2826,33 @@ be no limit imposed. DOC_END +NAME: chunked_request_body_max_size +COMMENT: (bytes) +TYPE: b_int64_t +DEFAULT: 64 KB +LOC: Config.maxChunkedRequestBodySize +DOC_START + A broken or confused HTTP/1.1 client may send a chunked HTTP + request to Squid. Squid does not have full support for that + feature yet. To cope with such requests, Squid buffers the + entire request and then dechunks request body to create a + plain HTTP/1.0 request with a known content length. The plain + request is then used by the rest of Squid code as usual. + + The option value specifies the maximum size of the buffer used + to hold the request before the conversion. If the chunked + request size exceeds the specified limit, the conversion + fails, and the client receives an "unsupported request" error, + as if dechunking was disabled. + + Dechunking is enabled by default. To disable conversion of + chunked requests, set the maximum to zero. + + Request dechunking feature and this option in particular are a + temporary hack. When chunking requests and responses are fully + supported, there will be no need to buffer a chunked request. +DOC_END + NAME: broken_posts TYPE: acl_access DEFAULT: none diff -u -r -N squid-3.0.STABLE15/src/ChunkedCodingParser.cc squid-3.0.STABLE16-RC1/src/ChunkedCodingParser.cc --- squid-3.0.STABLE15/src/ChunkedCodingParser.cc 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/ChunkedCodingParser.cc 2009-05-16 00:47:56.000000000 +1200 @@ -0,0 +1,232 @@ +#include "squid.h" +#include "Parsing.h" +#include "TextException.h" +#include "ChunkedCodingParser.h" +#include "MemBuf.h" + +ChunkedCodingParser::Step ChunkedCodingParser::psChunkBeg = &ChunkedCodingParser::parseChunkBeg; +ChunkedCodingParser::Step ChunkedCodingParser::psChunkBody = &ChunkedCodingParser::parseChunkBody; +ChunkedCodingParser::Step ChunkedCodingParser::psChunkEnd = &ChunkedCodingParser::parseChunkEnd; +ChunkedCodingParser::Step ChunkedCodingParser::psTrailer = &ChunkedCodingParser::parseTrailer; +ChunkedCodingParser::Step ChunkedCodingParser::psMessageEnd = &ChunkedCodingParser::parseMessageEnd; + +ChunkedCodingParser::ChunkedCodingParser() +{ + reset(); +} + +void ChunkedCodingParser::reset() +{ + theStep = psChunkBeg; + theChunkSize = theLeftBodySize = 0; + doNeedMoreData = false; + theIn = theOut = NULL; +} + +bool ChunkedCodingParser::parse(MemBuf *rawData, MemBuf *parsedContent) +{ + Must(rawData && parsedContent); + theIn = rawData; + theOut = parsedContent; + + // we must reset this all the time so that mayContinue() lets us + // output more content if we stopped due to needsMoreSpace() before + doNeedMoreData = !theIn->hasContent(); + + while (mayContinue()) { + (this->*theStep)(); + } + + return theStep == psMessageEnd; +} + +bool ChunkedCodingParser::needsMoreData() const +{ + return doNeedMoreData; +} + +bool ChunkedCodingParser::needsMoreSpace() const +{ + assert(theOut); + return theStep == psChunkBody && !theOut->hasPotentialSpace(); +} + +bool ChunkedCodingParser::mayContinue() const +{ + return !needsMoreData() && !needsMoreSpace() && theStep != psMessageEnd; +} + +void ChunkedCodingParser::parseChunkBeg() +{ + Must(theChunkSize <= 0); // Should(), really + + size_t crlfBeg = 0; + size_t crlfEnd = 0; + + if (findCrlf(crlfBeg, crlfEnd)) { + debugs(94,7, "found chunk-size end: " << crlfBeg << "-" << crlfEnd); + int64_t size = -1; + const char *p = 0; + + if (StringToInt64(theIn->content(), size, &p, 16)) { + if (size < 0) { + throw TexcHere("negative chunk size"); + return; + } + + theIn->consume(crlfEnd); + theChunkSize = theLeftBodySize = size; + debugs(94,7, "found chunk: " << theChunkSize); + theStep = theChunkSize == 0 ? psTrailer : psChunkBody; + return; + } + + throw TexcHere("corrupted chunk size"); + } + + doNeedMoreData = true; +} + +void ChunkedCodingParser::parseChunkBody() +{ + Must(theLeftBodySize > 0); // Should, really + + const size_t availSize = XMIN(theLeftBodySize, (uint64_t)theIn->contentSize()); + const size_t safeSize = XMIN(availSize, (size_t)theOut->potentialSpaceSize()); + + doNeedMoreData = availSize < theLeftBodySize; + // and we may also need more space + + theOut->append(theIn->content(), safeSize); + theIn->consume(safeSize); + theLeftBodySize -= safeSize; + + if (theLeftBodySize == 0) + theStep = psChunkEnd; + else + Must(needsMoreData() || needsMoreSpace()); +} + +void ChunkedCodingParser::parseChunkEnd() +{ + Must(theLeftBodySize == 0); // Should(), really + + size_t crlfBeg = 0; + size_t crlfEnd = 0; + + if (findCrlf(crlfBeg, crlfEnd)) { + if (crlfBeg != 0) { + throw TexcHere("found data bewteen chunk end and CRLF"); + return; + } + + theIn->consume(crlfEnd); + theChunkSize = 0; // done with the current chunk + theStep = psChunkBeg; + return; + } + + doNeedMoreData = true; +} + +void ChunkedCodingParser::parseTrailer() +{ + Must(theChunkSize == 0); // Should(), really + + while (mayContinue()) + parseTrailerHeader(); +} + +void ChunkedCodingParser::parseTrailerHeader() +{ + size_t crlfBeg = 0; + size_t crlfEnd = 0; + + if (findCrlf(crlfBeg, crlfEnd)) { + if (crlfBeg > 0) + + ; //theTrailer.append(theIn->content(), crlfEnd); + + theIn->consume(crlfEnd); + + if (crlfBeg == 0) + theStep = psMessageEnd; + + return; + } + + doNeedMoreData = true; +} + +void ChunkedCodingParser::parseMessageEnd() +{ + // termination step, should not be called + Must(false); // Should(), really +} + +// finds next CRLF +bool ChunkedCodingParser::findCrlf(size_t &crlfBeg, size_t &crlfEnd) +{ + // XXX: This code was copied, with permission, from another software. + // There is a similar and probably better code inside httpHeaderParse + // but it seems difficult to isolate due to parsing-unrelated bloat. + // Such isolation should probably be done before this class is used + // for handling of traffic "more external" than ICAP. + + const char *buf = theIn->content(); + size_t size = theIn->contentSize(); + + ssize_t crOff = -1; + bool quoted = false; + bool slashed = false; + + for (size_t i = 0; i < size; ++i) { + if (slashed) { + slashed = false; + continue; + } + + const char c = buf[i]; + + // handle quoted strings + if (quoted) { + if (c == '\\') + slashed = true; + else + if (c == '"') + quoted = false; + + continue; + } else + if (c == '"') { + quoted = true; + crOff = -1; + continue; + } + + if (crOff < 0) { // looking for the first CR or LF + + if (c == '\n') { + crlfBeg = i; + crlfEnd = ++i; + return true; + } + + if (c == '\r') + crOff = i; + } else { // skipping CRs, looking for the first LF + + if (c == '\n') { + crlfBeg = crOff; + crlfEnd = ++i; + return true; + } + + if (c != '\r') + crOff = -1; + } + } + + return false; +} + diff -u -r -N squid-3.0.STABLE15/src/ChunkedCodingParser.h squid-3.0.STABLE16-RC1/src/ChunkedCodingParser.h --- squid-3.0.STABLE15/src/ChunkedCodingParser.h 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/ChunkedCodingParser.h 2009-05-16 00:47:56.000000000 +1200 @@ -0,0 +1,89 @@ + +/* + * $Id: ChunkedCodingParser.h,v 1.1 2007/12/26 22:33:32 hno Exp $ + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#ifndef SQUID_CHUNKEDCODINGPARSER_H +#define SQUID_CHUNKEDCODINGPARSER_H + +#include "RefCount.h" + +// ChunkedCodingParser is an incremental parser for chunked transfer coding +// used by HTTP and ICAP. The parser shovels content bytes from the raw +// input buffer into the content output buffer, both caller-supplied. +// Ignores chunk extensions except for ICAP's ieof. +// Has a trailer-handling placeholder. + +class ChunkedCodingParser +{ + +public: + ChunkedCodingParser(); + + void reset(); + + // true = complete success; false == needs more data + bool parse(MemBuf *rawData, MemBuf *parsedContent); // throws on error + + bool needsMoreData() const; + bool needsMoreSpace() const; + +private: + typedef void (ChunkedCodingParser::*Step)(); + +private: + bool mayContinue() const; + + void parseChunkBeg(); + void parseChunkBody(); + void parseChunkEnd(); + void parseTrailer(); + void parseTrailerHeader(); + void parseMessageEnd(); + + bool findCrlf(size_t &crlfBeg, size_t &crlfEnd); + +private: + static Step psChunkBeg; + static Step psChunkBody; + static Step psChunkEnd; + static Step psTrailer; + static Step psMessageEnd; + + MemBuf *theIn; + MemBuf *theOut; + + Step theStep; + uint64_t theChunkSize; + uint64_t theLeftBodySize; + bool doNeedMoreData; +}; + +#endif /* SQUID_CHUNKEDCODINGPARSER_H */ diff -u -r -N squid-3.0.STABLE15/src/client_side.cc squid-3.0.STABLE16-RC1/src/client_side.cc --- squid-3.0.STABLE15/src/client_side.cc 2009-05-06 23:11:41.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/client_side.cc 2009-05-16 00:47:57.000000000 +1200 @@ -75,6 +75,7 @@ #include "ClientRequestContext.h" #include "MemBuf.h" #include "SquidTime.h" +#include "ChunkedCodingParser.h" #if LINGERING_CLOSE #define comm_close comm_lingering_close @@ -1820,6 +1821,17 @@ } } +// Temporary hack helper: determine whether the request is chunked, expensive +static bool +isChunkedRequest(const HttpParser *hp) { + HttpRequest request; + if (!request.parseHeader(HttpParserHdrBuf(hp), HttpParserHdrSz(hp))) + return false; + + return request.header.has(HDR_TRANSFER_ENCODING) && + request.header.hasListMember(HDR_TRANSFER_ENCODING, "chunked", ','); +} + /* * parseHttpRequest() * @@ -1832,7 +1844,6 @@ static ClientSocketContext * parseHttpRequest(ConnStateData::Pointer & conn, HttpParser *hp, method_t * method_p, HttpVersion *http_ver) { - char *url = NULL; char *req_hdr = NULL; char *end; size_t req_sz; @@ -1908,17 +1919,6 @@ return parseHttpRequestAbort(conn, "error:unsupported-request-method"); } - /* set url */ - /* - * XXX this should eventually not use a malloc'ed buffer; the transformation code - * below needs to be modified to not expect a mutable nul-terminated string. - */ - url = (char *)xmalloc(hp->u_end - hp->u_start + 16); - - memcpy(url, hp->buf + hp->u_start, hp->u_end - hp->u_start + 1); - - url[hp->u_end - hp->u_start + 1] = '\0'; - /* * Process headers after request line * TODO: Use httpRequestParse here. @@ -1938,7 +1938,6 @@ */ if ( squid_strnstr(req_hdr, "\r\r\n", req_sz) ) { debugs(33, 1, "WARNING: suspicious HTTP request contains double CR"); - xfree(url); return parseHttpRequestAbort(conn, "error:double-CR"); } @@ -1946,6 +1945,35 @@ (int) HttpParserRequestLen(hp) << ", req_line_sz = " << HttpParserReqSz(hp)); + // Temporary hack: We might receive a chunked body from a broken HTTP/1.1 + // client that sends chunked requests to HTTP/1.0 Squid. If the request + // might have a chunked body, parse the headers early to look for the + // "Transfer-Encoding: chunked" header. If we find it, wait until the + // entire body is available so that we can set the content length and + // forward the request without chunks. The primary reason for this is + // to avoid forwarding a chunked request because the server side lacks + // logic to determine when it is valid to do so. + // FUTURE_CODE_TO_SUPPORT_CHUNKED_REQUESTS below will replace this hack. + if (hp->v_min == 1 && hp->v_maj == 1 && // broken client, may send chunks + Config.maxChunkedRequestBodySize > 0 && // configured to dechunk + (*method_p == METHOD_PUT || *method_p == METHOD_POST)) { + + // check only once per request because isChunkedRequest is expensive + if (conn->in.dechunkingState == ConnStateData::chunkUnknown) { + if (isChunkedRequest(hp)) + conn->startDechunkingRequest(hp); + else + conn->in.dechunkingState = ConnStateData::chunkNone; + } + + if (conn->in.dechunkingState == ConnStateData::chunkParsing) { + if (conn->parseRequestChunks(hp)) // parses newly read chunks + return NULL; // wait for more data + debugs(33, 5, HERE << "Got complete chunked request or err."); + assert(conn->in.dechunkingState != ConnStateData::chunkParsing); + } + } + /* Ok, all headers are received */ http = new ClientHttpRequest(conn); @@ -1962,6 +1990,17 @@ debugs(33, 5, "parseHttpRequest: Request Header is\n" <<(hp->buf) + hp->hdr_start); + /* set url */ + /* + * XXX this should eventually not use a malloc'ed buffer; the transformation code + * below needs to be modified to not expect a mutable nul-terminated string. + */ + char *url = (char *)xmalloc(hp->u_end - hp->u_start + 16); + + memcpy(url, hp->buf + hp->u_start, hp->u_end - hp->u_start + 1); + + url[hp->u_end - hp->u_start + 1] = '\0'; + #if THIS_VIOLATES_HTTP_SPECS_ON_URL_TRANSFORMATION if ((t = strchr(url, '#'))) /* remove HTML anchors */ @@ -2099,6 +2138,11 @@ int connKeepReadingIncompleteRequest(ConnStateData::Pointer & conn) { + // when we read chunked requests, the entire body is buffered + // XXX: this check ignores header size and its limits. + if (conn->in.dechunkingState == ConnStateData::chunkParsing) + return conn->in.notYetUsed < Config.maxChunkedRequestBodySize; + return conn->in.notYetUsed >= Config.maxRequestHeaderSize ? 0 : 1; } @@ -2108,8 +2152,13 @@ ClientSocketContext *context = parseHttpRequestAbort(conn, "error:request-too-large"); clientStreamNode *node = context->getClientReplyContext(); assert(!connKeepReadingIncompleteRequest(conn)); - debugs(33, 1, "Request header is too large (" << conn->in.notYetUsed << " bytes)"); - debugs(33, 1, "Config 'request_header_max_size'= " << Config.maxRequestHeaderSize << " bytes."); + if (conn->in.dechunkingState == ConnStateData::chunkParsing) { + debugs(33, 1, "Chunked request is too large (" << conn->in.notYetUsed << " bytes)"); + debugs(33, 1, "Config 'chunked_request_body_max_size'= " << Config.maxChunkedRequestBodySize << " bytes."); + } else { + debugs(33, 1, "Request header is too large (" << conn->in.notYetUsed << " bytes)"); + debugs(33, 1, "Config 'request_header_max_size'= " << Config.maxRequestHeaderSize << " bytes."); + } clientReplyContext *repContext = dynamic_cast(node->data.getRaw()); assert (repContext); repContext->setReplyToError(ERR_TOO_BIG, @@ -2155,6 +2204,9 @@ ClientHttpRequest *http = context->http; HttpRequest *request = NULL; bool notedUseOfBuffer = false; + bool tePresent = false; + bool deChunked = false; + bool unsupportedTe = false; /* We have an initial client stream in place should it be needed */ /* setup our private context */ @@ -2238,8 +2290,17 @@ request->my_port = ntohs(conn->me.sin_port); request->http_ver = http_ver; - if (!urlCheckRequest(request) || - request->header.has(HDR_TRANSFER_ENCODING)) { + tePresent = request->header.has(HDR_TRANSFER_ENCODING); + deChunked = conn->in.dechunkingState == ConnStateData::chunkReady; + if (deChunked) { + assert(tePresent); + request->setContentLength(conn->in.dechunked.contentSize()); + request->header.delById(HDR_TRANSFER_ENCODING); + conn->finishDechunkingRequest(hp); + } + + unsupportedTe = tePresent && !deChunked; + if (!urlCheckRequest(request) || unsupportedTe) { clientStreamNode *node = context->getClientReplyContext(); clientReplyContext *repContext = dynamic_cast(node->data.getRaw()); assert (repContext); @@ -2569,13 +2630,73 @@ { assert(bodyPipe != NULL); - if (const size_t putSize = bodyPipe->putMoreData(in.buf, in.notYetUsed)) - connNoteUseOfBuffer(this, putSize); + size_t putSize = 0; + +#if FUTURE_CODE_TO_SUPPORT_CHUNKED_REQUESTS + // The code below works, in principle, but we cannot do dechunking + // on-the-fly because that would mean sending chunked requests to + // the next hop. Squid lacks logic to determine which servers can + // receive chunk requests. + // The error generation code probably needs more work. + if (in.bodyParser) { // chunked body + debugs(33,5, HERE << "handling chunked request body for FD " << fd); + bool malformedChunks = false; + + MemBuf raw; // ChunkedCodingParser only works with MemBufs + raw.init(in.notYetUsed, in.notYetUsed); + raw.append(in.buf, in.notYetUsed); + try { // the parser will throw on errors + const mb_size_t wasContentSize = raw.contentSize(); + BodyPipeCheckout bpc(*bodyPipe); + const bool parsed = in.bodyParser->parse(&raw, &bpc.buf); + bpc.checkIn(); + putSize = wasContentSize - raw.contentSize(); + + if (parsed) { + stopProducingFor(bodyPipe, true); // this makes bodySize known + } else { + // parser needy state must imply body pipe needy state + if (in.bodyParser->needsMoreData() && + !bodyPipe->mayNeedMoreData()) + malformedChunks = true; + // XXX: if bodyParser->needsMoreSpace, how can we guarantee it? + } + } catch (...) { // XXX: be more specific + malformedChunks = true; + } + + if (malformedChunks) { + if (bodyPipe != NULL) + stopProducingFor(bodyPipe, false); + + ClientSocketContext::Pointer context = getCurrentContext(); + if (!context->http->out.offset) { + clientStreamNode *node = context->getClientReplyContext(); + clientReplyContext *repContext = dynamic_cast(node->data.getRaw()); + assert (repContext); + repContext->setReplyToError(ERR_INVALID_REQ, HTTP_BAD_REQUEST, + METHOD_NONE, NULL, &peer.sin_addr, + NULL, NULL, NULL); + context->pullData(); + } + flags.readMoreRequests = false; + return; // XXX: is that sufficient to generate an error? + } + } else // identity encoding +#endif + { + debugs(33,5, HERE << "handling plain request body for FD " << fd); + putSize = bodyPipe->putMoreData(in.buf, in.notYetUsed); + if (!bodyPipe->mayNeedMoreData()) { + // BodyPipe will clear us automagically when we produced everything + bodyPipe = NULL; + } + } - if (!bodyPipe->mayNeedMoreData()) { - // BodyPipe will clear us automagically when we produced everything - bodyPipe = NULL; + if (putSize > 0) + connNoteUseOfBuffer(this, putSize); + if (!bodyPipe) { debugs(33,5, HERE << "produced entire request body for FD " << fd); if (closing()) { @@ -3281,17 +3402,119 @@ bodyPipe->enableAutoConsumption(); } +// initialize dechunking state +void +ConnStateData::startDechunkingRequest(HttpParser *hp) +{ + debugs(33, 5, HERE << "start dechunking at " << HttpParserRequestLen(hp)); + assert(in.dechunkingState == chunkUnknown); + assert(!in.bodyParser); + in.bodyParser = new ChunkedCodingParser; + in.chunkedSeen = HttpParserRequestLen(hp); // skip headers when dechunking + in.chunked.init(); // TODO: should we have a smaller-than-default limit? + in.dechunked.init(); + in.dechunkingState = chunkParsing; +} + +// put parsed content into input buffer and clean up +void +ConnStateData::finishDechunkingRequest(HttpParser *hp) +{ + debugs(33, 5, HERE << "finish dechunking; content: " << in.dechunked.contentSize()); + + assert(in.dechunkingState == chunkReady); + assert(in.bodyParser); + delete in.bodyParser; + in.bodyParser = NULL; + + const mb_size_t headerSize = HttpParserRequestLen(hp); + + // dechunking cannot make data bigger + assert(headerSize + in.dechunked.contentSize() + in.chunked.contentSize() + <= static_cast(in.notYetUsed)); + assert(in.notYetUsed <= in.allocatedSize); + + // copy dechunked content + char *end = in.buf + headerSize; + xmemmove(end, in.dechunked.content(), in.dechunked.contentSize()); + end += in.dechunked.contentSize(); + + // copy post-chunks leftovers, if any, caused by request pipelining? + if (in.chunked.contentSize()) { + xmemmove(end, in.chunked.content(), in.chunked.contentSize()); + end += in.chunked.contentSize(); + } + + in.notYetUsed = end - in.buf; + + in.chunked.clean(); + in.dechunked.clean(); + in.dechunkingState = chunkUnknown; +} + +// parse newly read request chunks and buffer them for finishDechunkingRequest +// returns true iff needs more data +bool +ConnStateData::parseRequestChunks(HttpParser *) +{ + debugs(33,5, HERE << "parsing chunked request body at " << + in.chunkedSeen << " < " << in.notYetUsed); + assert(in.bodyParser); + assert(in.dechunkingState == chunkParsing); + + assert(in.chunkedSeen <= in.notYetUsed); + const mb_size_t fresh = in.notYetUsed - in.chunkedSeen; + + // be safe: count some chunked coding metadata towards the total body size + if (fresh + in.dechunked.contentSize() > Config.maxChunkedRequestBodySize) { + debugs(33,3, HERE << "chunked body (" << fresh << " + " << + in.dechunked.contentSize() << " may exceed " << + "chunked_request_body_max_size=" << + Config.maxChunkedRequestBodySize); + in.dechunkingState = chunkError; + return false; + } + + if (fresh > in.chunked.potentialSpaceSize()) { + // should not happen if Config.maxChunkedRequestBodySize is reasonable + debugs(33,1, HERE << "request_body_max_size exceeds chunked buffer " << + "size: " << fresh << " + " << in.chunked.contentSize() << " > " << + in.chunked.potentialSpaceSize() << " with " << + "chunked_request_body_max_size=" << + Config.maxChunkedRequestBodySize); + in.dechunkingState = chunkError; + return false; + } + in.chunked.append(in.buf + in.chunkedSeen, fresh); + in.chunkedSeen += fresh; + + try { // the parser will throw on errors + if (in.bodyParser->parse(&in.chunked, &in.dechunked)) + in.dechunkingState = chunkReady; // successfully parsed all chunks + else + return true; // need more, keep the same state + } catch (...) { + debugs(33,3, HERE << "chunk parsing error"); + in.dechunkingState = chunkError; + } + return false; // error, unsupported, or done +} + char * ConnStateData::In::addressToReadInto() const { return buf + notYetUsed; } -ConnStateData::In::In() : buf (NULL), notYetUsed (0), allocatedSize (0) +ConnStateData::In::In() : bodyParser(NULL), + buf (NULL), notYetUsed (0), allocatedSize (0), + dechunkingState(ConnStateData::chunkUnknown) {} ConnStateData::In::~In() { if (allocatedSize) memFreeBuf(allocatedSize, buf); + if (bodyParser) + delete bodyParser; // TODO: pool } diff -u -r -N squid-3.0.STABLE15/src/client_side.h squid-3.0.STABLE16-RC1/src/client_side.h --- squid-3.0.STABLE15/src/client_side.h 2009-05-06 23:11:41.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/client_side.h 2009-05-16 00:47:57.000000000 +1200 @@ -46,6 +46,9 @@ class AuthUserRequest; +class ChunkedCodingParser; +class HttpParser; + template class Range; @@ -149,14 +152,23 @@ int fd; + /// chunk buffering and parsing algorithm state + typedef enum { chunkUnknown, chunkNone, chunkParsing, chunkReady, chunkError } DechunkingState; + struct In { In(); ~In(); char *addressToReadInto() const; + + ChunkedCodingParser *bodyParser; ///< parses chunked request body + MemBuf chunked; ///< contains unparsed raw (chunked) body data + MemBuf dechunked; ///< accumulates parsed (dechunked) content char *buf; size_t notYetUsed; size_t allocatedSize; + size_t chunkedSeen; ///< size of processed or ignored raw read data + DechunkingState dechunkingState; ///< request dechunking state } in; int64_t bodySizeLeft(); @@ -208,6 +220,10 @@ void handleReadData(char *buf, size_t size); void handleRequestBodyData(); + void startDechunkingRequest(HttpParser *hp); + bool parseRequestChunks(HttpParser *hp); + void finishDechunkingRequest(HttpParser *hp); + private: CBDATA_CLASS2(ConnStateData); bool transparent_; diff -u -r -N squid-3.0.STABLE15/src/helper.cc squid-3.0.STABLE16-RC1/src/helper.cc --- squid-3.0.STABLE15/src/helper.cc 2009-05-06 23:11:41.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/helper.cc 2009-05-16 00:47:58.000000000 +1200 @@ -1548,6 +1548,7 @@ && !srv->deferred_requests) { int wfd = srv->wfd; srv->wfd = -1; + srv->flags.closing=1; comm_close(wfd); } else { if (srv->queue.head) diff -u -r -N squid-3.0.STABLE15/src/http.cc squid-3.0.STABLE16-RC1/src/http.cc --- squid-3.0.STABLE15/src/http.cc 2009-05-06 23:11:41.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/http.cc 2009-05-16 00:47:58.000000000 +1200 @@ -56,6 +56,16 @@ #include "DelayPools.h" #endif #include "SquidTime.h" +#include "TextException.h" + +#define SQUID_ENTER_THROWING_CODE() try { +#define SQUID_EXIT_THROWING_CODE(status) \ + status = true; \ + } \ + catch (const TextException &e) { \ + debugs (11, 1, "Exception error:" << e.message); \ + status = false; \ + } CBDATA_CLASS_INIT(HttpStateData); @@ -68,7 +78,7 @@ HttpHeader * hdr_out, int we_do_ranges, http_state_flags); HttpStateData::HttpStateData(FwdState *theFwdState) : ServerStateData(theFwdState), - header_bytes_read(0), reply_bytes_read(0) + lastChunk(0), header_bytes_read(0), reply_bytes_read(0), httpChunkDecoder(NULL) { debugs(11,5,HERE << "HttpStateData " << this << " created"); ignoreCacheControl = false; @@ -119,7 +129,6 @@ entry->setNoDelay(_peer->options.no_delay); #endif - } /* @@ -139,6 +148,9 @@ delete readBuf; + if(httpChunkDecoder) + delete httpChunkDecoder; + HTTPMSGUNLOCK(orig_request); debugs(11,5, HERE << "HttpStateData " << this << " destroyed; FD " << fd); @@ -735,6 +747,12 @@ readBuf->consume(header_bytes_read); } + flags.chunked = 0; + if (newrep->header.hasListMember(HDR_TRANSFER_ENCODING, "chunked", ',')) { + flags.chunked = 1; + httpChunkDecoder = new ChunkedCodingParser; + } + HttpReply *vrep = setVirginReply(newrep); flags.headers_parsed = 1; @@ -899,6 +917,13 @@ if (eof) // already reached EOF return COMPLETE_NONPERSISTENT_MSG; + /* In chunked responce we do not know the content length but we are absolutelly + * sure about the end of response, so we are calling the statusIfComplete to + * decide if we can be persistant + */ + if (lastChunk && flags.chunked) + return statusIfComplete(); + const int64_t clen = vrep->bodySize(request->method); debugs(11, 5, "persistentConnStatus: clen=" << clen); @@ -1098,10 +1123,31 @@ { const char *data = readBuf->content(); int len = readBuf->contentSize(); - addVirginReplyBody(data, len); readBuf->consume(len); +} +bool +HttpStateData::decodeAndWriteReplyBody() +{ + const char *data = NULL; + int len; + bool status = false; + assert(flags.chunked); + assert(httpChunkDecoder); + SQUID_ENTER_THROWING_CODE(); + MemBuf decodedData; + decodedData.init(); + const bool done = httpChunkDecoder->parse(readBuf,&decodedData); + len = decodedData.contentSize(); + data=decodedData.content(); + addVirginReplyBody(data, len); + if (done) { + lastChunk = 1; + flags.do_next_read = 0; + } + SQUID_EXIT_THROWING_CODE(status); + return status; } /* @@ -1134,7 +1180,15 @@ * That means header content has been removed from readBuf and * it contains only body data. */ - writeReplyBody(); + if(flags.chunked){ + if(!decodeAndWriteReplyBody()){ + flags.do_next_read = 0; + serverComplete(); + return; + } + } + else + writeReplyBody(); if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { /* diff -u -r -N squid-3.0.STABLE15/src/http.h squid-3.0.STABLE16-RC1/src/http.h --- squid-3.0.STABLE15/src/http.h 2009-05-06 23:11:41.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/http.h 2009-05-16 00:47:58.000000000 +1200 @@ -1,6 +1,6 @@ /* - * $Id: http.h,v 1.32 2007/08/09 23:30:53 rousskov Exp $ + * $Id: http.h,v 1.33 2007/12/26 23:39:55 hno Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -38,6 +38,7 @@ #include "comm.h" #include "forward.h" #include "Server.h" +#include "ChunkedCodingParser.h" class HttpStateData : public ServerStateData { @@ -65,6 +66,7 @@ peer *_peer; /* peer request made to */ int eof; /* reached end-of-object? */ + int lastChunk; /* reached last chunk of a chunk-encoded reply */ HttpRequest *orig_request; int fd; http_state_flags flags; @@ -103,6 +105,7 @@ virtual void handleRequestBodyProducerAborted(); void writeReplyBody(); + bool decodeAndWriteReplyBody(); void doneSendingRequestBody(); void requestBodyHandler(MemBuf &); virtual void sentRequestBody(int fd, size_t size, comm_err_t errflag); @@ -113,6 +116,7 @@ http_state_flags flags); static bool decideIfWeDoRanges (HttpRequest * orig_request); + ChunkedCodingParser *httpChunkDecoder; private: CBDATA_CLASS2(HttpStateData); }; diff -u -r -N squid-3.0.STABLE15/src/HttpMsg.cc squid-3.0.STABLE16-RC1/src/HttpMsg.cc --- squid-3.0.STABLE15/src/HttpMsg.cc 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/HttpMsg.cc 2009-05-16 00:47:57.000000000 +1200 @@ -309,6 +309,14 @@ return -1; } +void +HttpMsg::setContentLength(int64_t clen) +{ + header.delById(HDR_CONTENT_LENGTH); // if any + header.putInt64(HDR_CONTENT_LENGTH, clen); + content_length = clen; +} + /* returns true if connection should be "persistent" * after processing this message */ int diff -u -r -N squid-3.0.STABLE15/src/HttpMsg.h squid-3.0.STABLE16-RC1/src/HttpMsg.h --- squid-3.0.STABLE15/src/HttpMsg.h 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/HttpMsg.h 2009-05-16 00:47:57.000000000 +1200 @@ -55,6 +55,9 @@ virtual HttpMsg *_lock(); // please use HTTPMSGLOCK() virtual void _unlock(); // please use HTTPMSGUNLOCK() + /// [re]sets Content-Length header and cached value + void setContentLength(int64_t clen); + public: HttpVersion http_ver; @@ -104,7 +107,8 @@ }; /* Temporary parsing state; might turn into the replacement parser later on */ -struct _HttpParser { +class HttpParser { +public: char state; const char *buf; int bufsiz; @@ -115,7 +119,6 @@ int v_start, v_end; int v_maj, v_min; }; -typedef struct _HttpParser HttpParser; extern void HttpParserInit(HttpParser *, const char *buf, int len); extern int HttpParserParseReqLine(HttpParser *hp); diff -u -r -N squid-3.0.STABLE15/src/ICAP/ChunkedCodingParser.cc squid-3.0.STABLE16-RC1/src/ICAP/ChunkedCodingParser.cc --- squid-3.0.STABLE15/src/ICAP/ChunkedCodingParser.cc 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/ICAP/ChunkedCodingParser.cc 1970-01-01 12:00:00.000000000 +1200 @@ -1,245 +0,0 @@ -#include "squid.h" -#include "Parsing.h" -#include "TextException.h" -#include "ChunkedCodingParser.h" -#include "MemBuf.h" - -ChunkedCodingParser::Step ChunkedCodingParser::psChunkBeg = &ChunkedCodingParser::parseChunkBeg; -ChunkedCodingParser::Step ChunkedCodingParser::psChunkBody = &ChunkedCodingParser::parseChunkBody; -ChunkedCodingParser::Step ChunkedCodingParser::psChunkEnd = &ChunkedCodingParser::parseChunkEnd; -ChunkedCodingParser::Step ChunkedCodingParser::psTrailer = &ChunkedCodingParser::parseTrailer; -ChunkedCodingParser::Step ChunkedCodingParser::psMessageEnd = &ChunkedCodingParser::parseMessageEnd; - -ChunkedCodingParser::ChunkedCodingParser() -{ - reset(); -} - -void ChunkedCodingParser::reset() -{ - theStep = psChunkBeg; - theChunkSize = theLeftBodySize = 0; - doNeedMoreData = false; - sawIeof = false; - theIn = theOut = NULL; -} - -bool ChunkedCodingParser::parse(MemBuf *rawData, MemBuf *parsedContent) -{ - Must(rawData && parsedContent); - theIn = rawData; - theOut = parsedContent; - - // we must reset this all the time so that mayContinue() lets us - // output more content if we stopped due to needsMoreSpace() before - doNeedMoreData = !theIn->hasContent(); - - while (mayContinue()) { - (this->*theStep)(); - } - - return theStep == psMessageEnd; -} - -bool ChunkedCodingParser::needsMoreData() const -{ - return doNeedMoreData; -} - -bool ChunkedCodingParser::needsMoreSpace() const -{ - assert(theOut); - return theStep == psChunkBody && !theOut->hasPotentialSpace(); -} - -bool ChunkedCodingParser::mayContinue() const -{ - return !needsMoreData() && !needsMoreSpace() && theStep != psMessageEnd; -} - -void ChunkedCodingParser::parseChunkBeg() -{ - Must(theChunkSize <= 0); // Should(), really - - size_t crlfBeg = 0; - size_t crlfEnd = 0; - - if (findCrlf(crlfBeg, crlfEnd)) { - debugs(93,7, "found chunk-size end: " << crlfBeg << "-" << crlfEnd); - int64_t size = -1; - const char *p = 0; - - if (StringToInt64(theIn->content(), size, &p, 16)) { - if (size < 0) { - throw TexcHere("negative chunk size"); - return; - } - - // check for ieof chunk extension in the last-chunk - if (size == 0 && p && *p++ == ';') { - const char *e = theIn->content() + crlfBeg; // end of extension - - while (p < e && xisspace(*p)) - ++p; // skip space - - sawIeof = e - p >= 4 && - strncmp(p, "ieof", 4) == 0 && - xisspace(p[4]); - } - - theIn->consume(crlfEnd); - theChunkSize = theLeftBodySize = size; - debugs(93,7, "found chunk: " << theChunkSize); - theStep = theChunkSize == 0 ? psTrailer : psChunkBody; - return; - } - - throw TexcHere("corrupted chunk size"); - } - - doNeedMoreData = true; -} - -void ChunkedCodingParser::parseChunkBody() -{ - Must(theLeftBodySize > 0); // Should, really - - const size_t availSize = XMIN(theLeftBodySize, (uint64_t)theIn->contentSize()); - const size_t safeSize = XMIN(availSize, (size_t)theOut->potentialSpaceSize()); - - doNeedMoreData = availSize < theLeftBodySize; - // and we may also need more space - - theOut->append(theIn->content(), safeSize); - theIn->consume(safeSize); - theLeftBodySize -= safeSize; - - if (theLeftBodySize == 0) - theStep = psChunkEnd; - else - Must(needsMoreData() || needsMoreSpace()); -} - -void ChunkedCodingParser::parseChunkEnd() -{ - Must(theLeftBodySize == 0); // Should(), really - - size_t crlfBeg = 0; - size_t crlfEnd = 0; - - if (findCrlf(crlfBeg, crlfEnd)) { - if (crlfBeg != 0) { - throw TexcHere("found data bewteen chunk end and CRLF"); - return; - } - - theIn->consume(crlfEnd); - theChunkSize = 0; // done with the current chunk - theStep = psChunkBeg; - return; - } - - doNeedMoreData = true; -} - -void ChunkedCodingParser::parseTrailer() -{ - Must(theChunkSize == 0); // Should(), really - - while (mayContinue()) - parseTrailerHeader(); -} - -void ChunkedCodingParser::parseTrailerHeader() -{ - size_t crlfBeg = 0; - size_t crlfEnd = 0; - - if (findCrlf(crlfBeg, crlfEnd)) { - if (crlfBeg > 0) - - ; //theTrailer.append(theIn->content(), crlfEnd); - - theIn->consume(crlfEnd); - - if (crlfBeg == 0) - theStep = psMessageEnd; - - return; - } - - doNeedMoreData = true; -} - -void ChunkedCodingParser::parseMessageEnd() -{ - // termination step, should not be called - Must(false); // Should(), really -} - -// finds next CRLF -bool ChunkedCodingParser::findCrlf(size_t &crlfBeg, size_t &crlfEnd) -{ - // XXX: This code was copied, with permission, from another software. - // There is a similar and probably better code inside httpHeaderParse - // but it seems difficult to isolate due to parsing-unrelated bloat. - // Such isolation should probably be done before this class is used - // for handling of traffic "more external" than ICAP. - - const char *buf = theIn->content(); - size_t size = theIn->contentSize(); - - ssize_t crOff = -1; - bool quoted = false; - bool slashed = false; - - for (size_t i = 0; i < size; ++i) { - if (slashed) { - slashed = false; - continue; - } - - const char c = buf[i]; - - // handle quoted strings - if (quoted) { - if (c == '\\') - slashed = true; - else - if (c == '"') - quoted = false; - - continue; - } else - if (c == '"') { - quoted = true; - crOff = -1; - continue; - } - - if (crOff < 0) { // looking for the first CR or LF - - if (c == '\n') { - crlfBeg = i; - crlfEnd = ++i; - return true; - } - - if (c == '\r') - crOff = i; - } else { // skipping CRs, looking for the first LF - - if (c == '\n') { - crlfBeg = crOff; - crlfEnd = ++i; - return true; - } - - if (c != '\r') - crOff = -1; - } - } - - return false; -} - diff -u -r -N squid-3.0.STABLE15/src/ICAP/ChunkedCodingParser.h squid-3.0.STABLE16-RC1/src/ICAP/ChunkedCodingParser.h --- squid-3.0.STABLE15/src/ICAP/ChunkedCodingParser.h 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/ICAP/ChunkedCodingParser.h 1970-01-01 12:00:00.000000000 +1200 @@ -1,90 +0,0 @@ - -/* - * $Id: ChunkedCodingParser.h,v 1.3 2007/08/13 17:20:53 hno Exp $ - * - * SQUID Web Proxy Cache http://www.squid-cache.org/ - * ---------------------------------------------------------- - * - * Squid is the result of efforts by numerous individuals from - * the Internet community; see the CONTRIBUTORS file for full - * details. Many organizations have provided support for Squid's - * development; see the SPONSORS file for full details. Squid is - * Copyrighted (C) 2001 by the Regents of the University of - * California; see the COPYRIGHT file for full details. Squid - * incorporates software developed and/or copyrighted by other - * sources; see the CREDITS file for full details. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. - * - */ - -#ifndef SQUID_CHUNKEDCODINGPARSER_H -#define SQUID_CHUNKEDCODINGPARSER_H - -#include "RefCount.h" - -// ChunkedCodingParser is an incremental parser for chunked transfer coding -// used by HTTP and ICAP. The parser shovels content bytes from the raw -// input buffer into the content output buffer, both caller-supplied. -// Ignores chunk extensions except for ICAP's ieof. -// Has a trailer-handling placeholder. - -class ChunkedCodingParser -{ - -public: - ChunkedCodingParser(); - - void reset(); - - // true = complete success; false == needs more data - bool parse(MemBuf *rawData, MemBuf *parsedContent); // throws on error - - bool needsMoreData() const; - bool needsMoreSpace() const; - bool sawIeof; // saw ieof chunk extension after a 0-size chunk - -private: - typedef void (ChunkedCodingParser::*Step)(); - -private: - bool mayContinue() const; - - void parseChunkBeg(); - void parseChunkBody(); - void parseChunkEnd(); - void parseTrailer(); - void parseTrailerHeader(); - void parseMessageEnd(); - - bool findCrlf(size_t &crlfBeg, size_t &crlfEnd); - -private: - static Step psChunkBeg; - static Step psChunkBody; - static Step psChunkEnd; - static Step psTrailer; - static Step psMessageEnd; - - MemBuf *theIn; - MemBuf *theOut; - - Step theStep; - uint64_t theChunkSize; - uint64_t theLeftBodySize; - bool doNeedMoreData; -}; - -#endif /* SQUID_CHUNKEDCODINGPARSER_H */ diff -u -r -N squid-3.0.STABLE15/src/ICAP/TextException.cc squid-3.0.STABLE16-RC1/src/ICAP/TextException.cc --- squid-3.0.STABLE15/src/ICAP/TextException.cc 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/ICAP/TextException.cc 1970-01-01 12:00:00.000000000 +1200 @@ -1,27 +0,0 @@ -#include "squid.h" -#include "TextException.h" - -TextException::TextException(const char *aMsg, const char *aFileName, int aLineNo): - message(xstrdup(aMsg)), theFileName(aFileName), theLineNo(aLineNo) -{} - -TextException::~TextException() -{ - xfree(message); -} - -void Throw(const char *message, const char *fileName, int lineNo) -{ - - // or should we let the exception recepient print the exception instead? - - if (fileName) { - debugs(0, 3, fileName << ':' << lineNo << ": exception" << - (message ? ": " : ".") << (message ? message : "")); - } else { - debugs(0, 3, "exception" << - (message ? ": " : ".") << (message ? message : "")); - } - - throw TextException(message, fileName, lineNo); -} diff -u -r -N squid-3.0.STABLE15/src/ICAP/TextException.h squid-3.0.STABLE16-RC1/src/ICAP/TextException.h --- squid-3.0.STABLE15/src/ICAP/TextException.h 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/ICAP/TextException.h 1970-01-01 12:00:00.000000000 +1200 @@ -1,46 +0,0 @@ -#ifndef SQUID__TEXTEXCEPTION_H -#define SQUID__TEXTEXCEPTION_H - -// Origin: xstd/TextException - - -// simple exception to report custom errors -// we may want to change the interface to be able to report system errors - -class TextException -{ - -public: - TextException(const char *aMessage, const char *aFileName = 0, int aLineNo = -1); - ~TextException(); - - // ostream &print(ostream &os) const; - -public: - char *message; // read-only - -protected: - // optional location information - const char *theFileName; - int theLineNo; -}; - -//inline -//ostream &operator <<(ostream &os, const TextException &exx) { -// return exx.print(os); -//} - -#if !defined(TexcHere) -# define TexcHere(msg) TextException((msg), __FILE__, __LINE__) -#endif - -extern void Throw(const char *message, const char *fileName, int lineNo); - -// Must(condition) is like assert(condition) but throws an exception instead -#if !defined(Must) -# define Must(cond) ((cond) ? \ - (void)0 : \ - (void)Throw(#cond, __FILE__, __LINE__)) -#endif - -#endif /* SQUID__TEXTEXCEPTION_H */ diff -u -r -N squid-3.0.STABLE15/src/Makefile.am squid-3.0.STABLE16-RC1/src/Makefile.am --- squid-3.0.STABLE15/src/Makefile.am 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/Makefile.am 2009-05-16 00:47:57.000000000 +1200 @@ -426,6 +426,8 @@ carp.cc \ cbdata.cc \ cbdata.h \ + ChunkedCodingParser.cc \ + ChunkedCodingParser.h \ client_db.cc \ client_side.cc \ client_side.h \ @@ -605,6 +607,8 @@ structs.h \ SwapDir.cc \ SwapDir.h \ + TextException.cc \ + TextException.h \ time.cc \ tools.cc \ tunnel.cc \ @@ -677,8 +681,6 @@ ICAP_libicap_a_SOURCES = \ ICAP/AsyncJob.cc \ ICAP/AsyncJob.h \ - ICAP/ChunkedCodingParser.cc \ - ICAP/ChunkedCodingParser.h \ ICAP/ICAPClient.cc \ ICAP/ICAPClient.h \ ICAP/ICAPInitiator.cc \ @@ -701,9 +703,7 @@ ICAP/ICAPServiceRep.cc \ ICAP/ICAPServiceRep.h \ ICAP/ICAPXaction.cc \ - ICAP/ICAPXaction.h \ - ICAP/TextException.cc \ - ICAP/TextException.h + ICAP/ICAPXaction.h unlinkd_SOURCES = unlinkd_daemon.cc SquidNew.cc @@ -769,6 +769,8 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ + ChunkedCodingParser.h \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -873,6 +875,8 @@ store_swapout.cc \ structs.h \ SwapDir.cc \ + TextException.cc \ + TextException.h \ tools.cc \ typedefs.h \ $(UNLINKDSOURCE) \ @@ -1305,6 +1309,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -1397,6 +1402,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -1473,6 +1479,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -1564,6 +1571,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -1627,6 +1635,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -1718,6 +1727,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -1805,6 +1815,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -1902,6 +1913,7 @@ StoreSwapLogData.cc \ String.cc \ SwapDir.cc \ + TextException.cc \ time.cc \ tools.cc \ tunnel.cc \ @@ -1966,6 +1978,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -2058,6 +2071,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -2307,6 +2321,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -2398,6 +2413,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ diff -u -r -N squid-3.0.STABLE15/src/Makefile.in squid-3.0.STABLE16-RC1/src/Makefile.in --- squid-3.0.STABLE15/src/Makefile.in 2009-05-06 23:11:40.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/Makefile.in 2009-05-16 00:47:57.000000000 +1200 @@ -77,13 +77,12 @@ ICAP_libicap_a_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_ICAP_libicap_a_OBJECTS = ICAP/AsyncJob.$(OBJEXT) \ - ICAP/ChunkedCodingParser.$(OBJEXT) ICAP/ICAPClient.$(OBJEXT) \ - ICAP/ICAPInitiator.$(OBJEXT) ICAP/ICAPInitiate.$(OBJEXT) \ - ICAP/ICAPLauncher.$(OBJEXT) ICAP/ICAPConfig.$(OBJEXT) \ - ICAP/ICAPElements.$(OBJEXT) ICAP/ICAPModXact.$(OBJEXT) \ - ICAP/ICAPOptions.$(OBJEXT) ICAP/ICAPOptXact.$(OBJEXT) \ - ICAP/ICAPServiceRep.$(OBJEXT) ICAP/ICAPXaction.$(OBJEXT) \ - ICAP/TextException.$(OBJEXT) + ICAP/ICAPClient.$(OBJEXT) ICAP/ICAPInitiator.$(OBJEXT) \ + ICAP/ICAPInitiate.$(OBJEXT) ICAP/ICAPLauncher.$(OBJEXT) \ + ICAP/ICAPConfig.$(OBJEXT) ICAP/ICAPElements.$(OBJEXT) \ + ICAP/ICAPModXact.$(OBJEXT) ICAP/ICAPOptions.$(OBJEXT) \ + ICAP/ICAPOptXact.$(OBJEXT) ICAP/ICAPServiceRep.$(OBJEXT) \ + ICAP/ICAPXaction.$(OBJEXT) ICAP_libicap_a_OBJECTS = $(am_ICAP_libicap_a_OBJECTS) libAIO_a_AR = $(AR) $(ARFLAGS) libAIO_a_LIBADD = @@ -198,7 +197,8 @@ AsyncCall.cc AsyncCall.h AsyncEngine.cc AsyncEngine.h \ authenticate.cc authenticate.h cache_cf.cc CacheDigest.cc \ cache_manager.cc CacheManager.h carp.cc cbdata.cc cbdata.h \ - client_db.cc client_side.cc client_side.h client_side_reply.cc \ + ChunkedCodingParser.cc ChunkedCodingParser.h client_db.cc \ + client_side.cc client_side.h client_side_reply.cc \ client_side_reply.h client_side_request.cc \ client_side_request.h BodyPipe.cc BodyPipe.h \ ClientRequestContext.h clientStream.cc clientStream.h CommIO.h \ @@ -261,10 +261,11 @@ StoreMetaUnpacker.h StoreMetaURL.cc StoreMetaURL.h \ StoreMetaVary.cc StoreMetaVary.h StoreSearch.h \ StoreSwapLogData.cc StoreSwapLogData.h Server.cc Server.h \ - structs.h SwapDir.cc SwapDir.h time.cc tools.cc tunnel.cc \ - typedefs.h unlinkd.cc url.cc URL.h URLScheme.cc URLScheme.h \ - urn.cc useragent.cc wccp.cc wccp2.cc whois.cc wordlist.cc \ - wordlist.h win32.cc WinSvc.cc + structs.h SwapDir.cc SwapDir.h TextException.cc \ + TextException.h time.cc tools.cc tunnel.cc typedefs.h \ + unlinkd.cc url.cc URL.h URLScheme.cc URLScheme.h urn.cc \ + useragent.cc wccp.cc wccp2.cc whois.cc wordlist.cc wordlist.h \ + win32.cc WinSvc.cc am__objects_4 = ACLARP.$(OBJEXT) @ENABLE_ARP_ACL_TRUE@am__objects_5 = $(am__objects_4) am__objects_6 = $(am__objects_5) ACLASN.$(OBJEXT) ACLBrowser.$(OBJEXT) \ @@ -323,7 +324,8 @@ asn.$(OBJEXT) AsyncCall.$(OBJEXT) AsyncEngine.$(OBJEXT) \ authenticate.$(OBJEXT) cache_cf.$(OBJEXT) \ CacheDigest.$(OBJEXT) cache_manager.$(OBJEXT) carp.$(OBJEXT) \ - cbdata.$(OBJEXT) client_db.$(OBJEXT) client_side.$(OBJEXT) \ + cbdata.$(OBJEXT) ChunkedCodingParser.$(OBJEXT) \ + client_db.$(OBJEXT) client_side.$(OBJEXT) \ client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ BodyPipe.$(OBJEXT) clientStream.$(OBJEXT) \ CompletionDispatcher.$(OBJEXT) $(am__objects_7) \ @@ -365,12 +367,12 @@ StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ - Server.$(OBJEXT) SwapDir.$(OBJEXT) time.$(OBJEXT) \ - tools.$(OBJEXT) tunnel.$(OBJEXT) $(am__objects_24) \ - url.$(OBJEXT) URLScheme.$(OBJEXT) urn.$(OBJEXT) \ - useragent.$(OBJEXT) wccp.$(OBJEXT) wccp2.$(OBJEXT) \ - whois.$(OBJEXT) wordlist.$(OBJEXT) $(am__objects_25) \ - $(am__objects_26) + Server.$(OBJEXT) SwapDir.$(OBJEXT) TextException.$(OBJEXT) \ + time.$(OBJEXT) tools.$(OBJEXT) tunnel.$(OBJEXT) \ + $(am__objects_24) url.$(OBJEXT) URLScheme.$(OBJEXT) \ + urn.$(OBJEXT) useragent.$(OBJEXT) wccp.$(OBJEXT) \ + wccp2.$(OBJEXT) whois.$(OBJEXT) wordlist.$(OBJEXT) \ + $(am__objects_25) $(am__objects_26) am__EXTRA_squid_SOURCES_DIST = fs/aufs/StoreFSaufs.cc \ fs/coss/StoreFScoss.cc fs/diskd/StoreFSdiskd.cc \ fs/null/StoreFSnull.cc fs/ufs/StoreFSufs.cc \ @@ -467,28 +469,29 @@ ACLChecklist.cc ACLProxyAuth.cc ACLStringData.cc \ ACLRegexData.cc ACLUserData.cc AsyncCall.cc authenticate.cc \ BodyPipe.cc cache_manager.cc cache_cf.cc CacheDigest.cc \ - carp.cc cbdata.cc client_db.cc client_side.cc \ - client_side_reply.cc client_side_request.cc clientStream.cc \ - comm_select.cc comm_select.h comm_select_win32.cc comm_poll.cc \ - comm_poll.h comm_epoll.cc comm_epoll.h comm_kqueue.cc \ - comm_kqueue.h ConfigOption.cc ConfigParser.cc CommonPool.h \ - CompositePoolNode.h delay_pools.cc DelayId.cc DelayId.h \ - DelayIdComposite.h DelayBucket.cc DelayBucket.h DelayConfig.cc \ - DelayConfig.h DelayPool.cc DelayPool.h DelayPools.h \ - DelaySpec.cc DelaySpec.h DelayTagged.cc DelayTagged.h \ - DelayUser.cc DelayUser.h DelayVector.cc DelayVector.h \ - NullDelayId.cc NullDelayId.h disk.cc dns_internal.cc dns.cc \ - event.cc errorpage.cc ElementList.h ESI.cc ESI.h ESIAssign.cc \ - ESIAssign.h ESIAttempt.h ESIContext.cc ESIContext.h \ - ESICustomParser.cc ESICustomParser.h ESIElement.h ESIExcept.h \ - ESIExpatParser.cc ESIExpatParser.h ESIExpression.cc \ - ESIExpression.h ESIInclude.cc ESIInclude.h ESILiteral.h \ - ESILibxml2Parser.cc ESILibxml2Parser.h ESIParser.cc \ - ESIParser.h ESISegment.cc ESISegment.h ESISequence.cc \ - ESISequence.h ESIVar.h ESIVarState.cc ESIVarState.h ETag.cc \ - external_acl.cc ExternalACLEntry.cc fd.cc fde.cc forward.cc \ - fqdncache.cc ftp.cc gopher.cc helper.cc htcp.cc htcp.h http.cc \ - HttpBody.cc HttpHeader.cc HttpHeaderTools.cc HttpHdrCc.cc \ + carp.cc cbdata.cc ChunkedCodingParser.cc client_db.cc \ + client_side.cc client_side_reply.cc client_side_request.cc \ + clientStream.cc comm_select.cc comm_select.h \ + comm_select_win32.cc comm_poll.cc comm_poll.h comm_epoll.cc \ + comm_epoll.h comm_kqueue.cc comm_kqueue.h ConfigOption.cc \ + ConfigParser.cc CommonPool.h CompositePoolNode.h \ + delay_pools.cc DelayId.cc DelayId.h DelayIdComposite.h \ + DelayBucket.cc DelayBucket.h DelayConfig.cc DelayConfig.h \ + DelayPool.cc DelayPool.h DelayPools.h DelaySpec.cc DelaySpec.h \ + DelayTagged.cc DelayTagged.h DelayUser.cc DelayUser.h \ + DelayVector.cc DelayVector.h NullDelayId.cc NullDelayId.h \ + disk.cc dns_internal.cc dns.cc event.cc errorpage.cc \ + ElementList.h ESI.cc ESI.h ESIAssign.cc ESIAssign.h \ + ESIAttempt.h ESIContext.cc ESIContext.h ESICustomParser.cc \ + ESICustomParser.h ESIElement.h ESIExcept.h ESIExpatParser.cc \ + ESIExpatParser.h ESIExpression.cc ESIExpression.h \ + ESIInclude.cc ESIInclude.h ESILiteral.h ESILibxml2Parser.cc \ + ESILibxml2Parser.h ESIParser.cc ESIParser.h ESISegment.cc \ + ESISegment.h ESISequence.cc ESISequence.h ESIVar.h \ + ESIVarState.cc ESIVarState.h ETag.cc external_acl.cc \ + ExternalACLEntry.cc fd.cc fde.cc forward.cc fqdncache.cc \ + ftp.cc gopher.cc helper.cc htcp.cc htcp.h http.cc HttpBody.cc \ + HttpHeader.cc HttpHeaderTools.cc HttpHdrCc.cc \ HttpHdrContRange.cc HttpHdrRange.cc HttpHdrSc.cc \ HttpHdrScTarget.cc HttpMsg.cc HttpReply.cc HttpStatusLine.cc \ icmp.cc icp_v2.cc icp_v3.cc ACLIdent.cc ACLIdent.h ident.cc \ @@ -506,9 +509,9 @@ store_swapout.cc StoreFileSystem.cc StoreIOState.cc \ StoreMeta.cc StoreMetaMD5.cc StoreMetaSTD.cc \ StoreMetaSTDLFS.cc StoreMetaUnpacker.cc StoreMetaURL.cc \ - StoreMetaVary.cc StoreSwapLogData.cc tools.cc tunnel.cc \ - SwapDir.cc url.cc URLScheme.cc urn.cc useragent.cc wccp2.cc \ - whois.cc win32.cc wordlist.cc + StoreMetaVary.cc StoreSwapLogData.cc TextException.cc tools.cc \ + tunnel.cc SwapDir.cc url.cc URLScheme.cc urn.cc useragent.cc \ + wccp2.cc whois.cc win32.cc wordlist.cc am_tests_testCacheManager_OBJECTS = debug.$(OBJEXT) globals.$(OBJEXT) \ HttpRequest.$(OBJEXT) HttpRequestMethod.$(OBJEXT) \ mem.$(OBJEXT) String.$(OBJEXT) \ @@ -520,12 +523,13 @@ AsyncCall.$(OBJEXT) authenticate.$(OBJEXT) BodyPipe.$(OBJEXT) \ cache_manager.$(OBJEXT) cache_cf.$(OBJEXT) \ CacheDigest.$(OBJEXT) carp.$(OBJEXT) cbdata.$(OBJEXT) \ - client_db.$(OBJEXT) client_side.$(OBJEXT) \ - client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ - clientStream.$(OBJEXT) $(am__objects_7) ConfigOption.$(OBJEXT) \ - ConfigParser.$(OBJEXT) $(am__objects_9) disk.$(OBJEXT) \ - $(am__objects_11) event.$(OBJEXT) errorpage.$(OBJEXT) \ - $(am__objects_13) ETag.$(OBJEXT) external_acl.$(OBJEXT) \ + ChunkedCodingParser.$(OBJEXT) client_db.$(OBJEXT) \ + client_side.$(OBJEXT) client_side_reply.$(OBJEXT) \ + client_side_request.$(OBJEXT) clientStream.$(OBJEXT) \ + $(am__objects_7) ConfigOption.$(OBJEXT) ConfigParser.$(OBJEXT) \ + $(am__objects_9) disk.$(OBJEXT) $(am__objects_11) \ + event.$(OBJEXT) errorpage.$(OBJEXT) $(am__objects_13) \ + ETag.$(OBJEXT) external_acl.$(OBJEXT) \ ExternalACLEntry.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \ forward.$(OBJEXT) fqdncache.$(OBJEXT) ftp.$(OBJEXT) \ gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_14) \ @@ -555,10 +559,11 @@ StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ - StoreSwapLogData.$(OBJEXT) tools.$(OBJEXT) tunnel.$(OBJEXT) \ - SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ - urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ - whois.$(OBJEXT) $(am__objects_25) wordlist.$(OBJEXT) + StoreSwapLogData.$(OBJEXT) TextException.$(OBJEXT) \ + tools.$(OBJEXT) tunnel.$(OBJEXT) SwapDir.$(OBJEXT) \ + url.$(OBJEXT) URLScheme.$(OBJEXT) urn.$(OBJEXT) \ + useragent.$(OBJEXT) wccp2.$(OBJEXT) whois.$(OBJEXT) \ + $(am__objects_25) wordlist.$(OBJEXT) nodist_tests_testCacheManager_OBJECTS = repl_modules.$(OBJEXT) \ string_arrays.$(OBJEXT) tests_testCacheManager_OBJECTS = $(am_tests_testCacheManager_OBJECTS) \ @@ -700,11 +705,11 @@ ACLProxyAuth.cc ACLStringData.cc ACLRegexData.cc \ ACLUserData.cc AsyncCall.cc authenticate.cc BodyPipe.cc \ cache_manager.cc cache_cf.cc CacheDigest.cc carp.cc cbdata.cc \ - client_db.cc client_side.cc client_side_reply.cc \ - client_side_request.cc clientStream.cc comm_select.cc \ - comm_select.h comm_select_win32.cc comm_poll.cc comm_poll.h \ - comm_epoll.cc comm_epoll.h comm_kqueue.cc comm_kqueue.h \ - ConfigOption.cc ConfigParser.cc CommonPool.h \ + ChunkedCodingParser.cc client_db.cc client_side.cc \ + client_side_reply.cc client_side_request.cc clientStream.cc \ + comm_select.cc comm_select.h comm_select_win32.cc comm_poll.cc \ + comm_poll.h comm_epoll.cc comm_epoll.h comm_kqueue.cc \ + comm_kqueue.h ConfigOption.cc ConfigParser.cc CommonPool.h \ CompositePoolNode.h delay_pools.cc DelayId.cc DelayId.h \ DelayIdComposite.h DelayBucket.cc DelayBucket.h DelayConfig.cc \ DelayConfig.h DelayPool.cc DelayPool.h DelayPools.h \ @@ -739,9 +744,9 @@ StoreFileSystem.cc StoreIOState.cc StoreMeta.cc \ StoreMetaMD5.cc StoreMetaSTD.cc StoreMetaSTDLFS.cc \ StoreMetaUnpacker.cc StoreMetaURL.cc StoreMetaVary.cc \ - StoreSwapLogData.cc tools.cc tunnel.cc SwapDir.cc url.cc \ - URLScheme.cc urn.cc useragent.cc wccp2.cc whois.cc win32.cc \ - wordlist.cc + StoreSwapLogData.cc TextException.cc tools.cc tunnel.cc \ + SwapDir.cc url.cc URLScheme.cc urn.cc useragent.cc wccp2.cc \ + whois.cc win32.cc wordlist.cc am_tests_testEvent_OBJECTS = debug.$(OBJEXT) EventLoop.$(OBJEXT) \ globals.$(OBJEXT) HttpRequest.$(OBJEXT) \ HttpRequestMethod.$(OBJEXT) mem.$(OBJEXT) \ @@ -754,12 +759,13 @@ AsyncCall.$(OBJEXT) authenticate.$(OBJEXT) BodyPipe.$(OBJEXT) \ cache_manager.$(OBJEXT) cache_cf.$(OBJEXT) \ CacheDigest.$(OBJEXT) carp.$(OBJEXT) cbdata.$(OBJEXT) \ - client_db.$(OBJEXT) client_side.$(OBJEXT) \ - client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ - clientStream.$(OBJEXT) $(am__objects_7) ConfigOption.$(OBJEXT) \ - ConfigParser.$(OBJEXT) $(am__objects_9) disk.$(OBJEXT) \ - $(am__objects_11) event.$(OBJEXT) errorpage.$(OBJEXT) \ - $(am__objects_13) ETag.$(OBJEXT) external_acl.$(OBJEXT) \ + ChunkedCodingParser.$(OBJEXT) client_db.$(OBJEXT) \ + client_side.$(OBJEXT) client_side_reply.$(OBJEXT) \ + client_side_request.$(OBJEXT) clientStream.$(OBJEXT) \ + $(am__objects_7) ConfigOption.$(OBJEXT) ConfigParser.$(OBJEXT) \ + $(am__objects_9) disk.$(OBJEXT) $(am__objects_11) \ + event.$(OBJEXT) errorpage.$(OBJEXT) $(am__objects_13) \ + ETag.$(OBJEXT) external_acl.$(OBJEXT) \ ExternalACLEntry.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \ forward.$(OBJEXT) fqdncache.$(OBJEXT) ftp.$(OBJEXT) \ gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_14) \ @@ -789,10 +795,10 @@ StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ - tools.$(OBJEXT) tunnel.$(OBJEXT) SwapDir.$(OBJEXT) \ - url.$(OBJEXT) URLScheme.$(OBJEXT) urn.$(OBJEXT) \ - useragent.$(OBJEXT) wccp2.$(OBJEXT) whois.$(OBJEXT) \ - $(am__objects_25) wordlist.$(OBJEXT) + TextException.$(OBJEXT) tools.$(OBJEXT) tunnel.$(OBJEXT) \ + SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ + urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ + whois.$(OBJEXT) $(am__objects_25) wordlist.$(OBJEXT) nodist_tests_testEvent_OBJECTS = repl_modules.$(OBJEXT) \ string_arrays.$(OBJEXT) tests_testEvent_OBJECTS = $(am_tests_testEvent_OBJECTS) \ @@ -807,11 +813,12 @@ acl.cc acl_noncore.cc ACLChecklist.cc ACLProxyAuth.cc \ ACLStringData.cc ACLRegexData.cc ACLUserData.cc AsyncCall.cc \ authenticate.cc BodyPipe.cc cache_manager.cc cache_cf.cc \ - CacheDigest.cc carp.cc cbdata.cc client_db.cc client_side.cc \ - client_side_reply.cc client_side_request.cc clientStream.cc \ - comm_select.cc comm_select.h comm_select_win32.cc comm_poll.cc \ - comm_poll.h comm_epoll.cc comm_epoll.h comm_kqueue.cc \ - comm_kqueue.h ConfigOption.cc ConfigParser.cc CommonPool.h \ + CacheDigest.cc carp.cc cbdata.cc ChunkedCodingParser.cc \ + client_db.cc client_side.cc client_side_reply.cc \ + client_side_request.cc clientStream.cc comm_select.cc \ + comm_select.h comm_select_win32.cc comm_poll.cc comm_poll.h \ + comm_epoll.cc comm_epoll.h comm_kqueue.cc comm_kqueue.h \ + ConfigOption.cc ConfigParser.cc CommonPool.h \ CompositePoolNode.h delay_pools.cc DelayId.cc DelayId.h \ DelayIdComposite.h DelayBucket.cc DelayBucket.h DelayConfig.cc \ DelayConfig.h DelayPool.cc DelayPool.h DelayPools.h \ @@ -846,9 +853,9 @@ StoreFileSystem.cc StoreIOState.cc StoreMeta.cc \ StoreMetaMD5.cc StoreMetaSTD.cc StoreMetaSTDLFS.cc \ StoreMetaUnpacker.cc StoreMetaURL.cc StoreMetaVary.cc \ - StoreSwapLogData.cc tools.cc tunnel.cc SwapDir.cc url.cc \ - URLScheme.cc urn.cc useragent.cc wccp2.cc whois.cc win32.cc \ - wordlist.cc + StoreSwapLogData.cc TextException.cc tools.cc tunnel.cc \ + SwapDir.cc url.cc URLScheme.cc urn.cc useragent.cc wccp2.cc \ + whois.cc win32.cc wordlist.cc am_tests_testEventLoop_OBJECTS = debug.$(OBJEXT) EventLoop.$(OBJEXT) \ globals.$(OBJEXT) HttpRequest.$(OBJEXT) \ HttpRequestMethod.$(OBJEXT) mem.$(OBJEXT) \ @@ -861,12 +868,13 @@ AsyncCall.$(OBJEXT) authenticate.$(OBJEXT) BodyPipe.$(OBJEXT) \ cache_manager.$(OBJEXT) cache_cf.$(OBJEXT) \ CacheDigest.$(OBJEXT) carp.$(OBJEXT) cbdata.$(OBJEXT) \ - client_db.$(OBJEXT) client_side.$(OBJEXT) \ - client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ - clientStream.$(OBJEXT) $(am__objects_7) ConfigOption.$(OBJEXT) \ - ConfigParser.$(OBJEXT) $(am__objects_9) disk.$(OBJEXT) \ - $(am__objects_11) event.$(OBJEXT) errorpage.$(OBJEXT) \ - $(am__objects_13) ETag.$(OBJEXT) external_acl.$(OBJEXT) \ + ChunkedCodingParser.$(OBJEXT) client_db.$(OBJEXT) \ + client_side.$(OBJEXT) client_side_reply.$(OBJEXT) \ + client_side_request.$(OBJEXT) clientStream.$(OBJEXT) \ + $(am__objects_7) ConfigOption.$(OBJEXT) ConfigParser.$(OBJEXT) \ + $(am__objects_9) disk.$(OBJEXT) $(am__objects_11) \ + event.$(OBJEXT) errorpage.$(OBJEXT) $(am__objects_13) \ + ETag.$(OBJEXT) external_acl.$(OBJEXT) \ ExternalACLEntry.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \ forward.$(OBJEXT) fqdncache.$(OBJEXT) ftp.$(OBJEXT) \ gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_14) \ @@ -896,10 +904,10 @@ StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ - tools.$(OBJEXT) tunnel.$(OBJEXT) SwapDir.$(OBJEXT) \ - url.$(OBJEXT) URLScheme.$(OBJEXT) urn.$(OBJEXT) \ - useragent.$(OBJEXT) wccp2.$(OBJEXT) whois.$(OBJEXT) \ - $(am__objects_25) wordlist.$(OBJEXT) + TextException.$(OBJEXT) tools.$(OBJEXT) tunnel.$(OBJEXT) \ + SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ + urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ + whois.$(OBJEXT) $(am__objects_25) wordlist.$(OBJEXT) nodist_tests_testEventLoop_OBJECTS = repl_modules.$(OBJEXT) \ string_arrays.$(OBJEXT) tests_testEventLoop_OBJECTS = $(am_tests_testEventLoop_OBJECTS) \ @@ -943,28 +951,29 @@ ACLChecklist.cc ACLProxyAuth.cc ACLStringData.cc \ ACLRegexData.cc ACLUserData.cc AsyncCall.cc authenticate.cc \ BodyPipe.cc cache_manager.cc cache_cf.cc CacheDigest.cc \ - carp.cc cbdata.cc client_db.cc client_side.cc \ - client_side_reply.cc client_side_request.cc clientStream.cc \ - comm_select.cc comm_select.h comm_select_win32.cc comm_poll.cc \ - comm_poll.h comm_epoll.cc comm_epoll.h comm_kqueue.cc \ - comm_kqueue.h ConfigOption.cc ConfigParser.cc CommonPool.h \ - CompositePoolNode.h delay_pools.cc DelayId.cc DelayId.h \ - DelayIdComposite.h DelayBucket.cc DelayBucket.h DelayConfig.cc \ - DelayConfig.h DelayPool.cc DelayPool.h DelayPools.h \ - DelaySpec.cc DelaySpec.h DelayTagged.cc DelayTagged.h \ - DelayUser.cc DelayUser.h DelayVector.cc DelayVector.h \ - NullDelayId.cc NullDelayId.h disk.cc dns_internal.cc dns.cc \ - event.cc errorpage.cc ElementList.h ESI.cc ESI.h ESIAssign.cc \ - ESIAssign.h ESIAttempt.h ESIContext.cc ESIContext.h \ - ESICustomParser.cc ESICustomParser.h ESIElement.h ESIExcept.h \ - ESIExpatParser.cc ESIExpatParser.h ESIExpression.cc \ - ESIExpression.h ESIInclude.cc ESIInclude.h ESILiteral.h \ - ESILibxml2Parser.cc ESILibxml2Parser.h ESIParser.cc \ - ESIParser.h ESISegment.cc ESISegment.h ESISequence.cc \ - ESISequence.h ESIVar.h ESIVarState.cc ESIVarState.h ETag.cc \ - external_acl.cc ExternalACLEntry.cc fd.cc fde.cc forward.cc \ - fqdncache.cc ftp.cc gopher.cc helper.cc htcp.cc htcp.h http.cc \ - HttpBody.cc HttpHeader.cc HttpHeaderTools.cc HttpHdrCc.cc \ + carp.cc cbdata.cc ChunkedCodingParser.cc client_db.cc \ + client_side.cc client_side_reply.cc client_side_request.cc \ + clientStream.cc comm_select.cc comm_select.h \ + comm_select_win32.cc comm_poll.cc comm_poll.h comm_epoll.cc \ + comm_epoll.h comm_kqueue.cc comm_kqueue.h ConfigOption.cc \ + ConfigParser.cc CommonPool.h CompositePoolNode.h \ + delay_pools.cc DelayId.cc DelayId.h DelayIdComposite.h \ + DelayBucket.cc DelayBucket.h DelayConfig.cc DelayConfig.h \ + DelayPool.cc DelayPool.h DelayPools.h DelaySpec.cc DelaySpec.h \ + DelayTagged.cc DelayTagged.h DelayUser.cc DelayUser.h \ + DelayVector.cc DelayVector.h NullDelayId.cc NullDelayId.h \ + disk.cc dns_internal.cc dns.cc event.cc errorpage.cc \ + ElementList.h ESI.cc ESI.h ESIAssign.cc ESIAssign.h \ + ESIAttempt.h ESIContext.cc ESIContext.h ESICustomParser.cc \ + ESICustomParser.h ESIElement.h ESIExcept.h ESIExpatParser.cc \ + ESIExpatParser.h ESIExpression.cc ESIExpression.h \ + ESIInclude.cc ESIInclude.h ESILiteral.h ESILibxml2Parser.cc \ + ESILibxml2Parser.h ESIParser.cc ESIParser.h ESISegment.cc \ + ESISegment.h ESISequence.cc ESISequence.h ESIVar.h \ + ESIVarState.cc ESIVarState.h ETag.cc external_acl.cc \ + ExternalACLEntry.cc fd.cc fde.cc forward.cc fqdncache.cc \ + ftp.cc gopher.cc helper.cc htcp.cc htcp.h http.cc HttpBody.cc \ + HttpHeader.cc HttpHeaderTools.cc HttpHdrCc.cc \ HttpHdrContRange.cc HttpHdrRange.cc HttpHdrSc.cc \ HttpHdrScTarget.cc HttpMsg.cc HttpReply.cc HttpStatusLine.cc \ icmp.cc icp_v2.cc icp_v3.cc ACLIdent.cc ACLIdent.h ident.cc \ @@ -982,9 +991,9 @@ store_swapout.cc StoreFileSystem.cc StoreIOState.cc \ StoreMeta.cc StoreMetaMD5.cc StoreMetaSTD.cc \ StoreMetaSTDLFS.cc StoreMetaUnpacker.cc StoreMetaURL.cc \ - StoreMetaVary.cc StoreSwapLogData.cc tools.cc tunnel.cc \ - SwapDir.cc url.cc URLScheme.cc urn.cc useragent.cc wccp2.cc \ - whois.cc win32.cc wordlist.cc + StoreMetaVary.cc StoreSwapLogData.cc TextException.cc tools.cc \ + tunnel.cc SwapDir.cc url.cc URLScheme.cc urn.cc useragent.cc \ + wccp2.cc whois.cc win32.cc wordlist.cc am_tests_testHttpRequest_OBJECTS = debug.$(OBJEXT) globals.$(OBJEXT) \ HttpRequest.$(OBJEXT) HttpRequestMethod.$(OBJEXT) \ mem.$(OBJEXT) String.$(OBJEXT) tests/testHttpRequest.$(OBJEXT) \ @@ -996,12 +1005,13 @@ AsyncCall.$(OBJEXT) authenticate.$(OBJEXT) BodyPipe.$(OBJEXT) \ cache_manager.$(OBJEXT) cache_cf.$(OBJEXT) \ CacheDigest.$(OBJEXT) carp.$(OBJEXT) cbdata.$(OBJEXT) \ - client_db.$(OBJEXT) client_side.$(OBJEXT) \ - client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ - clientStream.$(OBJEXT) $(am__objects_7) ConfigOption.$(OBJEXT) \ - ConfigParser.$(OBJEXT) $(am__objects_9) disk.$(OBJEXT) \ - $(am__objects_11) event.$(OBJEXT) errorpage.$(OBJEXT) \ - $(am__objects_13) ETag.$(OBJEXT) external_acl.$(OBJEXT) \ + ChunkedCodingParser.$(OBJEXT) client_db.$(OBJEXT) \ + client_side.$(OBJEXT) client_side_reply.$(OBJEXT) \ + client_side_request.$(OBJEXT) clientStream.$(OBJEXT) \ + $(am__objects_7) ConfigOption.$(OBJEXT) ConfigParser.$(OBJEXT) \ + $(am__objects_9) disk.$(OBJEXT) $(am__objects_11) \ + event.$(OBJEXT) errorpage.$(OBJEXT) $(am__objects_13) \ + ETag.$(OBJEXT) external_acl.$(OBJEXT) \ ExternalACLEntry.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \ forward.$(OBJEXT) fqdncache.$(OBJEXT) ftp.$(OBJEXT) \ gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_14) \ @@ -1031,10 +1041,11 @@ StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ - StoreSwapLogData.$(OBJEXT) tools.$(OBJEXT) tunnel.$(OBJEXT) \ - SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ - urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ - whois.$(OBJEXT) $(am__objects_25) wordlist.$(OBJEXT) + StoreSwapLogData.$(OBJEXT) TextException.$(OBJEXT) \ + tools.$(OBJEXT) tunnel.$(OBJEXT) SwapDir.$(OBJEXT) \ + url.$(OBJEXT) URLScheme.$(OBJEXT) urn.$(OBJEXT) \ + useragent.$(OBJEXT) wccp2.$(OBJEXT) whois.$(OBJEXT) \ + $(am__objects_25) wordlist.$(OBJEXT) nodist_tests_testHttpRequest_OBJECTS = repl_modules.$(OBJEXT) \ string_arrays.$(OBJEXT) tests_testHttpRequest_OBJECTS = $(am_tests_testHttpRequest_OBJECTS) \ @@ -1140,11 +1151,11 @@ ACLProxyAuth.cc ACLStringData.cc ACLRegexData.cc \ ACLUserData.cc AsyncCall.cc authenticate.cc BodyPipe.cc \ cache_manager.cc cache_cf.cc CacheDigest.cc carp.cc cbdata.cc \ - client_db.cc client_side.cc client_side_reply.cc \ - client_side_request.cc clientStream.cc comm_select.cc \ - comm_select.h comm_select_win32.cc comm_poll.cc comm_poll.h \ - comm_epoll.cc comm_epoll.h comm_kqueue.cc comm_kqueue.h \ - ConfigOption.cc ConfigParser.cc CommonPool.h \ + ChunkedCodingParser.cc client_db.cc client_side.cc \ + client_side_reply.cc client_side_request.cc clientStream.cc \ + comm_select.cc comm_select.h comm_select_win32.cc comm_poll.cc \ + comm_poll.h comm_epoll.cc comm_epoll.h comm_kqueue.cc \ + comm_kqueue.h ConfigOption.cc ConfigParser.cc CommonPool.h \ CompositePoolNode.h delay_pools.cc DelayId.cc DelayId.h \ DelayIdComposite.h DelayBucket.cc DelayBucket.h DelayConfig.cc \ DelayConfig.h DelayPool.cc DelayPool.h DelayPools.h \ @@ -1179,8 +1190,9 @@ StoreFileSystem.cc StoreIOState.cc StoreMeta.cc \ StoreMetaMD5.cc StoreMetaSTD.cc StoreMetaSTDLFS.cc \ StoreMetaUnpacker.cc StoreMetaURL.cc StoreMetaVary.cc \ - StoreSwapLogData.cc tools.cc tunnel.cc SwapDir.cc urn.cc \ - useragent.cc wccp2.cc whois.cc win32.cc wordlist.cc + StoreSwapLogData.cc TextException.cc tools.cc tunnel.cc \ + SwapDir.cc urn.cc useragent.cc wccp2.cc whois.cc win32.cc \ + wordlist.cc am_tests_testURL_OBJECTS = debug.$(OBJEXT) url.$(OBJEXT) \ URLScheme.$(OBJEXT) globals.$(OBJEXT) HttpRequest.$(OBJEXT) \ HttpRequestMethod.$(OBJEXT) mem.$(OBJEXT) \ @@ -1193,12 +1205,13 @@ AsyncCall.$(OBJEXT) authenticate.$(OBJEXT) BodyPipe.$(OBJEXT) \ cache_manager.$(OBJEXT) cache_cf.$(OBJEXT) \ CacheDigest.$(OBJEXT) carp.$(OBJEXT) cbdata.$(OBJEXT) \ - client_db.$(OBJEXT) client_side.$(OBJEXT) \ - client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ - clientStream.$(OBJEXT) $(am__objects_7) ConfigOption.$(OBJEXT) \ - ConfigParser.$(OBJEXT) $(am__objects_9) disk.$(OBJEXT) \ - $(am__objects_11) event.$(OBJEXT) errorpage.$(OBJEXT) \ - $(am__objects_13) ETag.$(OBJEXT) external_acl.$(OBJEXT) \ + ChunkedCodingParser.$(OBJEXT) client_db.$(OBJEXT) \ + client_side.$(OBJEXT) client_side_reply.$(OBJEXT) \ + client_side_request.$(OBJEXT) clientStream.$(OBJEXT) \ + $(am__objects_7) ConfigOption.$(OBJEXT) ConfigParser.$(OBJEXT) \ + $(am__objects_9) disk.$(OBJEXT) $(am__objects_11) \ + event.$(OBJEXT) errorpage.$(OBJEXT) $(am__objects_13) \ + ETag.$(OBJEXT) external_acl.$(OBJEXT) \ ExternalACLEntry.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \ forward.$(OBJEXT) fqdncache.$(OBJEXT) ftp.$(OBJEXT) \ gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_14) \ @@ -1228,9 +1241,10 @@ StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ - tools.$(OBJEXT) tunnel.$(OBJEXT) SwapDir.$(OBJEXT) \ - urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ - whois.$(OBJEXT) $(am__objects_25) wordlist.$(OBJEXT) + TextException.$(OBJEXT) tools.$(OBJEXT) tunnel.$(OBJEXT) \ + SwapDir.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ + wccp2.$(OBJEXT) whois.$(OBJEXT) $(am__objects_25) \ + wordlist.$(OBJEXT) nodist_tests_testURL_OBJECTS = repl_modules.$(OBJEXT) \ string_arrays.$(OBJEXT) tests_testURL_OBJECTS = $(am_tests_testURL_OBJECTS) \ @@ -1285,29 +1299,30 @@ ACLProxyAuth.cc ACLStringData.cc ACLRegexData.cc \ ACLUserData.cc AsyncCall.cc authenticate.cc BodyPipe.cc \ cache_cf.cc cache_manager.cc CacheDigest.cc carp.cc cbdata.cc \ - client_db.cc client_side.cc client_side_reply.cc \ - client_side_request.cc clientStream.cc comm_select.cc \ - comm_select.h comm_select_win32.cc comm_poll.cc comm_poll.h \ - comm_epoll.cc comm_epoll.h comm_kqueue.cc comm_kqueue.h \ - ConfigOption.cc ConfigParser.cc debug.cc CommonPool.h \ - CompositePoolNode.h delay_pools.cc DelayId.cc DelayId.h \ - DelayIdComposite.h DelayBucket.cc DelayBucket.h DelayConfig.cc \ - DelayConfig.h DelayPool.cc DelayPool.h DelayPools.h \ - DelaySpec.cc DelaySpec.h DelayTagged.cc DelayTagged.h \ - DelayUser.cc DelayUser.h DelayVector.cc DelayVector.h \ - NullDelayId.cc NullDelayId.h disk.cc dns_internal.cc dns.cc \ - event.cc errorpage.cc ElementList.h ESI.cc ESI.h ESIAssign.cc \ - ESIAssign.h ESIAttempt.h ESIContext.cc ESIContext.h \ - ESICustomParser.cc ESICustomParser.h ESIElement.h ESIExcept.h \ - ESIExpatParser.cc ESIExpatParser.h ESIExpression.cc \ - ESIExpression.h ESIInclude.cc ESIInclude.h ESILiteral.h \ - ESILibxml2Parser.cc ESILibxml2Parser.h ESIParser.cc \ - ESIParser.h ESISegment.cc ESISegment.h ESISequence.cc \ - ESISequence.h ESIVar.h ESIVarState.cc ESIVarState.h ETag.cc \ - external_acl.cc ExternalACLEntry.cc fd.cc fde.cc forward.cc \ - fqdncache.cc ftp.cc globals.cc gopher.cc helper.cc htcp.cc \ - htcp.h http.cc HttpBody.cc HttpHdrCc.cc HttpHdrContRange.cc \ - HttpHdrRange.cc HttpHdrSc.cc HttpHdrScTarget.cc HttpHeader.cc \ + ChunkedCodingParser.cc client_db.cc client_side.cc \ + client_side_reply.cc client_side_request.cc clientStream.cc \ + comm_select.cc comm_select.h comm_select_win32.cc comm_poll.cc \ + comm_poll.h comm_epoll.cc comm_epoll.h comm_kqueue.cc \ + comm_kqueue.h ConfigOption.cc ConfigParser.cc debug.cc \ + CommonPool.h CompositePoolNode.h delay_pools.cc DelayId.cc \ + DelayId.h DelayIdComposite.h DelayBucket.cc DelayBucket.h \ + DelayConfig.cc DelayConfig.h DelayPool.cc DelayPool.h \ + DelayPools.h DelaySpec.cc DelaySpec.h DelayTagged.cc \ + DelayTagged.h DelayUser.cc DelayUser.h DelayVector.cc \ + DelayVector.h NullDelayId.cc NullDelayId.h disk.cc \ + dns_internal.cc dns.cc event.cc errorpage.cc ElementList.h \ + ESI.cc ESI.h ESIAssign.cc ESIAssign.h ESIAttempt.h \ + ESIContext.cc ESIContext.h ESICustomParser.cc \ + ESICustomParser.h ESIElement.h ESIExcept.h ESIExpatParser.cc \ + ESIExpatParser.h ESIExpression.cc ESIExpression.h \ + ESIInclude.cc ESIInclude.h ESILiteral.h ESILibxml2Parser.cc \ + ESILibxml2Parser.h ESIParser.cc ESIParser.h ESISegment.cc \ + ESISegment.h ESISequence.cc ESISequence.h ESIVar.h \ + ESIVarState.cc ESIVarState.h ETag.cc external_acl.cc \ + ExternalACLEntry.cc fd.cc fde.cc forward.cc fqdncache.cc \ + ftp.cc globals.cc gopher.cc helper.cc htcp.cc htcp.h http.cc \ + HttpBody.cc HttpHdrCc.cc HttpHdrContRange.cc HttpHdrRange.cc \ + HttpHdrSc.cc HttpHdrScTarget.cc HttpHeader.cc \ HttpHeaderTools.cc HttpMsg.cc HttpReply.cc HttpRequest.cc \ HttpRequestMethod.cc HttpStatusLine.cc icmp.cc icp_v2.cc \ icp_v3.cc ACLIdent.cc ACLIdent.h ident.cc int.cc internal.cc \ @@ -1325,9 +1340,9 @@ StoreIOState.cc StoreMeta.cc StoreMetaMD5.cc StoreMetaSTD.cc \ StoreMetaSTDLFS.cc StoreMetaUnpacker.cc StoreMetaURL.cc \ StoreMetaVary.cc StoreSwapLogData.cc String.cc SwapDir.cc \ - time.cc tools.cc tunnel.cc url.cc URLScheme.cc urn.cc \ - useragent.cc wccp2.cc whois.cc win32.cc wordlist.cc Packer.cc \ - MemBuf.cc + TextException.cc time.cc tools.cc tunnel.cc url.cc \ + URLScheme.cc urn.cc useragent.cc wccp2.cc whois.cc win32.cc \ + wordlist.cc Packer.cc MemBuf.cc am_tests_test_http_range_OBJECTS = tests/test_http_range.$(OBJEXT) \ access_log.$(OBJEXT) acl.$(OBJEXT) acl_noncore.$(OBJEXT) \ ACLChecklist.$(OBJEXT) ACLProxyAuth.$(OBJEXT) \ @@ -1335,7 +1350,8 @@ ACLUserData.$(OBJEXT) AsyncCall.$(OBJEXT) \ authenticate.$(OBJEXT) BodyPipe.$(OBJEXT) cache_cf.$(OBJEXT) \ cache_manager.$(OBJEXT) CacheDigest.$(OBJEXT) carp.$(OBJEXT) \ - cbdata.$(OBJEXT) client_db.$(OBJEXT) client_side.$(OBJEXT) \ + cbdata.$(OBJEXT) ChunkedCodingParser.$(OBJEXT) \ + client_db.$(OBJEXT) client_side.$(OBJEXT) \ client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ clientStream.$(OBJEXT) $(am__objects_7) ConfigOption.$(OBJEXT) \ ConfigParser.$(OBJEXT) debug.$(OBJEXT) $(am__objects_9) \ @@ -1373,10 +1389,11 @@ StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ StoreSwapLogData.$(OBJEXT) String.$(OBJEXT) SwapDir.$(OBJEXT) \ - time.$(OBJEXT) tools.$(OBJEXT) tunnel.$(OBJEXT) url.$(OBJEXT) \ - URLScheme.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ - wccp2.$(OBJEXT) whois.$(OBJEXT) $(am__objects_25) \ - wordlist.$(OBJEXT) Packer.$(OBJEXT) MemBuf.$(OBJEXT) + TextException.$(OBJEXT) time.$(OBJEXT) tools.$(OBJEXT) \ + tunnel.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ + urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ + whois.$(OBJEXT) $(am__objects_25) wordlist.$(OBJEXT) \ + Packer.$(OBJEXT) MemBuf.$(OBJEXT) nodist_tests_test_http_range_OBJECTS = repl_modules.$(OBJEXT) \ string_arrays.$(OBJEXT) tests_test_http_range_OBJECTS = $(am_tests_test_http_range_OBJECTS) \ @@ -1393,7 +1410,8 @@ StoreSwapLogData.cc StoreSwapLogData.h access_log.cc acl.cc \ acl_noncore.cc ACLChecklist.cc ACLProxyAuth.cc ACLUserData.cc \ ACLRegexData.cc ACLStringData.cc authenticate.cc cache_cf.cc \ - cache_manager.cc CacheDigest.cc carp.cc cbdata.cc client_db.cc \ + cache_manager.cc CacheDigest.cc carp.cc cbdata.cc \ + ChunkedCodingParser.cc ChunkedCodingParser.h client_db.cc \ client_side.cc client_side_reply.cc client_side_request.cc \ client_side_request.h clientStream.cc clientStream.h CommIO.h \ comm_select.cc comm_select.h comm_select_win32.cc comm_poll.cc \ @@ -1435,8 +1453,9 @@ StoreIOState.cc store_client.cc StoreClient.h store_digest.cc \ store_dir.cc store_log.cc store_rebuild.cc store_swapin.cc \ store_swapmeta.cc store_swapout.cc structs.h SwapDir.cc \ - tools.cc typedefs.h unlinkd.cc URLScheme.cc urn.cc \ - useragent.cc wccp.cc wccp2.cc whois.cc wordlist.cc win32.cc + TextException.cc TextException.h tools.cc typedefs.h \ + unlinkd.cc URLScheme.cc urn.cc useragent.cc wccp.cc wccp2.cc \ + whois.cc wordlist.cc win32.cc am_ufsdump_OBJECTS = debug.$(OBJEXT) int.$(OBJEXT) mem.$(OBJEXT) \ store_key_md5.$(OBJEXT) StoreMeta.$(OBJEXT) \ StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ @@ -1452,17 +1471,18 @@ ACLStringData.$(OBJEXT) authenticate.$(OBJEXT) \ cache_cf.$(OBJEXT) cache_manager.$(OBJEXT) \ CacheDigest.$(OBJEXT) carp.$(OBJEXT) cbdata.$(OBJEXT) \ - client_db.$(OBJEXT) client_side.$(OBJEXT) \ - client_side_reply.$(OBJEXT) client_side_request.$(OBJEXT) \ - clientStream.$(OBJEXT) $(am__objects_7) ConfigOption.$(OBJEXT) \ - $(am__objects_9) disk.$(OBJEXT) $(am__objects_11) \ - errorpage.$(OBJEXT) $(am__objects_13) ETag.$(OBJEXT) \ - event.$(OBJEXT) external_acl.$(OBJEXT) \ - ExternalACLEntry.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \ - filemap.$(OBJEXT) forward.$(OBJEXT) fqdncache.$(OBJEXT) \ - ftp.$(OBJEXT) gopher.$(OBJEXT) helper.$(OBJEXT) \ - $(am__objects_14) http.$(OBJEXT) HttpStatusLine.$(OBJEXT) \ - HttpHdrCc.$(OBJEXT) HttpHdrRange.$(OBJEXT) HttpHdrSc.$(OBJEXT) \ + ChunkedCodingParser.$(OBJEXT) client_db.$(OBJEXT) \ + client_side.$(OBJEXT) client_side_reply.$(OBJEXT) \ + client_side_request.$(OBJEXT) clientStream.$(OBJEXT) \ + $(am__objects_7) ConfigOption.$(OBJEXT) $(am__objects_9) \ + disk.$(OBJEXT) $(am__objects_11) errorpage.$(OBJEXT) \ + $(am__objects_13) ETag.$(OBJEXT) event.$(OBJEXT) \ + external_acl.$(OBJEXT) ExternalACLEntry.$(OBJEXT) fd.$(OBJEXT) \ + fde.$(OBJEXT) filemap.$(OBJEXT) forward.$(OBJEXT) \ + fqdncache.$(OBJEXT) ftp.$(OBJEXT) gopher.$(OBJEXT) \ + helper.$(OBJEXT) $(am__objects_14) http.$(OBJEXT) \ + HttpStatusLine.$(OBJEXT) HttpHdrCc.$(OBJEXT) \ + HttpHdrRange.$(OBJEXT) HttpHdrSc.$(OBJEXT) \ HttpHdrScTarget.$(OBJEXT) HttpHdrContRange.$(OBJEXT) \ HttpHeader.$(OBJEXT) HttpHeaderTools.$(OBJEXT) \ HttpBody.$(OBJEXT) HttpMsg.$(OBJEXT) HttpReply.$(OBJEXT) \ @@ -1485,10 +1505,10 @@ store_digest.$(OBJEXT) store_dir.$(OBJEXT) store_log.$(OBJEXT) \ store_rebuild.$(OBJEXT) store_swapin.$(OBJEXT) \ store_swapmeta.$(OBJEXT) store_swapout.$(OBJEXT) \ - SwapDir.$(OBJEXT) tools.$(OBJEXT) $(am__objects_24) \ - URLScheme.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ - wccp.$(OBJEXT) wccp2.$(OBJEXT) whois.$(OBJEXT) \ - wordlist.$(OBJEXT) $(am__objects_25) + SwapDir.$(OBJEXT) TextException.$(OBJEXT) tools.$(OBJEXT) \ + $(am__objects_24) URLScheme.$(OBJEXT) urn.$(OBJEXT) \ + useragent.$(OBJEXT) wccp.$(OBJEXT) wccp2.$(OBJEXT) \ + whois.$(OBJEXT) wordlist.$(OBJEXT) $(am__objects_25) nodist_ufsdump_OBJECTS = repl_modules.$(OBJEXT) globals.$(OBJEXT) \ string_arrays.$(OBJEXT) ufsdump_OBJECTS = $(am_ufsdump_OBJECTS) $(nodist_ufsdump_OBJECTS) @@ -2083,6 +2103,8 @@ carp.cc \ cbdata.cc \ cbdata.h \ + ChunkedCodingParser.cc \ + ChunkedCodingParser.h \ client_db.cc \ client_side.cc \ client_side.h \ @@ -2262,6 +2284,8 @@ structs.h \ SwapDir.cc \ SwapDir.h \ + TextException.cc \ + TextException.h \ time.cc \ tools.cc \ tunnel.cc \ @@ -2335,8 +2359,6 @@ ICAP_libicap_a_SOURCES = \ ICAP/AsyncJob.cc \ ICAP/AsyncJob.h \ - ICAP/ChunkedCodingParser.cc \ - ICAP/ChunkedCodingParser.h \ ICAP/ICAPClient.cc \ ICAP/ICAPClient.h \ ICAP/ICAPInitiator.cc \ @@ -2359,9 +2381,7 @@ ICAP/ICAPServiceRep.cc \ ICAP/ICAPServiceRep.h \ ICAP/ICAPXaction.cc \ - ICAP/ICAPXaction.h \ - ICAP/TextException.cc \ - ICAP/TextException.h + ICAP/ICAPXaction.h unlinkd_SOURCES = unlinkd_daemon.cc SquidNew.cc pinger_SOURCES = \ @@ -2411,6 +2431,8 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ + ChunkedCodingParser.h \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -2515,6 +2537,8 @@ store_swapout.cc \ structs.h \ SwapDir.cc \ + TextException.cc \ + TextException.h \ tools.cc \ typedefs.h \ $(UNLINKDSOURCE) \ @@ -2809,6 +2833,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -2901,6 +2926,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -2981,6 +3007,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -3072,6 +3099,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -3137,6 +3165,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -3228,6 +3257,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -3314,6 +3344,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -3411,6 +3442,7 @@ StoreSwapLogData.cc \ String.cc \ SwapDir.cc \ + TextException.cc \ time.cc \ tools.cc \ tunnel.cc \ @@ -3476,6 +3508,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -3568,6 +3601,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -3826,6 +3860,7 @@ CacheDigest.cc \ carp.cc \ cbdata.cc \ + ChunkedCodingParser.cc \ client_db.cc \ client_side.cc \ client_side_reply.cc \ @@ -3917,6 +3952,7 @@ StoreMetaURL.cc \ StoreMetaVary.cc \ StoreSwapLogData.cc \ + TextException.cc \ tools.cc \ tunnel.cc \ SwapDir.cc \ @@ -3995,8 +4031,6 @@ @: > ICAP/$(DEPDIR)/$(am__dirstamp) ICAP/AsyncJob.$(OBJEXT): ICAP/$(am__dirstamp) \ ICAP/$(DEPDIR)/$(am__dirstamp) -ICAP/ChunkedCodingParser.$(OBJEXT): ICAP/$(am__dirstamp) \ - ICAP/$(DEPDIR)/$(am__dirstamp) ICAP/ICAPClient.$(OBJEXT): ICAP/$(am__dirstamp) \ ICAP/$(DEPDIR)/$(am__dirstamp) ICAP/ICAPInitiator.$(OBJEXT): ICAP/$(am__dirstamp) \ @@ -4019,8 +4053,6 @@ ICAP/$(DEPDIR)/$(am__dirstamp) ICAP/ICAPXaction.$(OBJEXT): ICAP/$(am__dirstamp) \ ICAP/$(DEPDIR)/$(am__dirstamp) -ICAP/TextException.$(OBJEXT): ICAP/$(am__dirstamp) \ - ICAP/$(DEPDIR)/$(am__dirstamp) ICAP/libicap.a: $(ICAP_libicap_a_OBJECTS) $(ICAP_libicap_a_DEPENDENCIES) ICAP/$(am__dirstamp) -rm -f ICAP/libicap.a $(ICAP_libicap_a_AR) ICAP/libicap.a $(ICAP_libicap_a_OBJECTS) $(ICAP_libicap_a_LIBADD) @@ -4548,7 +4580,6 @@ -rm -f DiskIO/ReadRequest.$(OBJEXT) -rm -f DiskIO/WriteRequest.$(OBJEXT) -rm -f ICAP/AsyncJob.$(OBJEXT) - -rm -f ICAP/ChunkedCodingParser.$(OBJEXT) -rm -f ICAP/ICAPClient.$(OBJEXT) -rm -f ICAP/ICAPConfig.$(OBJEXT) -rm -f ICAP/ICAPElements.$(OBJEXT) @@ -4560,7 +4591,6 @@ -rm -f ICAP/ICAPOptions.$(OBJEXT) -rm -f ICAP/ICAPServiceRep.$(OBJEXT) -rm -f ICAP/ICAPXaction.$(OBJEXT) - -rm -f ICAP/TextException.$(OBJEXT) -rm -f auth/basic/basicScheme.$(OBJEXT) -rm -f auth/digest/digestScheme.$(OBJEXT) -rm -f auth/negotiate/negotiateScheme.$(OBJEXT) @@ -4689,6 +4719,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AuthUserRequest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BodyPipe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CacheDigest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChunkedCodingParser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CompletionDispatcher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConfigOption.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConfigParser.Po@am__quote@ @@ -4752,6 +4783,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StoreSwapLogData.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/String.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SwapDir.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextException.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/URLScheme.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WinSvc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/access_log.Po@am__quote@ @@ -4877,7 +4909,6 @@ @AMDEP_TRUE@@am__include@ @am__quote@DiskIO/DiskThreads/$(DEPDIR)/aiops_win32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DiskIO/DiskThreads/$(DEPDIR)/async_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/AsyncJob.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/ChunkedCodingParser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/ICAPClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/ICAPConfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/ICAPElements.Po@am__quote@ @@ -4889,7 +4920,6 @@ @AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/ICAPOptions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/ICAPServiceRep.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/ICAPXaction.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ICAP/$(DEPDIR)/TextException.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@auth/basic/$(DEPDIR)/basicScheme.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@auth/digest/$(DEPDIR)/digestScheme.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@auth/negotiate/$(DEPDIR)/negotiateScheme.Po@am__quote@ diff -u -r -N squid-3.0.STABLE15/src/structs.h squid-3.0.STABLE16-RC1/src/structs.h --- squid-3.0.STABLE15/src/structs.h 2009-05-06 23:11:42.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/structs.h 2009-05-16 00:47:58.000000000 +1200 @@ -255,6 +255,7 @@ Timeout; size_t maxRequestHeaderSize; int64_t maxRequestBodySize; + int64_t maxChunkedRequestBodySize; size_t maxReplyHeaderSize; acl_size_t *ReplyBodySize; @@ -924,6 +925,8 @@ unsigned int consume_body_data: 1; + +unsigned int chunked:1; }; struct _ipcache_addrs diff -u -r -N squid-3.0.STABLE15/src/TextException.cc squid-3.0.STABLE16-RC1/src/TextException.cc --- squid-3.0.STABLE15/src/TextException.cc 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/TextException.cc 2009-05-16 00:47:57.000000000 +1200 @@ -0,0 +1,27 @@ +#include "squid.h" +#include "TextException.h" + +TextException::TextException(const char *aMsg, const char *aFileName, int aLineNo): + message(xstrdup(aMsg)), theFileName(aFileName), theLineNo(aLineNo) +{} + +TextException::~TextException() +{ + xfree(message); +} + +void Throw(const char *message, const char *fileName, int lineNo) +{ + + // or should we let the exception recepient print the exception instead? + + if (fileName) { + debugs(0, 3, fileName << ':' << lineNo << ": exception" << + (message ? ": " : ".") << (message ? message : "")); + } else { + debugs(0, 3, "exception" << + (message ? ": " : ".") << (message ? message : "")); + } + + throw TextException(message, fileName, lineNo); +} diff -u -r -N squid-3.0.STABLE15/src/TextException.h squid-3.0.STABLE16-RC1/src/TextException.h --- squid-3.0.STABLE15/src/TextException.h 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.0.STABLE16-RC1/src/TextException.h 2009-05-16 00:47:57.000000000 +1200 @@ -0,0 +1,46 @@ +#ifndef SQUID__TEXTEXCEPTION_H +#define SQUID__TEXTEXCEPTION_H + +// Origin: xstd/TextException + + +// simple exception to report custom errors +// we may want to change the interface to be able to report system errors + +class TextException +{ + +public: + TextException(const char *aMessage, const char *aFileName = 0, int aLineNo = -1); + ~TextException(); + + // ostream &print(ostream &os) const; + +public: + char *message; // read-only + +protected: + // optional location information + const char *theFileName; + int theLineNo; +}; + +//inline +//ostream &operator <<(ostream &os, const TextException &exx) { +// return exx.print(os); +//} + +#if !defined(TexcHere) +# define TexcHere(msg) TextException((msg), __FILE__, __LINE__) +#endif + +extern void Throw(const char *message, const char *fileName, int lineNo); + +// Must(condition) is like assert(condition) but throws an exception instead +#if !defined(Must) +# define Must(cond) ((cond) ? \ + (void)0 : \ + (void)Throw(#cond, __FILE__, __LINE__)) +#endif + +#endif /* SQUID__TEXTEXCEPTION_H */