]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Parser: shuffle request-line offsets into a sub-struct
authorAmos Jeffries <squid3@treenet.co.nz>
Sun, 29 May 2011 15:19:59 +0000 (09:19 -0600)
committerAmos Jeffries <squid3@treenet.co.nz>
Sun, 29 May 2011 15:19:59 +0000 (09:19 -0600)
Preparation for parsing other segments such as mime headers and reply
status-line we need the segments data offsets to be kept separate.

src/HttpParser.cc
src/HttpParser.h
src/client_side.cc
src/tests/testHttpParser.cc

index 050c8c966b47bdbcf43e452a07d1e56853c74341..4f78ec803141b9c8b4dde9aae514d3085d2ec2ff 100644 (file)
@@ -10,12 +10,12 @@ HttpParser::clear()
     request_parse_status = HTTP_STATUS_NONE;
     buf = NULL;
     bufsiz = 0;
-    req_start = req_end = -1;
+    req.start = req.end = -1;
     hdr_start = hdr_end = -1;
-    m_start = m_end = -1;
-    u_start = u_end = -1;
-    v_start = v_end = -1;
-    v_maj = v_min = 0;
+    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;
 }
 
 void
@@ -39,21 +39,21 @@ HttpParser::parseRequestFirstLine()
 
     // Single-pass parse: (provided we have the whole line anyways)
 
-    req_start = 0;
+    req.start = 0;
     if (Config.onoff.relaxed_header_parser) {
-        if (Config.onoff.relaxed_header_parser < 0 && buf[req_start] == ' ')
+        if (Config.onoff.relaxed_header_parser < 0 && buf[req.start] == ' ')
             debugs(74, DBG_IMPORTANT, "WARNING: Invalid HTTP Request: " <<
                    "Whitespace bytes received ahead of method. " <<
                    "Ignored due to relaxed_header_parser.");
         // Be tolerant of prefix spaces (other bytes are valid method values)
-        for (; req_start < bufsiz && buf[req_start] == ' '; req_start++);
+        for (; req.start < bufsiz && buf[req.start] == ' '; req.start++);
     }
-    req_end = -1;
+    req.end = -1;
     for (int i = 0; i < bufsiz; i++) {
         // track first and last whitespace (SP only)
         if (buf[i] == ' ') {
             last_whitespace = i;
-            if (first_whitespace < req_start)
+            if (first_whitespace < req.start)
                 first_whitespace = i;
         }
 
@@ -64,7 +64,7 @@ HttpParser::parseRequestFirstLine()
 
         // locate line terminator
         if (buf[i] == '\n') {
-            req_end = i;
+            req.end = i;
             line_end = i - 1;
             break;
         }
@@ -82,12 +82,12 @@ HttpParser::parseRequestFirstLine()
                     i++;
 
                 if (buf[i + 1] == '\n') {
-                    req_end = i + 1;
+                    req.end = i + 1;
                     break;
                 }
             } else {
                 if (buf[i + 1] == '\n') {
-                    req_end = i + 1;
+                    req.end = i + 1;
                     line_end = i - 1;
                     break;
                 }
@@ -99,9 +99,9 @@ HttpParser::parseRequestFirstLine()
             return -1;
         }
     }
