]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Make HttpParser parse version directly into AnyP::ProtocolVersion object
authorAmos Jeffries <squid3@treenet.co.nz>
Mon, 23 Dec 2013 11:21:48 +0000 (03:21 -0800)
committerAmos Jeffries <squid3@treenet.co.nz>
Mon, 23 Dec 2013 11:21:48 +0000 (03:21 -0800)
There appears to be no need for the protocol version object to be outside
the parser. We can simplify the processing code by parsing directly into
the object from the I/O buffer.

TODO: allow parsing of non-HTTP protocol labels.

src/HttpMsg.h
src/Makefile.am
src/client_side.cc
src/http/Http1Parser.cc
src/http/Http1Parser.h
src/tests/testHttpParser.cc

index f20ba6838f382eb6661198ed380759eeae95830e..726f446e263e7063d376f810c5d7448a906d6059 100644 (file)
@@ -67,6 +67,7 @@ public:
     bool persistent() const;
 
 public:
+    /// transport protocol version for this message
     Http::ProtocolVersion http_ver;
 
     HttpHeader header;
@@ -80,6 +81,7 @@ public:
 
     int64_t content_length;
 
+    /// URL scheme protocol (if relevant)
     AnyP::ProtocolType protocol;
 
     HttpMsgParseState pstate;   /* the current parsing state */
index fb43057e2658ee2f5dd6416ca2fe32424fd5084d..87f1fcc4145c5b21e31ec1bd6e3ace3a521a5d68 100644 (file)
@@ -2549,6 +2549,7 @@ nodist_tests_testHttpParser_SOURCES = \
        $(TESTSOURCES)
 tests_testHttpParser_LDADD= \
        http/libsquid-http.la \
+       anyp/libanyp.la \
        SquidConfig.o \
        base/libbase.la \
        ip/libip.la \
index 4b8851d85fb696ff08e40ce5962abec3b0b6c14c..cf8bec59fef548fedf163ff42c2506b2febd0f4e 100644 (file)
@@ -206,7 +206,7 @@ static IOACB httpsAccept;
 #endif
 static CTCB clientLifetimeTimeout;
 static ClientSocketContext *parseHttpRequestAbort(ConnStateData * conn, const char *uri);
-static ClientSocketContext *parseHttpRequest(ConnStateData *, const HttpParserPointer &, HttpRequestMethod *, Http::ProtocolVersion *);
+static ClientSocketContext *parseHttpRequest(ConnStateData *, const HttpParserPointer &, HttpRequestMethod *);
 #if USE_IDENT
 static IDCB clientIdentDone;
 #endif
