From: Amos Jeffries Date: Wed, 26 May 2010 04:47:58 +0000 (+1200) Subject: Author: Unknown X-Git-Tag: SQUID_3_0_STABLE26~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3fb86a2d6592399eb48bbc8dec11c84c56244400;p=thirdparty%2Fsquid.git Author: Unknown Bug 2879: 3.0 regression in headers end finding Ported from Squid-2. Also, updates from Alex Rousskov for 3.x. --- diff --git a/src/http.cc b/src/http.cc index 278786c224..ae167c49d5 100644 --- a/src/http.cc +++ b/src/http.cc @@ -706,6 +706,9 @@ HttpStateData::processReplyHeader() assert(!flags.headers_parsed); + if (!readBuf->hasContent()) + return; + http_status error = HTTP_STATUS_NONE; HttpReply *newrep = new HttpReply; @@ -1062,6 +1065,21 @@ HttpStateData::readReply (size_t len, comm_err_t flag, int xerrno) if (len == 0) { // reached EOF? eof = 1; flags.do_next_read = 0; + + /* Bug 2879: Replies may terminate with \r\n then EOF instead of \r\n\r\n + * Ensure here that we have at minimum two \r\n when EOF is seen. + * TODO: Add eof parameter to headersEnd() and move this hack there. + */ + if (readBuf->contentSize() && !flags.headers_parsed) { + /* + * Yes Henrik, there is a point to doing this. When we + * called httpProcessReplyHeader() before, we didn't find + * the end of headers, but now we are definately at EOF, so + * we want to process the reply headers. + */ + /* Fake an "end-of-headers" to work around such broken servers */ + readBuf->append("\r\n", 2); + } } if (!flags.headers_parsed) { // have not parsed headers yet?