-    if (req_end == -1) {
-        debugs(74, 5, "Parser: retval 0: from " << req_start <<
-               "->" << req_end << ": needs more data to complete first line.");
+    if (req.end == -1) {
+        debugs(74, 5, "Parser: retval 0: from " << req.start <<
+               "->" << req.end << ": needs more data to complete first line.");
         return 0;
     }
 
@@ -115,45 +115,45 @@ HttpParser::parseRequestFirstLine()
     // generating HTTP status for any aborts as we go.
 
     // First non-whitespace = beginning of method
-    if (req_start > line_end) {
+    if (req.start > line_end) {
         request_parse_status = HTTP_BAD_REQUEST;
         return -1;
     }
-    m_start = req_start;
+    req.m_start = req.start;
 
     // First whitespace = end of method
-    if (first_whitespace > line_end || first_whitespace < req_start) {
+    if (first_whitespace > line_end || first_whitespace < req.start) {
         request_parse_status = HTTP_BAD_REQUEST; // no method
         return -1;
     }
-    m_end = first_whitespace - 1;
-    if (m_end < m_start) {
+    req.m_end = first_whitespace - 1;
+    if (req.m_end < req.m_start) {
         request_parse_status = HTTP_BAD_REQUEST; // missing URI?
         return -1;
     }
 
     // First non-whitespace after first SP = beginning of URL+Version
-    if (second_word > line_end || second_word < req_start) {
+    if (second_word > line_end || second_word < req.start) {
         request_parse_status = HTTP_BAD_REQUEST; // missing URI
         return -1;
     }
-    u_start = second_word;
+    req.u_start = second_word;
 
     // 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) {
-        v_maj = 0;
-        v_min = 9;
-        u_end = line_end;
+    if (last_whitespace < second_word && last_whitespace >= req.start) {
+        req.v_maj = 0;
+        req.v_min = 9;
+        req.u_end = line_end;
         request_parse_status = HTTP_OK; // HTTP/0.9
         return 1;
     } else {
         // otherwise last whitespace is somewhere after end of URI.
-        u_end = last_whitespace;
+        req.u_end = last_whitespace;
         // crop any trailing whitespace in the area we think of as URI
-        for (; u_end >= u_start && xisspace(buf[u_end]); u_end--);
+        for (; req.u_end >= req.u_start && xisspace(buf[req.u_end]); req.u_end--);
     }
-    if (u_end < u_start) {
+    if (req.u_end < req.u_start) {
         request_parse_status = HTTP_BAD_REQUEST; // missing URI
         return -1;
     }
@@ -163,18 +163,18 @@ HttpParser::parseRequestFirstLine()
         request_parse_status = HTTP_BAD_REQUEST; // missing version
         return -1;
     }
-    v_start = last_whitespace + 1;
-    v_end = line_end;
+    req.v_start = last_whitespace + 1;
+    req.v_end = line_end;
 
     // We only accept HTTP protocol requests right now.
     // TODO: accept other protocols; RFC 2326 (RTSP protocol) etc
-    if ((v_end - v_start +1) < 5 || strncasecmp(&buf[v_start], "HTTP/", 5) != 0) {
+    if ((req.v_end - req.v_start +1) < 5 || strncasecmp(&buf[req.v_start], "HTTP/", 5) != 0) {
 #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.
-        v_maj = 0;
-        v_min = 9;
-        u_end = line_end;
+        req.v_maj = 0;
+        req.v_min = 9;
+        req.u_end = line_end;
         request_parse_status = HTTP_OK; // treat as HTTP/0.9
         return 1;
 #else
@@ -183,7 +183,7 @@ HttpParser::parseRequestFirstLine()
 #endif
     }
 
-    int i = v_start + sizeof("HTTP/") -1;
+    int i = req.v_start + sizeof("HTTP/") -1;
 
     /* next should be 1 or more digits */
     if (!isdigit(buf[i])) {
@@ -200,7 +200,7 @@ HttpParser::parseRequestFirstLine()
         request_parse_status = HTTP_HTTP_VERSION_NOT_SUPPORTED;
         return -1;
     }
-    v_maj = maj;
+    req.v_maj = maj;
 
     /* next should be .; we -have- to have this as we have a whole line.. */
     if (buf[i] != '.') {
@@ -227,7 +227,7 @@ HttpParser::parseRequestFirstLine()
         request_parse_status = HTTP_HTTP_VERSION_NOT_SUPPORTED;
         return -1;
     }
-    v_min = min;
+    req.v_min = min;
 
     /*
      * Rightio - we have all the schtuff. Return true; we've got enough.
@@ -241,11 +241,11 @@ HttpParserParseReqLine(HttpParser *hmsg)
 {
     PROF_start(HttpParserParseReqLine);
     int retcode = hmsg->parseRequestFirstLine();
-    debugs(74, 5, "Parser: retval " << retcode << ": from " << hmsg->req_start <<
-           "->" << hmsg->req_end << ": method " << hmsg->m_start << "->" <<
-           hmsg->m_end << "; url " << hmsg->u_start << "->" << hmsg->u_end <<
-           "; version " << hmsg->v_start << "->" << hmsg->v_end << " (" << hmsg->v_maj <<
-           "/" << hmsg->v_min << ")");
+    debugs(74, 5, "Parser: retval " << retcode << ": from " << hmsg->req.start <<
+           "->" << hmsg->req.end << ": method " << hmsg->req.m_start << "->" <<
+           hmsg->req.m_end << "; url " << hmsg->req.u_start << "->" << hmsg->req.u_end <<
+           "; version " << hmsg->req.v_start << "->" << hmsg->req.v_end << " (" << hmsg->req.v_maj <<
+           "/" << hmsg->req.v_min << ")");
     PROF_stop(HttpParserParseReqLine);
     return retcode;
 }
@@ -256,9 +256,9 @@ int
 HttpParserReqSz(HttpParser *hp)
 {
     assert(hp->state == HTTP_PARSE_NEW);
-    assert(hp->req_start != -1);
-    assert(hp->req_end != -1);
-    return hp->req_end - hp->req_start + 1;
+    assert(hp->req.start != -1);
+    assert(hp->req.end != -1);
+    return hp->req.end - hp->req.start + 1;
 }
 
 /*
@@ -287,7 +287,7 @@ HttpParserHdrBuf(HttpParser *hp)
 int
 HttpParserRequestLen(HttpParser *hp)
 {
-    return hp->hdr_end - hp->req_start + 1;
+    return hp->hdr_end - hp->req.start + 1;
 }
 #endif
 
index 601f7ac646a72cbae0b27dde133656815a304bab..a29dca90cc176fa12a01216ee365596e9cbf7bf3 100644 (file)
@@ -56,12 +56,20 @@ public:
     uint8_t state;
     const char *buf;
     int bufsiz;
-    int req_start, req_end;
+
+    /// Offsets for pieces of the (HTTP request) Request-Line as per RFC 2616
+    struct request_offsets {
+        int start, end;
+        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;
+
+    // Offsets for pieces of the MiME Header segment
     int hdr_start, hdr_end;
-    int m_start, m_end;
-    int u_start, u_end;
-    int v_start, v_end;
-    int v_maj, v_min;
+
+    // TODO: Offsets for pieces of the (HTTP reply) Status-Line as per RFC 2616
 
     /** HTTP status code to be used on the invalid-request error page
      * HTTP_STATUS_NONE indicates incomplete parse, HTTP_OK indicates no error.
@@ -80,10 +88,10 @@ extern int HttpParserHdrSz(HttpParser *);
 extern const char * HttpParserHdrBuf(HttpParser *);
 extern int HttpParserRequestLen(HttpParser *hp);
 #else
-#define HttpParserReqSz(hp)     ( (hp)->req_end - (hp)->req_start + 1 )
+#define HttpParserReqSz(hp)     ( (hp)->req.end - (hp)->req.start + 1 )
 #define HttpParserHdrSz(hp)     ( (hp)->hdr_end - (hp)->hdr_start + 1 )
 #define HttpParserHdrBuf(hp)    ( (hp)->buf + (hp)->hdr_start )
-#define HttpParserRequestLen(hp)        ( (hp)->hdr_end - (hp)->req_start + 1 )
+#define HttpParserRequestLen(hp)        ( (hp)->hdr_end - (hp)->req.start + 1 )
 #endif
 
 
index 622237fffac1357ca5fc2989ddc6e5157dce1813..6136fa8a205924bde145c90e4faf0ab80d597d66 100644 (file)
@@ -2126,10 +2126,10 @@ parseHttpRequest(ConnStateData *conn, HttpParser *hp, HttpRequestMethod * method
     }
 
     /* Request line is valid here .. */
-    *http_ver = HttpVersion(hp->v_maj, hp->v_min);
+    *http_ver = HttpVersion(hp->req.v_maj, hp->req.v_min);
 
     /* This call scans the entire request, not just the headers */
-    if (hp->v_maj > 0) {
+    if (hp->req.v_maj > 0) {
         if ((req_sz = headersEnd(hp->buf, hp->bufsiz)) == 0) {
             debugs(33, 5, "Incomplete request, waiting for end of headers");
             return NULL;
@@ -2149,7 +2149,7 @@ parseHttpRequest(ConnStateData *conn, HttpParser *hp, HttpRequestMethod * method
 
     hp->hdr_end = req_sz - 1;
 
-    hp->hdr_start = hp->req_end + 1;
+    hp->hdr_start = hp->req.end + 1;
 
     /* Enforce max_request_size */
     if (req_sz >= Config.maxRequestHeaderSize) {
@@ -2159,7 +2159,7 @@ parseHttpRequest(ConnStateData *conn, HttpParser *hp, HttpRequestMethod * method
     }
 
     /* Set method_p */
-    *method_p = HttpRequestMethod(&hp->buf[hp->m_start], &hp->buf[hp->m_end]+1);
+    *method_p = HttpRequestMethod(&hp->buf[hp->req.m_start], &hp->buf[hp->req.m_end]+1);
 
     /* deny CONNECT via accelerated ports */
     if (*method_p == METHOD_CONNECT && conn && conn->port && conn->port->accel) {
@@ -2182,7 +2182,7 @@ parseHttpRequest(ConnStateData *conn, HttpParser *hp, HttpRequestMethod * method
      * TODO: Use httpRequestParse here.
      */
     /* XXX this code should be modified to take a const char * later! */
-    req_hdr = (char *) hp->buf + hp->req_end + 1;
+    req_hdr = (char *) hp->buf + hp->req.end + 1;
 
     debugs(33, 3, "parseHttpRequest: req_hdr = {" << req_hdr << "}");
 
@@ -2215,11 +2215,11 @@ parseHttpRequest(ConnStateData *conn, HttpParser *hp, HttpRequestMethod * method
      * XXX this should eventually not use a malloc'ed buffer; the transformation code
      * below needs to be modified to not expect a mutable nul-terminated string.
      */
-    char *url = (char *)xmalloc(hp->u_end - hp->u_start + 16);
+    char *url = (char *)xmalloc(hp->req.u_end - hp->req.u_start + 16);
 
-    memcpy(url, hp->buf + hp->u_start, hp->u_end - hp->u_start + 1);
+    memcpy(url, hp->buf + hp->req.u_start, hp->req.u_end - hp->req.u_start + 1);
 
-    url[hp->u_end - hp->u_start + 1] = '\0';
+    url[hp->req.u_end - hp->req.u_start + 1] = '\0';
 
 #if THIS_VIOLATES_HTTP_SPECS_ON_URL_TRANSFORMATION
 
index f413f8d7e40a208d8dea8c13e2b6cd508c753026..5081dc6382e42ad90a07d4a6d963fa1066ed4af2 100644 (file)
@@ -40,19 +40,19 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET /\r\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start], (output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start], (output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(9, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET /\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start], (output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start], (output.req.u_end-output.req.u_start+1)) == 0);
+    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);
     input.reset();
 
     // RFC 1945 and 2616 : HTTP/1.0 full-request
@@ -60,20 +60,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.0\r\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(13, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.0\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
     input.reset();
 
 
@@ -82,20 +82,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\r\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(13, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // RFC 2616 : future version full-request
@@ -104,20 +104,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/10.12\r\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(15, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/10.12", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(10, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(12, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/10.12\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(15, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/10.12", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(10, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(12, output.req.v_min);
     input.reset();
 
     // space padded URL
@@ -126,20 +126,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET  /     HTTP/1.1\r\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(11, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(18, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET  /     HTTP/1.1\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(11, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(18, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // space padded version
@@ -150,19 +150,19 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1 \n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(13, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/ HTTP/1.1", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1 \n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(13, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/ HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    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);
     input.reset();
 
     // whitespace inside URI. (nasty but happens)
@@ -171,20 +171,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET /fo o/ HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(9, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/fo o/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(11, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(18, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET /fo o/ HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(9, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/fo o/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(11, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(18, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // additional data in buffer
@@ -193,20 +193,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-5, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET /     HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end); // strangeness generated by following RFC
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(10, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(17, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-5, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET /     HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end); // strangeness generated by following RFC
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(10, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(17, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // alternative EOL sequence: NL-only
@@ -215,20 +215,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(13, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // alternative EOL sequence: double-NL-only
@@ -237,20 +237,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-2, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(13, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-2, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // RELAXED alternative EOL sequence: multi-CR-NL
@@ -261,20 +261,20 @@ testHttpParser::testParseRequestLine()
     // Being tolerant we can ignore and elide these apparently benign CR
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\r\r\r\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(13, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\r\r\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // STRICT alternative EOL sequence: multi-CR-NL
@@ -285,16 +285,16 @@ testHttpParser::testParseRequestLine()
     Config.onoff.relaxed_header_parser = 0;
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.req_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // RFC 2616 : . method
@@ -303,20 +303,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp(". / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_end);
-    CPPUNIT_ASSERT(memcmp(".", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(2, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(11, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp(". / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp(".", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(11, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // OPTIONS with * URL
@@ -325,20 +325,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("OPTIONS * HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(6, output.m_end);
-    CPPUNIT_ASSERT(memcmp("OPTIONS", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(8, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(8, output.u_end);
-    CPPUNIT_ASSERT(memcmp("*", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(10, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(17, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("OPTIONS * HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("OPTIONS", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(8, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(8, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("*", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(10, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(17, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // unknown method
@@ -347,20 +347,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("HELLOWORLD / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(9, output.m_end);
-    CPPUNIT_ASSERT(memcmp("HELLOWORLD", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(11, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(11, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(13, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(20, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("HELLOWORLD / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(9, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("HELLOWORLD", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(11, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(11, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(13, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(20, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // This stage of the parser does not yet accept non-HTTP protocol names.
@@ -371,28 +371,28 @@ testHttpParser::testParseRequestLine()
 #if USE_HTTP_VIOLATIONS
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(12, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/ FOO/1.0", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(9, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(12, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/ FOO/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
 #else
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
 #endif
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / FOO/1.0\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(12, output.v_end);
-    CPPUNIT_ASSERT(memcmp("FOO/1.0", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / FOO/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("FOO/1.0", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
     input.reset();
 
     // RELAXED space padded method (in strict mode SP is reserved so invalid as a method byte)
@@ -402,20 +402,20 @@ testHttpParser::testParseRequestLine()
     Config.onoff.relaxed_header_parser = 1;
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(1, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(3, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(7, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(14, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // STRICT space padded method (in strict mode SP is reserved so invalid as a method byte)
@@ -425,17 +425,17 @@ testHttpParser::testParseRequestLine()
     Config.onoff.relaxed_header_parser = 0;
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp(" GET / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp(" GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // tab padded method (NP: tab is not SP so treated as any other binary)
@@ -444,20 +444,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("\tGET / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(3, output.m_end);
-    CPPUNIT_ASSERT(memcmp("\tGET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(7, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(14, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("\tGET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("\tGET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     input.append("GET", 3);
@@ -465,16 +465,16 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.req_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     input.append("GET ", 4);
@@ -482,16 +482,16 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.req_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     input.append("GET / HT", 8);
@@ -499,16 +499,16 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.req_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     input.append("GET / HTTP/1.1", 14);
@@ -516,16 +516,16 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.req_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // method-only
@@ -534,17 +534,17 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("A\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("A\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // no method (but in a form which is ambiguous with HTTP/0.9 simple-request)
@@ -553,19 +553,19 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("/ HTTP/1.0\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(2, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(9, output.u_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(9, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("/ HTTP/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(9, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    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);
     input.reset();
 
     // RELAXED no method (an invalid format)
@@ -576,19 +576,19 @@ testHttpParser::testParseRequestLine()
     Config.onoff.relaxed_header_parser = 1;
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(1, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("/ HTTP/1.0\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(1, output.m_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(3, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(10, output.u_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(9, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("/ HTTP/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(3, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(10, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    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);
     input.reset();
 
     // STRICT no method (an invalid format)
@@ -599,39 +599,39 @@ testHttpParser::testParseRequestLine()
     Config.onoff.relaxed_header_parser = 0;
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp(" / HTTP/1.0\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp(" / HTTP/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // binary code in method (strange but ...)
     input.append("GET\x0B / HTTP/1.1\n", 16);
-    //printf("TEST: %d-%d/%d '%.*s'\n", output.req_start, output.req_end, input.contentSize(), 16, input.content());
+    //printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET\x0B / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(3, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET\x0B", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(7, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(14, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET\x0B / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET\x0B", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // CR in method
@@ -641,38 +641,38 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.req_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // binary code NUL! in method (strange but ...)
     input.append("GET\0 / HTTP/1.1\n", 16);
-    //printf("TEST: %d-%d/%d '%.*s'\n", output.req_start, output.req_end, input.contentSize(), 16, input.content());
+    //printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET\0 / HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(3, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET\0", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(7, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(14, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET\0 / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET\0", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
     input.reset();
 
     // no URL (grammer otherwise correct)
@@ -681,19 +681,19 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET  HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(5, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(12, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(9, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET  HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(12, output.req.u_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
     input.reset();
 
     // no URL (grammer invalid, ambiguous with RFC 1945 HTTP/0.9 simple-request)
@@ -702,19 +702,19 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET HTTP/1.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(11, output.u_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(9, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(11, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    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);
     input.reset();
 
     // no version
@@ -723,20 +723,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(10, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(10, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
     input.reset();
 
     // no major version
@@ -745,20 +745,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(12, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
     input.reset();
 
     // no version dot
@@ -767,20 +767,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/11\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(12, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/11", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/11\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/11", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
     input.reset();
 
     // negative major version (bug 3062)
@@ -789,20 +789,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/-999999.1\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(19, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/-999999.1", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/-999999.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(19, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/-999999.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
     input.reset();
 
     // no minor version
@@ -811,20 +811,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(12, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
     input.reset();
 
     // negative major version (bug 3062 corollary)
@@ -833,20 +833,20 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.-999999\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(2, output.m_end);
-    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(4, output.u_end);
-    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.u_start],(output.u_end-output.u_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(6, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(19, output.v_end);
-    CPPUNIT_ASSERT(memcmp("HTTP/1.-999999", &output.buf[output.v_start],(output.v_end-output.v_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(1, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("GET / HTTP/1.-999999\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
+    CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
+    CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
+    CPPUNIT_ASSERT_EQUAL(19, output.req.v_end);
+    CPPUNIT_ASSERT(memcmp("HTTP/1.-999999", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
     input.reset();
 
     // binary line
@@ -855,17 +855,17 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("\xB\xC\xE\xF\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("\xB\xC\xE\xF\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // mixed whitespace line
@@ -876,18 +876,18 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req_end);
-    CPPUNIT_ASSERT(memcmp("\t \t \t\n", &output.buf[output.req_start],(output.req_end-output.req_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(0, output.m_end);
-    CPPUNIT_ASSERT(memcmp("\t", &output.buf[output.m_start],(output.m_end-output.m_start+1)) == 0);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
+    CPPUNIT_ASSERT(memcmp("\t \t \t\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
+    CPPUNIT_ASSERT(memcmp("\t", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 
     // mixed whitespace line with CR middle
@@ -898,15 +898,15 @@ testHttpParser::testParseRequestLine()
     output.reset(input.content(), input.contentSize());
     CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
     CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
-    CPPUNIT_ASSERT_EQUAL(0, output.req_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.req_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.m_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.u_end);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_start);
-    CPPUNIT_ASSERT_EQUAL(-1, output.v_end);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_maj);
-    CPPUNIT_ASSERT_EQUAL(0, output.v_min);
+    CPPUNIT_ASSERT_EQUAL(0, output.req.start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
+    CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
+    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);
     input.reset();
 }