@@ -2212,7 +2212,7 @@ prepareTransparentURL(ConnStateData * conn, ClientHttpRequest *http, char *url,
  *          a ClientSocketContext structure on success or failure.
  */
 static ClientSocketContext *
-parseHttpRequest(ConnStateData *csd, const HttpParserPointer &hp, HttpRequestMethod * method_p, Http::ProtocolVersion *http_ver)
+parseHttpRequest(ConnStateData *csd, const HttpParserPointer &hp, HttpRequestMethod * method_p)
 {
     char *req_hdr = NULL;
     char *end;
@@ -2249,10 +2249,9 @@ parseHttpRequest(ConnStateData *csd, const HttpParserPointer &hp, HttpRequestMet
     }
 
     /* Request line is valid here .. */
-    *http_ver = Http::ProtocolVersion(hp->req.v_maj, hp->req.v_min);
 
     /* This call scans the entire request, not just the headers */
-    if (hp->req.v_maj > 0) {
+    if (hp->messageProtocol().major > 0) {
         if ((req_sz = headersEnd(hp->buf, hp->bufsiz)) == 0) {
             debugs(33, 5, "Incomplete request, waiting for end of headers");
             return NULL;
@@ -2639,7 +2638,7 @@ bool ConnStateData::serveDelayedError(ClientSocketContext *context)
 #endif // USE_SSL
 
 static void
-clientProcessRequest(ConnStateData *conn, const HttpParserPointer &hp, ClientSocketContext *context, const HttpRequestMethod& method, Http::ProtocolVersion http_ver)
+clientProcessRequest(ConnStateData *conn, const HttpParserPointer &hp, ClientSocketContext *context, const HttpRequestMethod& method)
 {
     ClientHttpRequest *http = context->http;
     HttpRequest::Pointer request;
@@ -2648,6 +2647,7 @@ clientProcessRequest(ConnStateData *conn, const HttpParserPointer &hp, ClientSoc
     bool mustReplyToOptions = false;
     bool unsupportedTe = false;
     bool expectBody = false;
+    const AnyP::ProtocolVersion &http_ver = hp->messageProtocol();
 
     /* We have an initial client stream in place should it be needed */
     /* setup our private context */
@@ -2787,7 +2787,11 @@ clientProcessRequest(ConnStateData *conn, const HttpParserPointer &hp, ClientSoc
 #endif /* FOLLOW_X_FORWARDED_FOR */
     request->my_addr = conn->clientConnection->local;
     request->myportname = conn->port->name;
-    request->http_ver = http_ver;
+    // XXX: for non-HTTP messages instantiate a different HttpMsg child type
+    // for now Squid only supports HTTP requests
+    assert(request->http_ver.protocol == http_ver.protocol);
+    request->http_ver.major = http_ver.major;
+    request->http_ver.minor = http_ver.minor;
 
     // Link this HttpRequest to ConnStateData relatively early so the following complex handling can use it
     // TODO: this effectively obsoletes a lot of conn->FOO copying. That needs cleaning up later.
@@ -2993,8 +2997,7 @@ ConnStateData::clientParseRequests()
             parser_->bufsiz = in.notYetUsed;
 
         /* Process request */
-        Http::ProtocolVersion http_ver;
-        ClientSocketContext *context = parseHttpRequest(this, parser_, &method, &http_ver);
+        ClientSocketContext *context = parseHttpRequest(this, parser_, &method);
         PROF_stop(parseHttpRequest);
 
         /* partial or incomplete request */
@@ -3012,7 +3015,7 @@ ConnStateData::clientParseRequests()
                                              CommTimeoutCbPtrFun(clientLifetimeTimeout, context->http));
             commSetConnTimeout(clientConnection, Config.Timeout.lifetime, timeoutCall);
 
-            clientProcessRequest(this, parser_, context, method, http_ver);
+            clientProcessRequest(this, parser_, context, method);
 
             parsed_req = true; // XXX: do we really need to parse everything right NOW ?
 
index eda9366798b34e3f0293ce744ad3c12baa2608c7..1e15611d0bed6c09e580ce6e9ab3478d6f2eda23 100644 (file)
@@ -17,7 +17,7 @@ HttpParser::clear()
     req.m_start = req.m_end = -1;
     req.u_start = req.u_end = -1;
     req.v_start = req.v_end = -1;
-    req.v_maj = req.v_min = 0;
+    msgProtocol_ = AnyP::ProtocolVersion();
 }
 
 void
@@ -147,8 +147,7 @@ HttpParser::parseRequestFirstLine()
     // RFC 1945: SP and version following URI are optional, marking version 0.9
     // we identify this by the last whitespace being earlier than URI start
     if (last_whitespace < second_word && last_whitespace >= req.start) {
-        req.v_maj = 0;
-        req.v_min = 9;
+        msgProtocol_ = Http::ProtocolVersion(0,9);
         req.u_end = line_end;
         request_parse_status = Http::scOkay; // HTTP/0.9
         parseOffset_ = line_end;
@@ -178,8 +177,7 @@ HttpParser::parseRequestFirstLine()
 #if USE_HTTP_VIOLATIONS
         // being lax; old parser accepted strange versions
         // there is a LOT of cases which are ambiguous, therefore we cannot use relaxed_header_parser here.
-        req.v_maj = 0;
-        req.v_min = 9;
+        msgProtocol_ = Http::ProtocolVersion(0,9);
         req.u_end = line_end;
         request_parse_status = Http::scOkay; // treat as HTTP/0.9
         completedState_ = HTTP_PARSE_FIRST;
@@ -191,6 +189,7 @@ HttpParser::parseRequestFirstLine()
         return -1;
 #endif
     }
+    msgProtocol_.protocol = AnyP::PROTO_HTTP;
 
     int i = req.v_start + sizeof("HTTP/") -1;
 
@@ -209,7 +208,7 @@ HttpParser::parseRequestFirstLine()
         request_parse_status = Http::scHttpVersionNotSupported;
         return -1;
     }
-    req.v_maj = maj;
+    msgProtocol_.major = maj;
 
     /* next should be .; we -have- to have this as we have a whole line.. */
     if (buf[i] != '.') {
@@ -236,7 +235,7 @@ HttpParser::parseRequestFirstLine()
         request_parse_status = Http::scHttpVersionNotSupported;
         return -1;
     }
-    req.v_min = min;
+    msgProtocol_.minor = min;
 
     /*
      * Rightio - we have all the schtuff. Return true; we've got enough.
@@ -255,8 +254,7 @@ HttpParser::parseRequest()
     debugs(74, 5, "Parser: retval " << retcode << ": from " << req.start <<
            "->" << req.end << ": method " << req.m_start << "->" <<
            req.m_end << "; url " << req.u_start << "->" << req.u_end <<
-           "; version " << req.v_start << "->" << req.v_end << " (" << req.v_maj <<
-           "/" << req.v_min << ")");
+           "; proto-version " << req.v_start << "->" << req.v_end << " (" << msgProtocol_ << ")");
     PROF_stop(HttpParserParseReqLine);
 
     if (retcode != 0)
index 36ef69fb4b74930aa75627ec9e2b4820e9c7ae32..7f32f6295a695e2abef350402aef1dfae4ac3d9c 100644 (file)
@@ -2,6 +2,7 @@
 #define _SQUID_SRC_HTTPPARSER_H
 
 #include "base/RefCount.h"
+#include "http/ProtocolVersion.h"
 #include "http/StatusCode.h"
 
 // Parser states
@@ -96,9 +97,11 @@ public:
         int m_start, m_end; // method
         int u_start, u_end; // url
         int v_start, v_end; // version (full text)
-        int v_maj, v_min;   // version numerics
     } req;
 
+    /// the protocol label for this message
+    const AnyP::ProtocolVersion & messageProtocol() const {return msgProtocol_;}
+
     // Offsets for pieces of the MiME Header segment
     int hdr_start, hdr_end;
 
@@ -115,6 +118,9 @@ private:
 
     /// what stage the parser is currently up to
     uint8_t completedState_;
+
+    /// what protocol label has been found in the first line
+    AnyP::ProtocolVersion msgProtocol_;
 };
 
 #endif /*  _SQUID_SRC_HTTPPARSER_H */
index 490572a2cfc9da5cf956ab562428a530916da661..f019c36188e8601e2aec9a84afcdf3f341764cba 100644 (file)
@@ -57,8 +57,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start], (output.req.u_end-output.req.u_start+1)));
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
         input.reset();
     }
 
@@ -81,8 +80,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start], (output.req.u_end-output.req.u_start+1)));
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
         input.reset();
     }
 #endif
