diff -u -r -N squid-3.1.0.11/ChangeLog squid-3.1.0.12/ChangeLog --- squid-3.1.0.11/ChangeLog 2009-07-19 17:11:05.000000000 +1200 +++ squid-3.1.0.12/ChangeLog 2009-07-27 12:05:41.000000000 +1200 @@ -1,3 +1,12 @@ +Changes to squid-3.1.0.12 (27 Jul 2009): + + - Bug 2716: Chunked request Signed/Unsigned build error + - Bug 2674: Remove limit on HTTP headers read. + - Bug 2620: Invalid HTTP response codes causes segfault + - Fix FTP EPSV negotiation parser. + - Fix Via string when leak checking is enabled (valgrind etc) + - ... and several documentation and testing additions + Changes to squid-3.1.0.11 (19 Jul 2009): - Bug 2087: Support adaptation sets and chains @@ -198,6 +207,19 @@ - Bug #2223: Follow XFF extensions added - ... and many code and documentation cleanups +Changes to squid-3.0.STABLE17 (27 Jul 2009): + + - Bug 2680 regression: Crash after rotate with no helpers running + - Bug 2710: squid_kerb_auth non-terminated string + - Bug 2679: strsep and strtoll detection failure + - Bug 2674: Remove limit on HTTP headers read. + - Bug 2659: String length overflows on append, leading to segfaults + - Bug 2620: Invalid HTTP response codes causes segfault + - Bug 2080: wbinfo_group.pl - false positive under certain conditions + - Bug 1087: ESI processor not quoting attributes correctly. + - Fix: issue with AUFS/UFS/DiskD writing objects to disk cache + - Several small build issues with previous release. + Changes to squid-3.0.STABLE16 (15 Jun 2009): - Bug 2672: cacheMemMaxSize 32-bit overflow during snmpwalk diff -u -r -N squid-3.1.0.11/configure squid-3.1.0.12/configure --- squid-3.1.0.11/configure 2009-07-19 17:11:50.000000000 +1200 +++ squid-3.1.0.12/configure 2009-07-27 12:06:31.000000000 +1200 @@ -1,7 +1,7 @@ #! /bin/sh -# From configure.in Revision: 1.497 . +# From configure.in Revision. # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.62 for Squid Web Proxy 3.1.0.11. +# Generated by GNU Autoconf 2.62 for Squid Web Proxy 3.1.0.12. # # Report bugs to . # @@ -751,8 +751,8 @@ # Identity of this package. PACKAGE_NAME='Squid Web Proxy' PACKAGE_TARNAME='squid' -PACKAGE_VERSION='3.1.0.11' -PACKAGE_STRING='Squid Web Proxy 3.1.0.11' +PACKAGE_VERSION='3.1.0.12' +PACKAGE_STRING='Squid Web Proxy 3.1.0.12' PACKAGE_BUGREPORT='http://www.squid-cache.org/bugs/' ac_unique_file="src/main.cc" @@ -1678,7 +1678,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.1.0.11 to adapt to many kinds of systems. +\`configure' configures Squid Web Proxy 3.1.0.12 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1748,7 +1748,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Squid Web Proxy 3.1.0.11:";; + short | recursive ) echo "Configuration of Squid Web Proxy 3.1.0.12:";; esac cat <<\_ACEOF @@ -1939,10 +1939,6 @@ --disable-translation Prevent Squid generating localized error page templates and manuals. Which is usually tried, but may not be needed. - if test "$enableval" = "no" ; then - use_translation=no - fi - --disable-auto-locale This prevents Squid providing localized error pages based on the clients request headers. When disabled Squid requires explicit language configuration. @@ -2079,7 +2075,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Squid Web Proxy configure 3.1.0.11 +Squid Web Proxy configure 3.1.0.12 generated by GNU Autoconf 2.62 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -2093,7 +2089,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.1.0.11, which was +It was created by Squid Web Proxy $as_me 3.1.0.12, which was generated by GNU Autoconf 2.62. Invocation command line was $ $0 $@ @@ -2811,7 +2807,7 @@ # Define the identity of the package. PACKAGE='squid' - VERSION='3.1.0.11' + VERSION='3.1.0.12' cat >>confdefs.h <<_ACEOF @@ -5664,7 +5660,7 @@ ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5667 "configure"' > conftest.$ac_ext + echo '#line 5663 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -8286,11 +8282,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8289: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8285: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8293: \$? = $ac_status" >&5 + echo "$as_me:8289: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8576,11 +8572,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8579: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8575: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8583: \$? = $ac_status" >&5 + echo "$as_me:8579: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8680,11 +8676,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8683: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8679: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:8687: \$? = $ac_status" >&5 + echo "$as_me:8683: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -11080,7 +11076,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:13588: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:13596: \$? = $ac_status" >&5 + echo "$as_me:13592: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -13693,11 +13689,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13696: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13692: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13700: \$? = $ac_status" >&5 + echo "$as_me:13696: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15276,11 +15272,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15279: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15275: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15283: \$? = $ac_status" >&5 + echo "$as_me:15279: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -15380,11 +15376,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15383: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15379: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15387: \$? = $ac_status" >&5 + echo "$as_me:15383: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -17595,11 +17591,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17598: $lt_compile\"" >&5) + (eval echo "\"\$as_me:17594: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:17602: \$? = $ac_status" >&5 + echo "$as_me:17598: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -17885,11 +17881,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17888: $lt_compile\"" >&5) + (eval echo "\"\$as_me:17884: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:17892: \$? = $ac_status" >&5 + echo "$as_me:17888: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -17989,11 +17985,11 @@ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17992: $lt_compile\"" >&5) + (eval echo "\"\$as_me:17988: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:17996: \$? = $ac_status" >&5 + echo "$as_me:17992: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -48812,7 +48808,10 @@ use_translation="yes" # Check whether --enable-translation was given. if test "${enable_translation+set}" = set; then - enableval=$enable_translation; + enableval=$enable_translation; if test "$enableval" = "no" ; then + use_translation=no + fi + fi if test "$use_translation" = "yes" ; then @@ -49693,7 +49692,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.1.0.11, which was +This file was extended by Squid Web Proxy $as_me 3.1.0.12, which was generated by GNU Autoconf 2.62. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -49746,7 +49745,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -Squid Web Proxy config.status 3.1.0.11 +Squid Web Proxy config.status 3.1.0.12 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.1.0.11/configure.in squid-3.1.0.12/configure.in --- squid-3.1.0.11/configure.in 2009-07-19 17:11:50.000000000 +1200 +++ squid-3.1.0.12/configure.in 2009-07-27 12:06:31.000000000 +1200 @@ -2,13 +2,13 @@ dnl dnl $Id$ dnl -AC_INIT(Squid Web Proxy, 3.1.0.11, http://www.squid-cache.org/bugs/, squid) +AC_INIT(Squid Web Proxy, 3.1.0.12, http://www.squid-cache.org/bugs/, squid) AC_PREREQ(2.52) AM_CONFIG_HEADER(include/autoconf.h) AC_CONFIG_AUX_DIR(cfgaux) AC_CONFIG_SRCDIR([src/main.cc]) AM_INIT_AUTOMAKE([tar-ustar nostdinc]) -AC_REVISION($Revision: 1.497 $)dnl +AC_REVISION($Revision$)dnl AC_PREFIX_DEFAULT(/usr/local/squid) AM_MAINTAINER_MODE @@ -3781,7 +3781,7 @@ AC_ARG_ENABLE(translation, AC_HELP_STRING([--disable-translation], [Prevent Squid generating localized error page templates and manuals. - Which is usually tried, but may not be needed.]) + Which is usually tried, but may not be needed.]), [ if test "$enableval" = "no" ; then use_translation=no fi diff -u -r -N squid-3.1.0.11/helpers/basic_auth/NCSA/crypt_md5.c squid-3.1.0.12/helpers/basic_auth/NCSA/crypt_md5.c --- squid-3.1.0.11/helpers/basic_auth/NCSA/crypt_md5.c 2009-07-19 17:11:07.000000000 +1200 +++ squid-3.1.0.12/helpers/basic_auth/NCSA/crypt_md5.c 2009-07-27 12:05:44.000000000 +1200 @@ -14,12 +14,16 @@ * Origin: Id: crypt.c,v 1.3 1995/05/30 05:42:22 rgrimes Exp * */ +#include "config.h" +#if HAVE_STRING_H #include +#endif +#if HAVE_STDIO_H #include -#include "config.h" -#include "md5.h" +#endif +#include "md5.h" #include "crypt_md5.h" static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */ diff -u -r -N squid-3.1.0.11/helpers/basic_auth/NCSA/ncsa_auth.c squid-3.1.0.12/helpers/basic_auth/NCSA/ncsa_auth.c --- squid-3.1.0.11/helpers/basic_auth/NCSA/ncsa_auth.c 2009-07-19 17:11:07.000000000 +1200 +++ squid-3.1.0.12/helpers/basic_auth/NCSA/ncsa_auth.c 2009-07-27 12:05:44.000000000 +1200 @@ -18,6 +18,7 @@ */ #include "config.h" + #if HAVE_STDIO_H #include #endif diff -u -r -N squid-3.1.0.11/include/version.h squid-3.1.0.12/include/version.h --- squid-3.1.0.11/include/version.h 2009-07-19 17:11:50.000000000 +1200 +++ squid-3.1.0.12/include/version.h 2009-07-27 12:06:31.000000000 +1200 @@ -9,7 +9,7 @@ */ #ifndef SQUID_RELEASE_TIME -#define SQUID_RELEASE_TIME 1247980265 +#define SQUID_RELEASE_TIME 1248653140 #endif #ifndef APP_SHORTNAME diff -u -r -N squid-3.1.0.11/src/adaptation/History.cc squid-3.1.0.12/src/adaptation/History.cc --- squid-3.1.0.11/src/adaptation/History.cc 2009-07-19 17:11:12.000000000 +1200 +++ squid-3.1.0.12/src/adaptation/History.cc 2009-07-27 12:05:51.000000000 +1200 @@ -7,7 +7,7 @@ #include "adaptation/History.h" /// impossible services value to identify unset theNextServices -const static String TheNullServices(",null,"); +const static char *TheNullServices = ",null,"; Adaptation::History::Entry::Entry(const String &sid, const timeval &when): service(sid), start(when), theRptm(-1), retried(false) @@ -33,7 +33,7 @@ } -Adaptation::History::History(): theNextServices(TheNullServices) { +Adaptation::History::History(): theNextServices(String(TheNullServices)) { } int Adaptation::History::recordXactStart(const String &sid, const timeval &when, bool retrying) @@ -120,19 +120,19 @@ void Adaptation::History::updateNextServices(const String &services) { - if (theNextServices != TheNullServices) + if (theNextServices != String(TheNullServices)) debugs(93,3, HERE << "old services: " << theNextServices); debugs(93,3, HERE << "new services: " << services); - Must(services != TheNullServices); + Must(services != String(TheNullServices)); theNextServices = services; } bool Adaptation::History::extractNextServices(String &value) { - if (theNextServices == TheNullServices) + if (theNextServices == String(TheNullServices)) return false; value = theNextServices; - theNextServices = TheNullServices; // prevents resetting the plan twice + theNextServices = String(TheNullServices); // prevents resetting the plan twice return true; } diff -u -r -N squid-3.1.0.11/src/client_side.cc squid-3.1.0.12/src/client_side.cc --- squid-3.1.0.11/src/client_side.cc 2009-07-19 17:11:13.000000000 +1200 +++ squid-3.1.0.12/src/client_side.cc 2009-07-27 12:05:51.000000000 +1200 @@ -1360,7 +1360,7 @@ /** Please don't do anything with the FD past here! */ } -void +static void ClientSocketContextPushDeferredIfNeeded(ClientSocketContext::Pointer deferredRequest, ConnStateData * conn) { debugs(33, 2, "ClientSocketContextPushDeferredIfNeeded: FD " << conn->fd << " Sending next"); @@ -1931,6 +1931,17 @@ /* pre-set these values to make aborting simpler */ *method_p = METHOD_NONE; + /* NP: don't be tempted to move this down or remove again. + * It's the only DDoS protection old-String has against long URL */ + if ( hp->bufsiz <= 0) { + debugs(33, 5, "Incomplete request, waiting for end of request line"); + return NULL; + } + else if ( (size_t)hp->bufsiz >= Config.maxRequestHeaderSize && headersEnd(hp->buf, Config.maxRequestHeaderSize) == 0) { + debugs(33, 5, "parseHttpRequest: Too large request"); + return parseHttpRequestAbort(conn, "error:request-too-large"); + } + /* Attempt to parse the first line; this'll define the method, url, version and header begin */ r = HttpParserParseReqLine(hp); @@ -2222,7 +2233,7 @@ // 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 ((int64_t)conn->in.notYetUsed) < Config.maxChunkedRequestBodySize; return conn->in.notYetUsed >= Config.maxRequestHeaderSize ? 0 : 1; } diff -u -r -N squid-3.1.0.11/src/client_side_reply.cc squid-3.1.0.12/src/client_side_reply.cc --- squid-3.1.0.11/src/client_side_reply.cc 2009-07-19 17:11:13.000000000 +1200 +++ squid-3.1.0.12/src/client_side_reply.cc 2009-07-27 12:05:51.000000000 +1200 @@ -1403,7 +1403,7 @@ LOCAL_ARRAY(char, bbuf, MAX_URL + 32); String strVia; hdr->getList(HDR_VIA, &strVia); - snprintf(bbuf, sizeof(bbuf), "%d.%d %s", + snprintf(bbuf, MAX_URL + 32, "%d.%d %s", reply->sline.version.major, reply->sline.version.minor, ThisCache); diff -u -r -N squid-3.1.0.11/src/fs/ufs/store_io_ufs.cc squid-3.1.0.12/src/fs/ufs/store_io_ufs.cc --- squid-3.1.0.11/src/fs/ufs/store_io_ufs.cc 2009-07-19 17:11:14.000000000 +1200 +++ squid-3.1.0.12/src/fs/ufs/store_io_ufs.cc 2009-07-27 12:05:52.000000000 +1200 @@ -363,17 +363,10 @@ } /* - * DPW 2007-04-12 - * I'm seeing disk files remain open under vanilla UFS storage - * because storeClose() gets called before the last write is - * complete. I guess we have to check for the try_closing - * flag here. + * HNO 2009-07-24 + * Kick any pending write/close operations alive */ - if (flags.try_closing) { - debugs(72, 2, HERE << "UFSStoreState::writeCompleted" << - " flags.try_closing is set"); - tryClosing(); - } + drainWriteQueue(); } void diff -u -r -N squid-3.1.0.11/src/ftp.cc squid-3.1.0.12/src/ftp.cc --- squid-3.1.0.11/src/ftp.cc 2009-07-19 17:11:14.000000000 +1200 +++ squid-3.1.0.12/src/ftp.cc 2009-07-27 12:05:52.000000000 +1200 @@ -2447,9 +2447,13 @@ /* server response with list of supported methods */ /* 522 Network protocol not supported, use (1) */ /* 522 Network protocol not supported, use (1,2) */ + /* TODO: handle the (1,2) case. We might get it back after EPSV ALL + * which means close data + control without self-destructing and re-open from scratch. */ debugs(9, 5, HERE << "scanning: " << ftpState->ctrl.last_reply); + buf = ftpState->ctrl.last_reply; + while (buf != NULL && *buf != '\0' && *buf != '\n' && *buf != '(') ++buf; + if (buf != NULL && *buf == '\n') ++buf; - buf = ftpState->ctrl.last_reply + strcspn(ftpState->ctrl.last_reply, "(1,2)"); if (buf == NULL || *buf == '\0') { /* handle broken server (RFC 2428 says MUST specify supported protocols in 522) */ debugs(9, DBG_IMPORTANT, "Broken FTP Server at " << fd_table[ftpState->ctrl.fd].ipaddr << ". 522 error missing protocol negotiation hints"); @@ -2473,6 +2477,11 @@ ftpSendPassive(ftpState); #endif } + else { + /* handle broken server (RFC 2428 says MUST specify supported protocols in 522) */ + debugs(9, DBG_IMPORTANT, "WARNING: Server at " << fd_table[ftpState->ctrl.fd].ipaddr << " sent unknown protocol negotiation hint: " << buf); + ftpSendPassive(ftpState); + } return; } diff -u -r -N squid-3.1.0.11/src/http.cc squid-3.1.0.12/src/http.cc --- squid-3.1.0.11/src/http.cc 2009-07-19 17:11:14.000000000 +1200 +++ squid-3.1.0.12/src/http.cc 2009-07-27 12:05:52.000000000 +1200 @@ -84,7 +84,7 @@ surrogateNoStore = false; fd = fwd->server_fd; readBuf = new MemBuf; - readBuf->init(4096, SQUID_TCP_SO_RCVBUF); + readBuf->init(); orig_request = HTTPMSGLOCK(fwd->request); // reset peer response time stats for %terminate(); // does not affect content size // find the end of headers - // TODO: Remove? httpReplyParseStep() should do similar checks const size_t hdr_len = headersEnd(buf->content(), buf->contentSize()); + // sanity check the start line to see if this is in fact an HTTP message + if (!sanityCheckStartLine(buf, hdr_len, error)) { + debugs(58,1, HERE << "first line of HTTP message is invalid"); + // NP: sanityCheck sets *error + return false; + } + // TODO: move to httpReplyParseStep() if (hdr_len > Config.maxReplyHeaderSize || (hdr_len <= 0 && (size_t)buf->contentSize() > Config.maxReplyHeaderSize)) { - debugs(58, 1, "HttpMsg::parse: Too large reply header (" << - hdr_len << " > " << Config.maxReplyHeaderSize); + debugs(58, 1, "HttpMsg::parse: Too large reply header (" << hdr_len << " > " << Config.maxReplyHeaderSize); *error = HTTP_HEADER_TOO_LARGE; return false; } if (hdr_len <= 0) { - debugs(58, 3, "HttpMsg::parse: failed to find end of headers " << - "(eof: " << eof << ") in '" << buf->content() << "'"); + debugs(58, 3, "HttpMsg::parse: failed to find end of headers (eof: " << eof << ") in '" << buf->content() << "'"); if (eof) // iff we have seen the end, this is an error *error = HTTP_INVALID_HEADER; @@ -171,30 +175,22 @@ return false; } - if (!sanityCheckStartLine(buf, error)) { - debugs(58,1, HERE << "first line of HTTP message is invalid"); - *error = HTTP_INVALID_HEADER; - return false; - } - const int res = httpMsgParseStep(buf->content(), buf->contentSize(), eof); if (res < 0) { // error - debugs(58, 3, "HttpMsg::parse: cannot parse isolated headers " << - "in '" << buf->content() << "'"); + debugs(58, 3, "HttpMsg::parse: cannot parse isolated headers in '" << buf->content() << "'"); *error = HTTP_INVALID_HEADER; return false; } if (res == 0) { - debugs(58, 2, "HttpMsg::parse: strange, need more data near '" << - buf->content() << "'"); + debugs(58, 2, "HttpMsg::parse: strange, need more data near '" << buf->content() << "'"); + *error = HTTP_INVALID_HEADER; return false; // but this should not happen due to headersEnd() above } assert(res > 0); - debugs(58, 9, "HttpMsg::parse success (" << hdr_len << " bytes) " << - "near '" << buf->content() << "'"); + debugs(58, 9, "HttpMsg::parse success (" << hdr_len << " bytes) near '" << buf->content() << "'"); if (hdr_sz != (int)hdr_len) { debugs(58, 1, "internal HttpMsg::parse vs. headersEnd error: " << @@ -379,9 +375,8 @@ packerClean(&p); } -HttpMsg * - // use HTTPMSGLOCK() instead of calling this directly +HttpMsg * HttpMsg::_lock() { lock_count++; diff -u -r -N squid-3.1.0.11/src/HttpMsg.h squid-3.1.0.12/src/HttpMsg.h --- squid-3.1.0.11/src/HttpMsg.h 2009-07-19 17:11:09.000000000 +1200 +++ squid-3.1.0.12/src/HttpMsg.h 2009-07-27 12:05:47.000000000 +1200 @@ -99,7 +99,14 @@ virtual bool inheritProperties(const HttpMsg *aMsg) = 0; protected: - virtual bool sanityCheckStartLine(MemBuf *buf, http_status *error) = 0; + /** + * Validate the message start line is syntactically correct. + * Set HTTP error status according to problems found. + * + * \retval true Status line has no serious problems. + * \retval false Status line has a serious problem. Correct response is indicated by error. + */ + virtual bool sanityCheckStartLine(MemBuf *buf, const size_t hdr_len, http_status *error) = 0; virtual void packFirstLineInto(Packer * p, bool full_uri) const = 0; diff -u -r -N squid-3.1.0.11/src/HttpReply.cc squid-3.1.0.12/src/HttpReply.cc --- squid-3.1.0.11/src/HttpReply.cc 2009-07-19 17:11:09.000000000 +1200 +++ squid-3.1.0.12/src/HttpReply.cc 2009-07-27 12:05:47.000000000 +1200 @@ -437,15 +437,54 @@ return content_length; } -bool HttpReply::sanityCheckStartLine(MemBuf *buf, http_status *error) +/** + * Checks the first line of an HTTP Reply is valid. + * currently only checks "HTTP/" exists. + * + * NP: not all error cases are detected yet. Some are left for detection later in parse. + */ +bool +HttpReply::sanityCheckStartLine(MemBuf *buf, const size_t hdr_len, http_status *error) { - //hack warning: using psize instead of size here due to type mismatches with MemBuf. - if (buf->contentSize() >= protoPrefix.psize() && protoPrefix.cmp(buf->content(), protoPrefix.size()) != 0) { + // hack warning: using psize instead of size here due to type mismatches with MemBuf. + + // content is long enough to possibly hold a reply + // 4 being magic size of a 3-digit number plus space delimiter + if ( buf->contentSize() < (protoPrefix.psize() + 4) ) { + if (hdr_len > 0) + *error = HTTP_INVALID_HEADER; + return false; + } + + // catch missing or mismatched protocol identifier + if (protoPrefix.cmp(buf->content(), protoPrefix.size()) != 0) { debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol prefix (" << protoPrefix << ") in '" << buf->content() << "'"); *error = HTTP_INVALID_HEADER; return false; } + // catch missing or negative status value (negative '-' is not a digit) + int pos = protoPrefix.psize(); + + // skip arbitrary number of digits and a dot in the verion portion + while ( pos <= buf->contentSize() && (*(buf->content()+pos) == '.' || xisdigit(*(buf->content()+pos)) ) ) ++pos; + + // catch missing version info + if (pos == protoPrefix.psize()) { + debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol version numbers (ie. " << protoPrefix << "/1.0) in '" << buf->content() << "'"); + *error = HTTP_INVALID_HEADER; + return false; + } + + // skip arbitrary number of spaces... + while (pos <= buf->contentSize() && (char)*(buf->content()+pos) == ' ') ++pos; + + if (!xisdigit(*(buf->content()+pos))) { + debugs(58, 3, "HttpReply::sanityCheckStartLine: missing or invalid status number in '" << buf->content() << "'"); + *error = HTTP_INVALID_HEADER; + return false; + } + return true; } diff -u -r -N squid-3.1.0.11/src/HttpReply.h squid-3.1.0.12/src/HttpReply.h --- squid-3.1.0.11/src/HttpReply.h 2009-07-19 17:11:09.000000000 +1200 +++ squid-3.1.0.12/src/HttpReply.h 2009-07-27 12:05:47.000000000 +1200 @@ -68,7 +68,7 @@ \retval false and sets *error to zero when needs more data \retval false and sets *error to a positive http_status code on error */ - virtual bool sanityCheckStartLine(MemBuf *buf, http_status *error); + virtual bool sanityCheckStartLine(MemBuf *buf, const size_t hdr_len, http_status *error); /** \par public, readable; never update these or their .hdr equivalents directly */ time_t date; diff -u -r -N squid-3.1.0.11/src/HttpRequest.cc squid-3.1.0.12/src/HttpRequest.cc --- squid-3.1.0.11/src/HttpRequest.cc 2009-07-19 17:11:09.000000000 +1200 +++ squid-3.1.0.12/src/HttpRequest.cc 2009-07-27 12:05:47.000000000 +1200 @@ -208,18 +208,29 @@ return copy; } +/** + * Checks the first line of an HTTP request is valid + * currently just checks the request method is present. + * + * NP: Other errors are left for detection later in the parse. + */ bool -HttpRequest::sanityCheckStartLine(MemBuf *buf, http_status *error) +HttpRequest::sanityCheckStartLine(MemBuf *buf, const size_t hdr_len, http_status *error) { - /** - * Just see if the request buffer starts with a known - * HTTP request method. NOTE this whole function is somewhat - * superfluous and could just go away. - \todo AYJ: Check for safely removing this function. We now accept 'unknown' request methods in HTTP. - */ + // content is long enough to possibly hold a reply + // 2 being magic size of a 1-byte request method plus space delimiter + if ( buf->contentSize() < 2 ) { + // this is ony a real error if the headers apparently complete. + if (hdr_len > 0) { + *error = HTTP_INVALID_HEADER; + } + return false; + } + /* See if the request buffer starts with a known HTTP request method. */ if (HttpRequestMethod(buf->content(),NULL) == METHOD_NONE) { debugs(73, 3, "HttpRequest::sanityCheckStartLine: did not find HTTP request method"); + *error = HTTP_INVALID_HEADER; return false; } diff -u -r -N squid-3.1.0.11/src/HttpRequest.h squid-3.1.0.12/src/HttpRequest.h --- squid-3.1.0.11/src/HttpRequest.h 2009-07-19 17:11:09.000000000 +1200 +++ squid-3.1.0.12/src/HttpRequest.h 2009-07-27 12:05:47.000000000 +1200 @@ -234,7 +234,7 @@ protected: virtual void packFirstLineInto(Packer * p, bool full_uri) const; - virtual bool sanityCheckStartLine(MemBuf *buf, http_status *error); + virtual bool sanityCheckStartLine(MemBuf *buf, const size_t hdr_len, http_status *error); virtual void hdrCacheInit(); diff -u -r -N squid-3.1.0.11/src/Makefile.am squid-3.1.0.12/src/Makefile.am --- squid-3.1.0.11/src/Makefile.am 2009-07-19 17:11:09.000000000 +1200 +++ squid-3.1.0.12/src/Makefile.am 2009-07-27 12:05:47.000000000 +1200 @@ -402,6 +402,7 @@ MemObject.cc \ MemObject.h \ mime.cc \ + mime_header.cc \ multicast.cc \ neighbors.cc \ Packer.cc \ @@ -835,12 +836,16 @@ tests/testEvent \ tests/testEventLoop \ tests/test_http_range \ + tests/testHttpReply \ tests/testHttpRequest \ tests/testStore \ tests/testString \ tests/testURL \ @STORE_TESTS@ +## NP: required to run the above list. check_PROGRAMS only builds the binaries... +TESTS += $(check_PROGRAMS) + ### Template for new Unit Test Program ## - add tests/testX to check_PROGRAMS above. ## - copy template below and substitue X for class name @@ -864,6 +869,61 @@ #tests_testX_DEPENDENCIES= @SQUID_CPPUNIT_LA@ \ # $(top_builddir)/lib/libmiscutil.a + +# - add other component .(h|cc) files needed to link and run tests +tests_testHttpReply_SOURCES=\ + tests/testHttpReply.h \ + tests/testHttpReply.cc \ + tests/testMain.cc \ + cbdata.h \ + cbdata.cc \ + ETag.cc \ + HttpBody.cc \ + HttpHdrCc.cc \ + HttpHdrContRange.h \ + HttpHdrContRange.cc \ + HttpHdrRange.cc \ + HttpHdrSc.h \ + HttpHdrSc.cc \ + HttpHdrScTarget.h \ + HttpHdrScTarget.cc \ + HttpHeader.h \ + HttpHeader.cc \ + HttpHeaderMask.h \ + HttpHeaderTools.cc \ + HttpMsg.h \ + HttpMsg.cc \ + HttpReply.h \ + HttpReply.cc \ + HttpStatusLine.h \ + HttpStatusLine.cc \ + mem.cc \ + MemBuf.h \ + MemBuf.cc \ + mime_header.cc \ + Packer.h \ + Packer.cc \ + tests/stub_cache_manager.cc \ + tests/stub_StatHist.cc \ + tests/stub_store.cc \ + SquidString.h \ + String.cc \ + SquidTime.h \ + time.cc +nodist_tests_testHttpReply_SOURCES=\ + $(TESTSOURCES) +tests_testHttpReply_LDFLAGS = $(LIBADD_DL) +tests_testHttpReply_LDADD=\ + acl/libapi.la \ + acl/libstate.la \ + auth/libauth.la \ + ip/libip.la \ + @SQUID_CPPUNIT_LIBS@ \ + @SQUID_CPPUNIT_LA@ \ + -L../lib -lmiscutil +tests_testHttpReply_DEPENDENCIES= @SQUID_CPPUNIT_LA@ \ + $(top_builddir)/lib/libmiscutil.a + tests_testAuth_SOURCES = \ tests/testAuth.cc tests/testMain.cc tests/testAuth.h \ ConfigParser.cc \ @@ -1055,6 +1115,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -1224,6 +1285,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -1371,6 +1433,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -1508,6 +1571,7 @@ mem_node.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ multicast.cc \ neighbors.cc \ Parsing.cc \ @@ -1659,6 +1723,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -2010,6 +2075,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ diff -u -r -N squid-3.1.0.11/src/Makefile.in squid-3.1.0.12/src/Makefile.in --- squid-3.1.0.11/src/Makefile.in 2009-07-19 17:11:33.000000000 +1200 +++ squid-3.1.0.12/src/Makefile.in 2009-07-27 12:06:14.000000000 +1200 @@ -48,9 +48,9 @@ tests/testACLMaxUserIP$(EXEEXT) tests/testBoilerplate$(EXEEXT) \ tests/testCacheManager$(EXEEXT) tests/testDiskIO$(EXEEXT) \ tests/testEvent$(EXEEXT) tests/testEventLoop$(EXEEXT) \ - tests/test_http_range$(EXEEXT) tests/testHttpRequest$(EXEEXT) \ - tests/testStore$(EXEEXT) tests/testString$(EXEEXT) \ - tests/testURL$(EXEEXT) @STORE_TESTS@ + tests/test_http_range$(EXEEXT) tests/testHttpReply$(EXEEXT) \ + tests/testHttpRequest$(EXEEXT) tests/testStore$(EXEEXT) \ + tests/testString$(EXEEXT) tests/testURL$(EXEEXT) @STORE_TESTS@ @USE_ADAPTATION_TRUE@am__append_1 = adaptation @USE_ESI_TRUE@am__append_2 = esi EXTRA_PROGRAMS = DiskIO/DiskDaemon/diskd$(EXEEXT) unlinkd$(EXEEXT) \ @@ -196,15 +196,15 @@ icp_v2.cc icp_v3.cc int.cc internal.cc ipc.cc ipc_win32.cc \ ipcache.cc LeakFinder.cc list.cc logfile.cc main.cc mem.cc \ mem_node.cc mem_node.h Mem.h MemBuf.cc MemObject.cc \ - MemObject.h mime.cc multicast.cc neighbors.cc Packer.cc \ - Packer.h Parsing.cc Parsing.h ProfStats.cc pconn.cc pconn.h \ - PeerDigest.h peer_digest.cc peer_select.cc peer_sourcehash.cc \ - peer_userhash.cc PeerSelectState.h PingData.h protos.h \ - redirect.cc referer.cc refresh.cc RemovalPolicy.cc \ - RemovalPolicy.h send-announce.cc snmp_core.cc snmp_agent.cc \ - squid.h SquidNew.cc ssl_support.cc ssl_support.h stat.cc \ - StatHist.cc String.cc stmem.cc stmem.h store.cc Store.h \ - StoreFileSystem.cc StoreFileSystem.h StoreHashIndex.h \ + MemObject.h mime.cc mime_header.cc multicast.cc neighbors.cc \ + Packer.cc Packer.h Parsing.cc Parsing.h ProfStats.cc pconn.cc \ + pconn.h PeerDigest.h peer_digest.cc peer_select.cc \ + peer_sourcehash.cc peer_userhash.cc PeerSelectState.h \ + PingData.h protos.h redirect.cc referer.cc refresh.cc \ + RemovalPolicy.cc RemovalPolicy.h send-announce.cc snmp_core.cc \ + snmp_agent.cc squid.h SquidNew.cc ssl_support.cc ssl_support.h \ + stat.cc StatHist.cc String.cc stmem.cc stmem.h store.cc \ + Store.h StoreFileSystem.cc StoreFileSystem.h StoreHashIndex.h \ store_io.cc StoreIOBuffer.h StoreIOState.cc StoreIOState.h \ store_client.cc StoreClient.h store_digest.cc store_dir.cc \ store_key_md5.cc store_log.cc store_rebuild.cc store_swapin.cc \ @@ -275,9 +275,9 @@ $(am__objects_12) list.$(OBJEXT) logfile.$(OBJEXT) \ main.$(OBJEXT) mem.$(OBJEXT) mem_node.$(OBJEXT) \ MemBuf.$(OBJEXT) MemObject.$(OBJEXT) mime.$(OBJEXT) \ - multicast.$(OBJEXT) neighbors.$(OBJEXT) Packer.$(OBJEXT) \ - Parsing.$(OBJEXT) $(am__objects_13) pconn.$(OBJEXT) \ - peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ + mime_header.$(OBJEXT) multicast.$(OBJEXT) neighbors.$(OBJEXT) \ + Packer.$(OBJEXT) Parsing.$(OBJEXT) $(am__objects_13) \ + pconn.$(OBJEXT) peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ peer_sourcehash.$(OBJEXT) peer_userhash.$(OBJEXT) \ redirect.$(OBJEXT) referer.$(OBJEXT) refresh.$(OBJEXT) \ RemovalPolicy.$(OBJEXT) send-announce.$(OBJEXT) \ @@ -404,11 +404,12 @@ HttpReply.cc HttpStatusLine.cc icp_v2.cc icp_v3.cc ipc.cc \ ipc_win32.cc ipcache.cc int.cc internal.cc list.cc logfile.cc \ multicast.cc mem_node.cc MemBuf.cc MemObject.cc mime.cc \ - neighbors.cc Packer.cc Parsing.cc pconn.cc peer_digest.cc \ - peer_select.cc peer_sourcehash.cc peer_userhash.cc redirect.cc \ - referer.cc refresh.cc RemovalPolicy.cc Server.cc snmp_core.cc \ - snmp_agent.cc ssl_support.cc ssl_support.h stat.cc StatHist.cc \ - stmem.cc store.cc store_client.cc store_digest.cc store_dir.cc \ + mime_header.cc neighbors.cc Packer.cc Parsing.cc pconn.cc \ + peer_digest.cc peer_select.cc peer_sourcehash.cc \ + peer_userhash.cc redirect.cc referer.cc refresh.cc \ + RemovalPolicy.cc Server.cc snmp_core.cc snmp_agent.cc \ + ssl_support.cc ssl_support.h stat.cc StatHist.cc stmem.cc \ + store.cc store_client.cc store_digest.cc store_dir.cc \ store_io.cc store_key_md5.cc store_log.cc store_rebuild.cc \ store_swapin.cc store_swapmeta.cc store_swapout.cc \ StoreFileSystem.cc StoreIOState.cc StoreMeta.cc \ @@ -443,26 +444,27 @@ int.$(OBJEXT) internal.$(OBJEXT) list.$(OBJEXT) \ logfile.$(OBJEXT) multicast.$(OBJEXT) mem_node.$(OBJEXT) \ MemBuf.$(OBJEXT) MemObject.$(OBJEXT) mime.$(OBJEXT) \ - neighbors.$(OBJEXT) Packer.$(OBJEXT) Parsing.$(OBJEXT) \ - pconn.$(OBJEXT) peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ - peer_sourcehash.$(OBJEXT) peer_userhash.$(OBJEXT) \ - redirect.$(OBJEXT) referer.$(OBJEXT) refresh.$(OBJEXT) \ - RemovalPolicy.$(OBJEXT) Server.$(OBJEXT) $(am__objects_15) \ - $(am__objects_17) stat.$(OBJEXT) StatHist.$(OBJEXT) \ - stmem.$(OBJEXT) store.$(OBJEXT) store_client.$(OBJEXT) \ - store_digest.$(OBJEXT) store_dir.$(OBJEXT) store_io.$(OBJEXT) \ - store_key_md5.$(OBJEXT) store_log.$(OBJEXT) \ - store_rebuild.$(OBJEXT) store_swapin.$(OBJEXT) \ - store_swapmeta.$(OBJEXT) store_swapout.$(OBJEXT) \ - StoreFileSystem.$(OBJEXT) StoreIOState.$(OBJEXT) \ - StoreMeta.$(OBJEXT) StoreMetaMD5.$(OBJEXT) \ - StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ - StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ - StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ - $(am__objects_24) tools.$(OBJEXT) tunnel.$(OBJEXT) \ - SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ - urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ - whois.$(OBJEXT) $(am__objects_19) wordlist.$(OBJEXT) + mime_header.$(OBJEXT) neighbors.$(OBJEXT) Packer.$(OBJEXT) \ + Parsing.$(OBJEXT) pconn.$(OBJEXT) peer_digest.$(OBJEXT) \ + peer_select.$(OBJEXT) peer_sourcehash.$(OBJEXT) \ + peer_userhash.$(OBJEXT) redirect.$(OBJEXT) referer.$(OBJEXT) \ + refresh.$(OBJEXT) RemovalPolicy.$(OBJEXT) Server.$(OBJEXT) \ + $(am__objects_15) $(am__objects_17) stat.$(OBJEXT) \ + StatHist.$(OBJEXT) stmem.$(OBJEXT) store.$(OBJEXT) \ + store_client.$(OBJEXT) store_digest.$(OBJEXT) \ + store_dir.$(OBJEXT) store_io.$(OBJEXT) store_key_md5.$(OBJEXT) \ + store_log.$(OBJEXT) store_rebuild.$(OBJEXT) \ + store_swapin.$(OBJEXT) store_swapmeta.$(OBJEXT) \ + store_swapout.$(OBJEXT) StoreFileSystem.$(OBJEXT) \ + StoreIOState.$(OBJEXT) StoreMeta.$(OBJEXT) \ + StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ + StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ + StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ + StoreSwapLogData.$(OBJEXT) $(am__objects_24) tools.$(OBJEXT) \ + tunnel.$(OBJEXT) SwapDir.$(OBJEXT) url.$(OBJEXT) \ + URLScheme.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ + wccp2.$(OBJEXT) whois.$(OBJEXT) $(am__objects_19) \ + wordlist.$(OBJEXT) nodist_tests_testCacheManager_OBJECTS = globals.$(OBJEXT) \ repl_modules.$(OBJEXT) string_arrays.$(OBJEXT) tests_testCacheManager_OBJECTS = $(am_tests_testCacheManager_OBJECTS) \ @@ -622,8 +624,8 @@ HttpHdrScTarget.cc HttpMsg.cc HttpReply.cc HttpStatusLine.cc \ icp_v2.cc icp_v3.cc ipc.cc ipc_win32.cc ipcache.cc int.cc \ internal.cc list.cc logfile.cc multicast.cc mem_node.cc \ - MemBuf.cc MemObject.cc mime.cc neighbors.cc Packer.cc \ - Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ + MemBuf.cc MemObject.cc mime.cc mime_header.cc neighbors.cc \ + Packer.cc Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ peer_sourcehash.cc peer_userhash.cc redirect.cc referer.cc \ refresh.cc Server.cc snmp_core.cc snmp_agent.cc ssl_support.cc \ ssl_support.h stat.cc StatHist.cc stmem.cc store.cc \ @@ -661,26 +663,26 @@ int.$(OBJEXT) internal.$(OBJEXT) list.$(OBJEXT) \ logfile.$(OBJEXT) multicast.$(OBJEXT) mem_node.$(OBJEXT) \ MemBuf.$(OBJEXT) MemObject.$(OBJEXT) mime.$(OBJEXT) \ - neighbors.$(OBJEXT) Packer.$(OBJEXT) Parsing.$(OBJEXT) \ - pconn.$(OBJEXT) peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ - peer_sourcehash.$(OBJEXT) peer_userhash.$(OBJEXT) \ - redirect.$(OBJEXT) referer.$(OBJEXT) refresh.$(OBJEXT) \ - Server.$(OBJEXT) $(am__objects_15) $(am__objects_17) \ - stat.$(OBJEXT) StatHist.$(OBJEXT) stmem.$(OBJEXT) \ - store.$(OBJEXT) store_client.$(OBJEXT) store_digest.$(OBJEXT) \ - store_dir.$(OBJEXT) store_io.$(OBJEXT) store_key_md5.$(OBJEXT) \ - store_log.$(OBJEXT) store_rebuild.$(OBJEXT) \ - store_swapin.$(OBJEXT) store_swapmeta.$(OBJEXT) \ - store_swapout.$(OBJEXT) StoreFileSystem.$(OBJEXT) \ - StoreIOState.$(OBJEXT) StoreMeta.$(OBJEXT) \ - StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ - StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ - StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ - StoreSwapLogData.$(OBJEXT) $(am__objects_24) tools.$(OBJEXT) \ - tunnel.$(OBJEXT) SwapDir.$(OBJEXT) url.$(OBJEXT) \ - URLScheme.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ - wccp2.$(OBJEXT) whois.$(OBJEXT) $(am__objects_19) \ - wordlist.$(OBJEXT) + mime_header.$(OBJEXT) neighbors.$(OBJEXT) Packer.$(OBJEXT) \ + Parsing.$(OBJEXT) pconn.$(OBJEXT) peer_digest.$(OBJEXT) \ + peer_select.$(OBJEXT) peer_sourcehash.$(OBJEXT) \ + peer_userhash.$(OBJEXT) redirect.$(OBJEXT) referer.$(OBJEXT) \ + refresh.$(OBJEXT) Server.$(OBJEXT) $(am__objects_15) \ + $(am__objects_17) stat.$(OBJEXT) StatHist.$(OBJEXT) \ + stmem.$(OBJEXT) store.$(OBJEXT) store_client.$(OBJEXT) \ + store_digest.$(OBJEXT) store_dir.$(OBJEXT) store_io.$(OBJEXT) \ + store_key_md5.$(OBJEXT) store_log.$(OBJEXT) \ + store_rebuild.$(OBJEXT) store_swapin.$(OBJEXT) \ + store_swapmeta.$(OBJEXT) store_swapout.$(OBJEXT) \ + StoreFileSystem.$(OBJEXT) StoreIOState.$(OBJEXT) \ + StoreMeta.$(OBJEXT) StoreMetaMD5.$(OBJEXT) \ + StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ + StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ + StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ + $(am__objects_24) tools.$(OBJEXT) tunnel.$(OBJEXT) \ + SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ + urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ + whois.$(OBJEXT) $(am__objects_19) wordlist.$(OBJEXT) nodist_tests_testEvent_OBJECTS = globals.$(OBJEXT) \ repl_modules.$(OBJEXT) string_arrays.$(OBJEXT) tests_testEvent_OBJECTS = $(am_tests_testEvent_OBJECTS) \ @@ -714,8 +716,8 @@ HttpHdrScTarget.cc HttpMsg.cc HttpReply.cc HttpStatusLine.cc \ icp_v2.cc icp_v3.cc ipc.cc ipc_win32.cc ipcache.cc int.cc \ internal.cc list.cc logfile.cc multicast.cc mem_node.cc \ - MemBuf.cc MemObject.cc mime.cc neighbors.cc Packer.cc \ - Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ + MemBuf.cc MemObject.cc mime.cc mime_header.cc neighbors.cc \ + Packer.cc Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ peer_sourcehash.cc peer_userhash.cc redirect.cc referer.cc \ refresh.cc Server.cc snmp_core.cc snmp_agent.cc ssl_support.cc \ ssl_support.h stat.cc StatHist.cc stmem.cc store.cc \ @@ -753,26 +755,26 @@ int.$(OBJEXT) internal.$(OBJEXT) list.$(OBJEXT) \ logfile.$(OBJEXT) multicast.$(OBJEXT) mem_node.$(OBJEXT) \ MemBuf.$(OBJEXT) MemObject.$(OBJEXT) mime.$(OBJEXT) \ - neighbors.$(OBJEXT) Packer.$(OBJEXT) Parsing.$(OBJEXT) \ - pconn.$(OBJEXT) peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ - peer_sourcehash.$(OBJEXT) peer_userhash.$(OBJEXT) \ - redirect.$(OBJEXT) referer.$(OBJEXT) refresh.$(OBJEXT) \ - Server.$(OBJEXT) $(am__objects_15) $(am__objects_17) \ - stat.$(OBJEXT) StatHist.$(OBJEXT) stmem.$(OBJEXT) \ - store.$(OBJEXT) store_client.$(OBJEXT) store_digest.$(OBJEXT) \ - store_dir.$(OBJEXT) store_io.$(OBJEXT) store_key_md5.$(OBJEXT) \ - store_log.$(OBJEXT) store_rebuild.$(OBJEXT) \ - store_swapin.$(OBJEXT) store_swapmeta.$(OBJEXT) \ - store_swapout.$(OBJEXT) StoreFileSystem.$(OBJEXT) \ - StoreIOState.$(OBJEXT) StoreMeta.$(OBJEXT) \ - StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ - StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ - StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ - StoreSwapLogData.$(OBJEXT) $(am__objects_24) tools.$(OBJEXT) \ - tunnel.$(OBJEXT) SwapDir.$(OBJEXT) url.$(OBJEXT) \ - URLScheme.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ - wccp2.$(OBJEXT) whois.$(OBJEXT) $(am__objects_19) \ - wordlist.$(OBJEXT) + mime_header.$(OBJEXT) neighbors.$(OBJEXT) Packer.$(OBJEXT) \ + Parsing.$(OBJEXT) pconn.$(OBJEXT) peer_digest.$(OBJEXT) \ + peer_select.$(OBJEXT) peer_sourcehash.$(OBJEXT) \ + peer_userhash.$(OBJEXT) redirect.$(OBJEXT) referer.$(OBJEXT) \ + refresh.$(OBJEXT) Server.$(OBJEXT) $(am__objects_15) \ + $(am__objects_17) stat.$(OBJEXT) StatHist.$(OBJEXT) \ + stmem.$(OBJEXT) store.$(OBJEXT) store_client.$(OBJEXT) \ + store_digest.$(OBJEXT) store_dir.$(OBJEXT) store_io.$(OBJEXT) \ + store_key_md5.$(OBJEXT) store_log.$(OBJEXT) \ + store_rebuild.$(OBJEXT) store_swapin.$(OBJEXT) \ + store_swapmeta.$(OBJEXT) store_swapout.$(OBJEXT) \ + StoreFileSystem.$(OBJEXT) StoreIOState.$(OBJEXT) \ + StoreMeta.$(OBJEXT) StoreMetaMD5.$(OBJEXT) \ + StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ + StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ + StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ + $(am__objects_24) tools.$(OBJEXT) tunnel.$(OBJEXT) \ + SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ + urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ + whois.$(OBJEXT) $(am__objects_19) wordlist.$(OBJEXT) nodist_tests_testEventLoop_OBJECTS = globals.$(OBJEXT) \ repl_modules.$(OBJEXT) string_arrays.$(OBJEXT) tests_testEventLoop_OBJECTS = $(am_tests_testEventLoop_OBJECTS) \ @@ -780,6 +782,23 @@ tests_testEventLoop_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(tests_testEventLoop_LDFLAGS) $(LDFLAGS) -o $@ +am_tests_testHttpReply_OBJECTS = tests/testHttpReply.$(OBJEXT) \ + tests/testMain.$(OBJEXT) cbdata.$(OBJEXT) ETag.$(OBJEXT) \ + HttpBody.$(OBJEXT) HttpHdrCc.$(OBJEXT) \ + HttpHdrContRange.$(OBJEXT) HttpHdrRange.$(OBJEXT) \ + HttpHdrSc.$(OBJEXT) HttpHdrScTarget.$(OBJEXT) \ + HttpHeader.$(OBJEXT) HttpHeaderTools.$(OBJEXT) \ + HttpMsg.$(OBJEXT) HttpReply.$(OBJEXT) HttpStatusLine.$(OBJEXT) \ + mem.$(OBJEXT) MemBuf.$(OBJEXT) mime_header.$(OBJEXT) \ + Packer.$(OBJEXT) tests/stub_cache_manager.$(OBJEXT) \ + tests/stub_StatHist.$(OBJEXT) tests/stub_store.$(OBJEXT) \ + String.$(OBJEXT) time.$(OBJEXT) +nodist_tests_testHttpReply_OBJECTS = $(am__objects_25) +tests_testHttpReply_OBJECTS = $(am_tests_testHttpReply_OBJECTS) \ + $(nodist_tests_testHttpReply_OBJECTS) +tests_testHttpReply_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(tests_testHttpReply_LDFLAGS) $(LDFLAGS) -o $@ am__tests_testHttpRequest_SOURCES_DIST = debug.cc HttpRequest.cc \ HttpRequestMethod.cc mem.cc String.cc tests/testHttpRequest.h \ tests/testHttpRequest.cc tests/testHttpRequestMethod.h \ @@ -806,8 +825,8 @@ HttpHdrScTarget.cc HttpMsg.cc HttpReply.cc HttpStatusLine.cc \ icp_v2.cc icp_v3.cc ipc.cc ipc_win32.cc ipcache.cc int.cc \ internal.cc list.cc logfile.cc multicast.cc mem_node.cc \ - MemBuf.cc MemObject.cc mime.cc neighbors.cc Packer.cc \ - Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ + MemBuf.cc MemObject.cc mime.cc mime_header.cc neighbors.cc \ + Packer.cc Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ peer_sourcehash.cc peer_userhash.cc redirect.cc referer.cc \ refresh.cc RemovalPolicy.cc Server.cc snmp_core.cc \ snmp_agent.cc ssl_support.cc ssl_support.h stat.cc StatHist.cc \ @@ -846,26 +865,27 @@ int.$(OBJEXT) internal.$(OBJEXT) list.$(OBJEXT) \ logfile.$(OBJEXT) multicast.$(OBJEXT) mem_node.$(OBJEXT) \ MemBuf.$(OBJEXT) MemObject.$(OBJEXT) mime.$(OBJEXT) \ - neighbors.$(OBJEXT) Packer.$(OBJEXT) Parsing.$(OBJEXT) \ - pconn.$(OBJEXT) peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ - peer_sourcehash.$(OBJEXT) peer_userhash.$(OBJEXT) \ - redirect.$(OBJEXT) referer.$(OBJEXT) refresh.$(OBJEXT) \ - RemovalPolicy.$(OBJEXT) Server.$(OBJEXT) $(am__objects_15) \ - $(am__objects_17) stat.$(OBJEXT) StatHist.$(OBJEXT) \ - stmem.$(OBJEXT) store.$(OBJEXT) store_client.$(OBJEXT) \ - store_digest.$(OBJEXT) store_dir.$(OBJEXT) store_io.$(OBJEXT) \ - store_key_md5.$(OBJEXT) store_log.$(OBJEXT) \ - store_rebuild.$(OBJEXT) store_swapin.$(OBJEXT) \ - store_swapmeta.$(OBJEXT) store_swapout.$(OBJEXT) \ - StoreFileSystem.$(OBJEXT) StoreIOState.$(OBJEXT) \ - StoreMeta.$(OBJEXT) StoreMetaMD5.$(OBJEXT) \ - StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ - StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ - StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ - $(am__objects_24) tools.$(OBJEXT) tunnel.$(OBJEXT) \ - SwapDir.$(OBJEXT) url.$(OBJEXT) URLScheme.$(OBJEXT) \ - urn.$(OBJEXT) useragent.$(OBJEXT) wccp2.$(OBJEXT) \ - whois.$(OBJEXT) $(am__objects_19) wordlist.$(OBJEXT) + mime_header.$(OBJEXT) neighbors.$(OBJEXT) Packer.$(OBJEXT) \ + Parsing.$(OBJEXT) pconn.$(OBJEXT) peer_digest.$(OBJEXT) \ + peer_select.$(OBJEXT) peer_sourcehash.$(OBJEXT) \ + peer_userhash.$(OBJEXT) redirect.$(OBJEXT) referer.$(OBJEXT) \ + refresh.$(OBJEXT) RemovalPolicy.$(OBJEXT) Server.$(OBJEXT) \ + $(am__objects_15) $(am__objects_17) stat.$(OBJEXT) \ + StatHist.$(OBJEXT) stmem.$(OBJEXT) store.$(OBJEXT) \ + store_client.$(OBJEXT) store_digest.$(OBJEXT) \ + store_dir.$(OBJEXT) store_io.$(OBJEXT) store_key_md5.$(OBJEXT) \ + store_log.$(OBJEXT) store_rebuild.$(OBJEXT) \ + store_swapin.$(OBJEXT) store_swapmeta.$(OBJEXT) \ + store_swapout.$(OBJEXT) StoreFileSystem.$(OBJEXT) \ + StoreIOState.$(OBJEXT) StoreMeta.$(OBJEXT) \ + StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ + StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ + StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ + StoreSwapLogData.$(OBJEXT) $(am__objects_24) tools.$(OBJEXT) \ + tunnel.$(OBJEXT) SwapDir.$(OBJEXT) url.$(OBJEXT) \ + URLScheme.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ + wccp2.$(OBJEXT) whois.$(OBJEXT) $(am__objects_19) \ + wordlist.$(OBJEXT) nodist_tests_testHttpRequest_OBJECTS = globals.$(OBJEXT) \ repl_modules.$(OBJEXT) string_arrays.$(OBJEXT) tests_testHttpRequest_OBJECTS = $(am_tests_testHttpRequest_OBJECTS) \ @@ -989,8 +1009,8 @@ HttpHdrScTarget.cc HttpMsg.cc HttpReply.cc HttpStatusLine.cc \ icp_v2.cc icp_v3.cc ipc.cc ipc_win32.cc ipcache.cc int.cc \ internal.cc list.cc logfile.cc multicast.cc mem_node.cc \ - MemBuf.cc MemObject.cc mime.cc neighbors.cc Packer.cc \ - Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ + MemBuf.cc MemObject.cc mime.cc mime_header.cc neighbors.cc \ + Packer.cc Parsing.cc pconn.cc peer_digest.cc peer_select.cc \ peer_sourcehash.cc peer_userhash.cc redirect.cc referer.cc \ refresh.cc Server.cc snmp_core.cc snmp_agent.cc ssl_support.cc \ ssl_support.h stat.cc StatHist.cc stmem.cc store.cc \ @@ -1029,26 +1049,26 @@ ipcache.$(OBJEXT) int.$(OBJEXT) internal.$(OBJEXT) \ list.$(OBJEXT) logfile.$(OBJEXT) multicast.$(OBJEXT) \ mem_node.$(OBJEXT) MemBuf.$(OBJEXT) MemObject.$(OBJEXT) \ - mime.$(OBJEXT) neighbors.$(OBJEXT) Packer.$(OBJEXT) \ - Parsing.$(OBJEXT) pconn.$(OBJEXT) peer_digest.$(OBJEXT) \ - peer_select.$(OBJEXT) peer_sourcehash.$(OBJEXT) \ - peer_userhash.$(OBJEXT) redirect.$(OBJEXT) referer.$(OBJEXT) \ - refresh.$(OBJEXT) Server.$(OBJEXT) $(am__objects_15) \ - $(am__objects_17) stat.$(OBJEXT) StatHist.$(OBJEXT) \ - stmem.$(OBJEXT) store.$(OBJEXT) store_client.$(OBJEXT) \ - store_digest.$(OBJEXT) store_dir.$(OBJEXT) store_io.$(OBJEXT) \ - store_key_md5.$(OBJEXT) store_log.$(OBJEXT) \ - store_rebuild.$(OBJEXT) store_swapin.$(OBJEXT) \ - store_swapmeta.$(OBJEXT) store_swapout.$(OBJEXT) \ - StoreFileSystem.$(OBJEXT) StoreIOState.$(OBJEXT) \ - StoreMeta.$(OBJEXT) StoreMetaMD5.$(OBJEXT) \ - StoreMetaSTD.$(OBJEXT) StoreMetaSTDLFS.$(OBJEXT) \ - StoreMetaUnpacker.$(OBJEXT) StoreMetaURL.$(OBJEXT) \ - StoreMetaVary.$(OBJEXT) StoreSwapLogData.$(OBJEXT) \ - $(am__objects_24) tools.$(OBJEXT) tunnel.$(OBJEXT) \ - SwapDir.$(OBJEXT) urn.$(OBJEXT) useragent.$(OBJEXT) \ - wccp2.$(OBJEXT) whois.$(OBJEXT) $(am__objects_19) \ - wordlist.$(OBJEXT) + mime.$(OBJEXT) mime_header.$(OBJEXT) neighbors.$(OBJEXT) \ + Packer.$(OBJEXT) Parsing.$(OBJEXT) pconn.$(OBJEXT) \ + peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ + peer_sourcehash.$(OBJEXT) peer_userhash.$(OBJEXT) \ + redirect.$(OBJEXT) referer.$(OBJEXT) refresh.$(OBJEXT) \ + Server.$(OBJEXT) $(am__objects_15) $(am__objects_17) \ + stat.$(OBJEXT) StatHist.$(OBJEXT) stmem.$(OBJEXT) \ + store.$(OBJEXT) store_client.$(OBJEXT) store_digest.$(OBJEXT) \ + store_dir.$(OBJEXT) store_io.$(OBJEXT) store_key_md5.$(OBJEXT) \ + store_log.$(OBJEXT) store_rebuild.$(OBJEXT) \ + store_swapin.$(OBJEXT) store_swapmeta.$(OBJEXT) \ + store_swapout.$(OBJEXT) StoreFileSystem.$(OBJEXT) \ + StoreIOState.$(OBJEXT) StoreMeta.$(OBJEXT) \ + StoreMetaMD5.$(OBJEXT) StoreMetaSTD.$(OBJEXT) \ + StoreMetaSTDLFS.$(OBJEXT) StoreMetaUnpacker.$(OBJEXT) \ + StoreMetaURL.$(OBJEXT) StoreMetaVary.$(OBJEXT) \ + StoreSwapLogData.$(OBJEXT) $(am__objects_24) tools.$(OBJEXT) \ + tunnel.$(OBJEXT) SwapDir.$(OBJEXT) urn.$(OBJEXT) \ + useragent.$(OBJEXT) wccp2.$(OBJEXT) whois.$(OBJEXT) \ + $(am__objects_19) wordlist.$(OBJEXT) nodist_tests_testURL_OBJECTS = globals.$(OBJEXT) \ repl_modules.$(OBJEXT) string_arrays.$(OBJEXT) tests_testURL_OBJECTS = $(am_tests_testURL_OBJECTS) \ @@ -1123,20 +1143,20 @@ HttpRequestMethod.cc HttpStatusLine.cc icp_v2.cc icp_v3.cc \ int.cc internal.cc ipc.cc ipc_win32.cc ipcache.cc list.cc \ logfile.cc mem.cc mem_node.cc MemObject.cc mime.cc \ - multicast.cc neighbors.cc Parsing.cc peer_digest.cc \ - peer_select.cc peer_sourcehash.cc peer_userhash.cc pconn.cc \ - redirect.cc referer.cc refresh.cc RemovalPolicy.cc Server.cc \ - snmp_core.cc snmp_agent.cc ssl_support.cc ssl_support.h \ - stat.cc StatHist.cc stmem.cc store.cc store_client.cc \ - store_digest.cc store_dir.cc store_key_md5.cc store_io.cc \ - store_log.cc store_rebuild.cc store_swapin.cc \ - store_swapmeta.cc store_swapout.cc StoreFileSystem.cc \ - StoreIOState.cc StoreMeta.cc StoreMetaMD5.cc StoreMetaSTD.cc \ - StoreMetaSTDLFS.cc StoreMetaUnpacker.cc StoreMetaURL.cc \ - StoreMetaVary.cc StoreSwapLogData.cc String.cc SwapDir.cc \ - event.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 + mime_header.cc multicast.cc neighbors.cc Parsing.cc \ + peer_digest.cc peer_select.cc peer_sourcehash.cc \ + peer_userhash.cc pconn.cc redirect.cc referer.cc refresh.cc \ + RemovalPolicy.cc Server.cc snmp_core.cc snmp_agent.cc \ + ssl_support.cc ssl_support.h stat.cc StatHist.cc stmem.cc \ + store.cc store_client.cc store_digest.cc store_dir.cc \ + store_key_md5.cc store_io.cc store_log.cc store_rebuild.cc \ + store_swapin.cc store_swapmeta.cc store_swapout.cc \ + StoreFileSystem.cc StoreIOState.cc StoreMeta.cc \ + StoreMetaMD5.cc StoreMetaSTD.cc StoreMetaSTDLFS.cc \ + StoreMetaUnpacker.cc StoreMetaURL.cc StoreMetaVary.cc \ + StoreSwapLogData.cc String.cc SwapDir.cc event.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) BodyPipe.$(OBJEXT) cache_cf.$(OBJEXT) \ ProtoPort.$(OBJEXT) cache_manager.$(OBJEXT) \ @@ -1161,8 +1181,8 @@ internal.$(OBJEXT) $(am__objects_11) ipcache.$(OBJEXT) \ list.$(OBJEXT) logfile.$(OBJEXT) mem.$(OBJEXT) \ mem_node.$(OBJEXT) MemObject.$(OBJEXT) mime.$(OBJEXT) \ - multicast.$(OBJEXT) neighbors.$(OBJEXT) Parsing.$(OBJEXT) \ - peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ + mime_header.$(OBJEXT) multicast.$(OBJEXT) neighbors.$(OBJEXT) \ + Parsing.$(OBJEXT) peer_digest.$(OBJEXT) peer_select.$(OBJEXT) \ peer_sourcehash.$(OBJEXT) peer_userhash.$(OBJEXT) \ pconn.$(OBJEXT) redirect.$(OBJEXT) referer.$(OBJEXT) \ refresh.$(OBJEXT) RemovalPolicy.$(OBJEXT) Server.$(OBJEXT) \ @@ -1251,6 +1271,8 @@ $(tests_testEvent_SOURCES) $(nodist_tests_testEvent_SOURCES) \ $(tests_testEventLoop_SOURCES) \ $(nodist_tests_testEventLoop_SOURCES) \ + $(tests_testHttpReply_SOURCES) \ + $(nodist_tests_testHttpReply_SOURCES) \ $(tests_testHttpRequest_SOURCES) \ $(nodist_tests_testHttpRequest_SOURCES) \ $(tests_testNull_SOURCES) $(nodist_tests_testNull_SOURCES) \ @@ -1274,6 +1296,7 @@ $(am__tests_testDiskIO_SOURCES_DIST) \ $(am__tests_testEvent_SOURCES_DIST) \ $(am__tests_testEventLoop_SOURCES_DIST) \ + $(tests_testHttpReply_SOURCES) \ $(am__tests_testHttpRequest_SOURCES_DIST) \ $(am__tests_testNull_SOURCES_DIST) \ $(am__tests_testStore_SOURCES_DIST) \ @@ -1487,7 +1510,7 @@ squid.conf.documented globals.cc string_arrays.c \ repl_modules.cc DiskIO/DiskIOModules_gen.cc test_tools.cc *.a \ testHeaders -TESTS = testHeaders +TESTS = $(check_PROGRAMS) testHeaders INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/src \ -I$(top_builddir)/include @SQUID_CPPUNIT_INC@ \ -I$(top_srcdir)/lib -I$(top_builddir)/src @@ -1700,9 +1723,9 @@ icp_v2.cc icp_v3.cc int.cc internal.cc $(IPC_SOURCE) \ ipcache.cc $(LEAKFINDERSOURCE) list.cc logfile.cc main.cc \ mem.cc mem_node.cc mem_node.h Mem.h MemBuf.cc MemObject.cc \ - MemObject.h mime.cc multicast.cc neighbors.cc Packer.cc \ - Packer.h Parsing.cc Parsing.h $(XPROF_STATS_SOURCE) pconn.cc \ - pconn.h PeerDigest.h peer_digest.cc peer_select.cc \ + MemObject.h mime.cc mime_header.cc multicast.cc neighbors.cc \ + Packer.cc Packer.h Parsing.cc Parsing.h $(XPROF_STATS_SOURCE) \ + pconn.cc pconn.h PeerDigest.h peer_digest.cc peer_select.cc \ peer_sourcehash.cc peer_userhash.cc PeerSelectState.h \ PingData.h protos.h redirect.cc referer.cc refresh.cc \ RemovalPolicy.cc RemovalPolicy.h send-announce.cc \ @@ -1936,6 +1959,64 @@ # -L../lib -lmiscutil #tests_testX_DEPENDENCIES= @SQUID_CPPUNIT_LA@ \ # $(top_builddir)/lib/libmiscutil.a + +# - add other component .(h|cc) files needed to link and run tests +tests_testHttpReply_SOURCES = \ + tests/testHttpReply.h \ + tests/testHttpReply.cc \ + tests/testMain.cc \ + cbdata.h \ + cbdata.cc \ + ETag.cc \ + HttpBody.cc \ + HttpHdrCc.cc \ + HttpHdrContRange.h \ + HttpHdrContRange.cc \ + HttpHdrRange.cc \ + HttpHdrSc.h \ + HttpHdrSc.cc \ + HttpHdrScTarget.h \ + HttpHdrScTarget.cc \ + HttpHeader.h \ + HttpHeader.cc \ + HttpHeaderMask.h \ + HttpHeaderTools.cc \ + HttpMsg.h \ + HttpMsg.cc \ + HttpReply.h \ + HttpReply.cc \ + HttpStatusLine.h \ + HttpStatusLine.cc \ + mem.cc \ + MemBuf.h \ + MemBuf.cc \ + mime_header.cc \ + Packer.h \ + Packer.cc \ + tests/stub_cache_manager.cc \ + tests/stub_StatHist.cc \ + tests/stub_store.cc \ + SquidString.h \ + String.cc \ + SquidTime.h \ + time.cc + +nodist_tests_testHttpReply_SOURCES = \ + $(TESTSOURCES) + +tests_testHttpReply_LDFLAGS = $(LIBADD_DL) +tests_testHttpReply_LDADD = \ + acl/libapi.la \ + acl/libstate.la \ + auth/libauth.la \ + ip/libip.la \ + @SQUID_CPPUNIT_LIBS@ \ + @SQUID_CPPUNIT_LA@ \ + -L../lib -lmiscutil + +tests_testHttpReply_DEPENDENCIES = @SQUID_CPPUNIT_LA@ \ + $(top_builddir)/lib/libmiscutil.a + tests_testAuth_SOURCES = \ tests/testAuth.cc tests/testMain.cc tests/testAuth.h \ ConfigParser.cc \ @@ -2110,6 +2191,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -2283,6 +2365,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -2432,6 +2515,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -2572,6 +2656,7 @@ mem_node.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ multicast.cc \ neighbors.cc \ Parsing.cc \ @@ -2724,6 +2809,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -3086,6 +3172,7 @@ MemBuf.cc \ MemObject.cc \ mime.cc \ + mime_header.cc \ neighbors.cc \ Packer.cc \ Parsing.cc \ @@ -3508,6 +3595,13 @@ tests/testEventLoop$(EXEEXT): $(tests_testEventLoop_OBJECTS) $(tests_testEventLoop_DEPENDENCIES) tests/$(am__dirstamp) @rm -f tests/testEventLoop$(EXEEXT) $(tests_testEventLoop_LINK) $(tests_testEventLoop_OBJECTS) $(tests_testEventLoop_LDADD) $(LIBS) +tests/testHttpReply.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +tests/stub_StatHist.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +tests/testHttpReply$(EXEEXT): $(tests_testHttpReply_OBJECTS) $(tests_testHttpReply_DEPENDENCIES) tests/$(am__dirstamp) + @rm -f tests/testHttpReply$(EXEEXT) + $(tests_testHttpReply_LINK) $(tests_testHttpReply_OBJECTS) $(tests_testHttpReply_LDADD) $(LIBS) tests/testHttpRequest.$(OBJEXT): tests/$(am__dirstamp) \ tests/$(DEPDIR)/$(am__dirstamp) tests/testHttpRequestMethod.$(OBJEXT): tests/$(am__dirstamp) \ @@ -3597,6 +3691,7 @@ -rm -f tests/stub_HttpReply.$(OBJEXT) -rm -f tests/stub_HttpRequest.$(OBJEXT) -rm -f tests/stub_MemObject.$(OBJEXT) + -rm -f tests/stub_StatHist.$(OBJEXT) -rm -f tests/stub_access_log.$(OBJEXT) -rm -f tests/stub_acl.$(OBJEXT) -rm -f tests/stub_cache_cf.$(OBJEXT) @@ -3622,6 +3717,7 @@ -rm -f tests/testDiskIO.$(OBJEXT) -rm -f tests/testEvent.$(OBJEXT) -rm -f tests/testEventLoop.$(OBJEXT) + -rm -f tests/testHttpReply.$(OBJEXT) -rm -f tests/testHttpRequest.$(OBJEXT) -rm -f tests/testHttpRequestMethod.$(OBJEXT) -rm -f tests/testMain.$(OBJEXT) @@ -3757,6 +3853,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem_node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mime_header.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multicast.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/neighbors.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pconn.Po@am__quote@ @@ -3829,6 +3926,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stub_HttpReply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stub_HttpRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stub_MemObject.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stub_StatHist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stub_access_log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stub_acl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stub_cache_cf.Po@am__quote@ @@ -3854,6 +3952,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/testDiskIO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/testEvent.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/testEventLoop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/testHttpReply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/testHttpRequest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/testHttpRequestMethod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/testMain.Po@am__quote@ diff -u -r -N squid-3.1.0.11/src/mime.cc squid-3.1.0.12/src/mime.cc --- squid-3.1.0.11/src/mime.cc 2009-07-19 17:11:14.000000000 +1200 +++ squid-3.1.0.12/src/mime.cc 2009-07-27 12:05:52.000000000 +1200 @@ -2,7 +2,7 @@ /* * $Id$ * - * DEBUG: section 25 MIME Parsing + * DEBUG: section 25 MIME Parsing and Internal Icons * AUTHOR: Harvest Derived * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -96,132 +96,6 @@ safe_free (address); } -/* returns a pointer to a field-value of the first matching field-name */ -char * -mime_get_header(const char *mime, const char *name) -{ - return mime_get_header_field(mime, name, NULL); -} - -/* - * returns a pointer to a field-value of the first matching field-name where - * field-value matches prefix if any - */ -char * -mime_get_header_field(const char *mime, const char *name, const char *prefix) -{ - LOCAL_ARRAY(char, header, GET_HDR_SZ); - const char *p = NULL; - char *q = NULL; - char got = 0; - const int namelen = name ? strlen(name) : 0; - const int preflen = prefix ? strlen(prefix) : 0; - int l; - - if (NULL == mime) - return NULL; - - assert(NULL != name); - - debugs(25, 5, "mime_get_header: looking for '" << name << "'"); - - for (p = mime; *p; p += strcspn(p, "\n\r")) { - if (strcmp(p, "\r\n\r\n") == 0 || strcmp(p, "\n\n") == 0) - return NULL; - - while (xisspace(*p)) - p++; - - if (strncasecmp(p, name, namelen)) - continue; - - if (!xisspace(p[namelen]) && p[namelen] != ':') - continue; - - l = strcspn(p, "\n\r") + 1; - - if (l > GET_HDR_SZ) - l = GET_HDR_SZ; - - xstrncpy(header, p, l); - - debugs(25, 5, "mime_get_header: checking '" << header << "'"); - - q = header; - - q += namelen; - - if (*q == ':') - q++, got = 1; - - while (xisspace(*q)) - q++, got = 1; - - if (got && prefix) { - /* we could process list entries here if we had strcasestr(). */ - /* make sure we did not match a part of another field-value */ - got = !strncasecmp(q, prefix, preflen) && !xisalpha(q[preflen]); - } - - if (got) { - debugs(25, 5, "mime_get_header: returning '" << q << "'"); - return q; - } - } - - return NULL; -} - -size_t -headersEnd(const char *mime, size_t l) -{ - size_t e = 0; - int state = 1; - - PROF_start(headersEnd); - - while (e < l && state < 3) { - switch (state) { - - case 0: - - if ('\n' == mime[e]) - state = 1; - - break; - - case 1: - if ('\r' == mime[e]) - state = 2; - else if ('\n' == mime[e]) - state = 3; - else - state = 0; - - break; - - case 2: - if ('\n' == mime[e]) - state = 3; - else - state = 0; - - break; - - default: - break; - } - - e++; - } - PROF_stop(headersEnd); - - if (3 == state) - return e; - - return 0; -} - static mimeEntry * mimeGetEntry(const char *fn, int skip_encodings) { diff -u -r -N squid-3.1.0.11/src/mime_header.cc squid-3.1.0.12/src/mime_header.cc --- squid-3.1.0.11/src/mime_header.cc 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.1.0.12/src/mime_header.cc 2009-07-27 12:05:52.000000000 +1200 @@ -0,0 +1,164 @@ + +/* + * $Id$ + * + * DEBUG: section 25 MiME Header Parsing + * AUTHOR: Harvest Derived + * + * 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. + * + */ + +#include "squid.h" + +#define GET_HDR_SZ 1024 + +/* returns a pointer to a field-value of the first matching field-name */ +char * +mime_get_header(const char *mime, const char *name) +{ + return mime_get_header_field(mime, name, NULL); +} + +/* + * returns a pointer to a field-value of the first matching field-name where + * field-value matches prefix if any + */ +char * +mime_get_header_field(const char *mime, const char *name, const char *prefix) +{ + LOCAL_ARRAY(char, header, GET_HDR_SZ); + const char *p = NULL; + char *q = NULL; + char got = 0; + const int namelen = name ? strlen(name) : 0; + const int preflen = prefix ? strlen(prefix) : 0; + int l; + + if (NULL == mime) + return NULL; + + assert(NULL != name); + + debugs(25, 5, "mime_get_header: looking for '" << name << "'"); + + for (p = mime; *p; p += strcspn(p, "\n\r")) { + if (strcmp(p, "\r\n\r\n") == 0 || strcmp(p, "\n\n") == 0) + return NULL; + + while (xisspace(*p)) + p++; + + if (strncasecmp(p, name, namelen)) + continue; + + if (!xisspace(p[namelen]) && p[namelen] != ':') + continue; + + l = strcspn(p, "\n\r") + 1; + + if (l > GET_HDR_SZ) + l = GET_HDR_SZ; + + xstrncpy(header, p, l); + + debugs(25, 5, "mime_get_header: checking '" << header << "'"); + + q = header; + + q += namelen; + + if (*q == ':') + q++, got = 1; + + while (xisspace(*q)) + q++, got = 1; + + if (got && prefix) { + /* we could process list entries here if we had strcasestr(). */ + /* make sure we did not match a part of another field-value */ + got = !strncasecmp(q, prefix, preflen) && !xisalpha(q[preflen]); + } + + if (got) { + debugs(25, 5, "mime_get_header: returning '" << q << "'"); + return q; + } + } + + return NULL; +} + +size_t +headersEnd(const char *mime, size_t l) +{ + size_t e = 0; + int state = 1; + + PROF_start(headersEnd); + + while (e < l && state < 3) { + switch (state) { + + case 0: + + if ('\n' == mime[e]) + state = 1; + + break; + + case 1: + if ('\r' == mime[e]) + state = 2; + else if ('\n' == mime[e]) + state = 3; + else + state = 0; + + break; + + case 2: + if ('\n' == mime[e]) + state = 3; + else + state = 0; + + break; + + default: + break; + } + + e++; + } + PROF_stop(headersEnd); + + if (3 == state) + return e; + + return 0; +} diff -u -r -N squid-3.1.0.11/src/String.cc squid-3.1.0.12/src/String.cc --- squid-3.1.0.11/src/String.cc 2009-07-19 17:11:12.000000000 +1200 +++ squid-3.1.0.12/src/String.cc 2009-07-27 12:05:50.000000000 +1200 @@ -150,6 +150,7 @@ PROF_start(StringClean); assert(this); + /* TODO if mempools has already closed this will FAIL!! */ if (defined()) memFreeString(size_, buf_); diff -u -r -N squid-3.1.0.11/src/tests/stub_HttpReply.cc squid-3.1.0.12/src/tests/stub_HttpReply.cc --- squid-3.1.0.11/src/tests/stub_HttpReply.cc 2009-07-19 17:11:15.000000000 +1200 +++ squid-3.1.0.12/src/tests/stub_HttpReply.cc 2009-07-27 12:05:53.000000000 +1200 @@ -70,7 +70,7 @@ } bool -HttpReply::sanityCheckStartLine(MemBuf *buf, http_status *error) +HttpReply::sanityCheckStartLine(MemBuf *buf, const size_t hdr_len, http_status *error) { fatal ("Not implemented"); return false; diff -u -r -N squid-3.1.0.11/src/tests/stub_HttpRequest.cc squid-3.1.0.12/src/tests/stub_HttpRequest.cc --- squid-3.1.0.11/src/tests/stub_HttpRequest.cc 2009-07-19 17:11:15.000000000 +1200 +++ squid-3.1.0.12/src/tests/stub_HttpRequest.cc 2009-07-27 12:05:53.000000000 +1200 @@ -56,7 +56,7 @@ } bool -HttpRequest::sanityCheckStartLine(MemBuf *buf, http_status *error) +HttpRequest::sanityCheckStartLine(MemBuf *buf, const size_t hdr_len, http_status *error) { fatal("Not implemented"); return false; diff -u -r -N squid-3.1.0.11/src/tests/stub_StatHist.cc squid-3.1.0.12/src/tests/stub_StatHist.cc --- squid-3.1.0.11/src/tests/stub_StatHist.cc 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.1.0.12/src/tests/stub_StatHist.cc 2009-07-27 12:05:53.000000000 +1200 @@ -0,0 +1,22 @@ +#include "squid.h" + +// for StatHist definitions +#include "protos.h" + +void +statHistDump(const StatHist * H, StoreEntry * sentry, StatHistBinDumper * bd) +{ + fatal("statHistDump: Not implemented"); +} + +void +statHistCount(StatHist * H, double val) +{ + fatal("statHistCount: Not implemented"); +} + +void +statHistEnumInit(StatHist * H, int last_enum) +{ +//NO-OP fatal("statHistEnumInit: Not implemented"); +} diff -u -r -N squid-3.1.0.11/src/tests/stub_store.cc squid-3.1.0.12/src/tests/stub_store.cc --- squid-3.1.0.11/src/tests/stub_store.cc 2009-07-19 17:11:15.000000000 +1200 +++ squid-3.1.0.12/src/tests/stub_store.cc 2009-07-27 12:05:53.000000000 +1200 @@ -40,13 +40,13 @@ extern "C" void storeAppendPrintf(StoreEntry * e, const char *fmt,...) { - fatal("Not implemented"); + fatal("storeAppendPrintf: Not implemented"); } extern "C" void storeAppendVPrintf(StoreEntry * e, const char *fmt, va_list vargs) { - fatal("Not implemented"); + fatal("storeAppendVPrintf: Not implemented"); } #ifndef _USE_INLINE_ diff -u -r -N squid-3.1.0.11/src/tests/testHttpReply.cc squid-3.1.0.12/src/tests/testHttpReply.cc --- squid-3.1.0.11/src/tests/testHttpReply.cc 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.1.0.12/src/tests/testHttpReply.cc 2009-07-27 12:05:53.000000000 +1200 @@ -0,0 +1,183 @@ +#include "config.h" +#include + +#include "testHttpReply.h" +#include "HttpReply.h" +#include "Mem.h" + +/* to avoid libsquid.la and its comm stuff */ +#include "TextException.cc" + +CPPUNIT_TEST_SUITE_REGISTRATION( testHttpReply ); + +struct SquidConfig Config; + +/* stub functions to link successfully */ + +#include "Store.h" +void +StoreEntry::timestampsSet() +{ + fatal("StoreEntry::timestampsSet. Not implemented."); +} + +void +StoreEntry::setPublicKey() +{ + fatal("StoreEntry::setPulicKey. Not implemented."); +} + +#include "MemObject.h" +int64_t +MemObject::endOffset() const +{ + return 0; +} + +#include "ConfigParser.h" +void +ConfigParser::destruct() +{ +// CALLED as shutdown no-op +// fatal("ConfigParser::destruct. Not implemented."); +} + +void +eventAdd(const char *name, EVH * func, void *arg, double when, int, bool cbdata) +{ +// CALLED as setUp no-op +// fatal("eventAdd. Not implemented."); +} + +/* end */ + +void +testHttpReply::setUp() +{ + Mem::Init(); + httpHeaderInitModule(); +} + +void +testHttpReply::testSanityCheckFirstLine() +{ + MemBuf input; + HttpReply engine; + http_status error = HTTP_STATUS_NONE; + size_t hdr_len; + input.init(); + + // a valid status line + input.append("HTTP/1.1 200 Okay\n\n", 19); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT( 1 && engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append("HTTP/1.1 200 Okay \n\n", 28); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT( 2 && engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + +#if TODO // these cases are only checked after parse... + // invalid status line + input.append("HTTP/1.1 999 Okay\n\n", 19); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT( 3 && !engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append("HTTP/1.1 2000 Okay \n\n", 29); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT( 4 && engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; +#endif + + // empty status line + input.append("\n\n", 2); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT( 5 && !engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append(" \n\n", 8); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT( 6 && !engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + // status line with no message + input.append("HTTP/1.1 200\n\n", 14); /* real case seen */ + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append("HTTP/1.1 200 \n\n", 15); /* real case seen */ + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + +#if FUTURE + + // status line with no status + input.append("HTTP/1.1 \n\n", 11); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append("HTTP/1.1 \n\n", 15); + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append("HTTP/1.1 Okay\n\n", 16); /* real case seen */ + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + // status line with nul-byte + input.append("HTTP/1.1\0200 Okay\n\n", 19); /* real case seen */ + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + // status line with negative status + input.append("HTTP/1.1 -000\n\n", 15); /* real case seen */ + hdr_len = headersEnd(input.content(),input.contentSize()); + CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; + + // status line with non-HTTP protocol + input.append("ICY/1.1 200 Okay\n\n", 18); /* real case seen */ + hdr_len = headersEnd(input.content(),input.contentSize()); + /* NP: for nw ICY is handled as a pass-thru */ + /* Squid-3 will ignore it (and mangle the headers as per HTTP). */ + CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; +#endif + +} diff -u -r -N squid-3.1.0.11/src/tests/testHttpReply.h squid-3.1.0.12/src/tests/testHttpReply.h --- squid-3.1.0.11/src/tests/testHttpReply.h 1970-01-01 12:00:00.000000000 +1200 +++ squid-3.1.0.12/src/tests/testHttpReply.h 2009-07-27 12:05:53.000000000 +1200 @@ -0,0 +1,25 @@ + +#ifndef SQUID_SRC_TEST_HTTP_REPLY_H +#define SQUID_SRC_TEST_HTTP_REPLY_H + +#include + +/* + * test HttpReply + */ + +class testHttpReply : public CPPUNIT_NS::TestFixture +{ + CPPUNIT_TEST_SUITE( testHttpReply ); + CPPUNIT_TEST( testSanityCheckFirstLine ); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp(); + +protected: + void testSanityCheckFirstLine(); +}; + +#endif + diff -u -r -N squid-3.1.0.11/src/tests/testHttpRequest.cc squid-3.1.0.12/src/tests/testHttpRequest.cc --- squid-3.1.0.11/src/tests/testHttpRequest.cc 2009-07-19 17:11:15.000000000 +1200 +++ squid-3.1.0.12/src/tests/testHttpRequest.cc 2009-07-27 12:05:53.000000000 +1200 @@ -9,6 +9,13 @@ CPPUNIT_TEST_SUITE_REGISTRATION( testHttpRequest ); +/** wrapper for testing HttpRequest object private and protected functions */ +class PrivateHttpRequest : public HttpRequest +{ +public: + bool doSanityCheckStartLine(MemBuf *b, const size_t h, http_status *e) { return sanityCheckStartLine(b,h,e); }; +}; + /* stub functions to link successfully */ void shut_down(int) @@ -26,6 +33,7 @@ testHttpRequest::setUp() { Mem::Init(); + httpHeaderInitModule(); } /* @@ -150,3 +158,60 @@ CPPUNIT_ASSERT_EQUAL(String("http://2000:800::45/foo"), String(url)); xfree(url); } + +void +testHttpRequest::testSanityCheckStartLine() +{ + MemBuf input; + PrivateHttpRequest engine; + http_status error = HTTP_STATUS_NONE; + size_t hdr_len; + input.init(); + + // a valid request line + input.append("GET / HTTP/1.1\n\n", 16); + hdr_len = headersEnd(input.content(), input.contentSize()); + CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append("GET / HTTP/1.1\n\n", 18); + hdr_len = headersEnd(input.content(), input.contentSize()); + CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + + // strange but valid methods + input.append(". / HTTP/1.1\n\n", 14); + hdr_len = headersEnd(input.content(), input.contentSize()); + CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + + input.append("OPTIONS * HTTP/1.1\n\n", 20); + hdr_len = headersEnd(input.content(), input.contentSize()); + CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE); + input.reset(); + error = HTTP_STATUS_NONE; + +// TODO no method + +// TODO binary code in method + +// TODO no URL + +// TODO no status (okay) + +// TODO non-HTTP protocol + + input.append(" \n\n", 8); + hdr_len = headersEnd(input.content(), input.contentSize()); + CPPUNIT_ASSERT(!engine.doSanityCheckStartLine(&input, hdr_len, &error) ); + CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER); + input.reset(); + error = HTTP_STATUS_NONE; +} diff -u -r -N squid-3.1.0.11/src/tests/testHttpRequest.h squid-3.1.0.12/src/tests/testHttpRequest.h --- squid-3.1.0.11/src/tests/testHttpRequest.h 2009-07-19 17:11:15.000000000 +1200 +++ squid-3.1.0.12/src/tests/testHttpRequest.h 2009-07-27 12:05:53.000000000 +1200 @@ -14,6 +14,7 @@ CPPUNIT_TEST( testCreateFromUrlAndMethod ); CPPUNIT_TEST( testCreateFromUrl ); CPPUNIT_TEST( testIPv6HostColonBug ); + CPPUNIT_TEST( testSanityCheckStartLine ); CPPUNIT_TEST_SUITE_END(); public: @@ -23,6 +24,7 @@ void testCreateFromUrlAndMethod(); void testCreateFromUrl(); void testIPv6HostColonBug(); + void testSanityCheckStartLine(); }; #endif diff -u -r -N squid-3.1.0.11/tools/squidclient.1 squid-3.1.0.12/tools/squidclient.1 --- squid-3.1.0.11/tools/squidclient.1 2009-07-19 17:11:15.000000000 +1200 +++ squid-3.1.0.12/tools/squidclient.1 2009-07-27 12:05:53.000000000 +1200 @@ -43,7 +43,7 @@ .B squidclient is a tool providing a command line interface for retrieving URLs. Designed for testing any HTTP 0.9, 1.0, or 1.1 web server or proxy. -This tool can be combined scripts to perform any basic HTTP operation. +This tool can be combined with scripts to perform any basic HTTP operation. Some additional features for access to the .B Squid proxy object cache and management information are provided.