@@ -106,8 +104,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.0", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -130,8 +127,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -154,8 +150,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.2", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(2, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,2), output.msgProtocol_);
         input.reset();
     }
 
@@ -180,8 +175,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(15, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/10.12", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(10, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(12, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,10,12), output.msgProtocol_);
         input.reset();
     }
 
@@ -197,16 +191,14 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
         CPPUNIT_ASSERT_EQUAL(12, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/ FOO/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
 #else
         CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
         CPPUNIT_ASSERT_EQUAL(true, output.isDone());
         CPPUNIT_ASSERT_EQUAL(Http::scHttpVersionNotSupported, output.request_parse_status);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
 #endif
         CPPUNIT_ASSERT_EQUAL(0, output.req.start);
         CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
@@ -241,8 +233,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(10, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -266,8 +257,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -291,8 +281,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/11", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -316,8 +305,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(19, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/-999999.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -341,8 +329,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -366,8 +353,7 @@ testHttpParser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(19, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.-999999", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,0), output.msgProtocol_);
         input.reset();
     }
 }
@@ -402,8 +388,7 @@ testHttpParser::testParseRequestLineStrange()
         CPPUNIT_ASSERT_EQUAL(11, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(18, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -427,8 +412,7 @@ testHttpParser::testParseRequestLineStrange()
         CPPUNIT_ASSERT_EQUAL(11, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(18, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -452,8 +436,7 @@ testHttpParser::testParseRequestLineStrange()
         CPPUNIT_ASSERT_EQUAL(10, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(17, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 }
@@ -488,8 +471,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -513,8 +495,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -540,8 +521,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -563,8 +543,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 
@@ -589,8 +568,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/ HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 
@@ -610,8 +588,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
 
         input.append("GET ", 4);
@@ -628,8 +605,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
 
         input.append("GET / HT", 8);
@@ -646,8 +622,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
 
         input.append("GET / HTTP/1.1", 14);
@@ -664,8 +639,7 @@ testHttpParser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 }
@@ -700,8 +674,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(4, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(11, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -725,8 +698,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(10, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(17, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -750,8 +722,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(13, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(20, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -772,8 +743,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 
@@ -793,8 +763,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 
@@ -819,8 +788,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -842,8 +810,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_NONE,0,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -867,8 +834,7 @@ testHttpParser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 }
@@ -903,8 +869,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
         input.reset();
     }
 
@@ -929,8 +894,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
         input.reset();
     }
 
@@ -953,8 +917,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_NONE,0,0), output.msgProtocol_);
         input.reset();
     }
 
@@ -978,8 +941,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -1000,8 +962,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 
@@ -1025,8 +986,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
         input.reset();
     }
 
@@ -1049,8 +1009,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
         input.reset();
     }
 
@@ -1073,8 +1032,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
         input.reset();
     }
 
@@ -1095,8 +1053,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 
@@ -1120,8 +1077,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 
@@ -1143,8 +1099,7 @@ testHttpParser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
-        CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
+        CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(), output.msgProtocol_);
         input.reset();
     }
 }