]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Update Http1Parser API after audit
authorAmos Jeffries <squid3@treenet.co.nz>
Thu, 2 Jan 2014 17:59:02 +0000 (09:59 -0800)
committerAmos Jeffries <squid3@treenet.co.nz>
Thu, 2 Jan 2014 17:59:02 +0000 (09:59 -0800)
src/client_side.cc
src/http/Http1Parser.cc
src/http/Http1Parser.h
src/tests/testHttp1Parser.cc

index dea06e9581ff94ed6009b474e9bf3bcfa5c46371..9a6d8c0f3c4844bc04a74f0c18d6189452ea56f2 100644 (file)
@@ -206,7 +206,7 @@ static IOACB httpsAccept;
 #endif
 static CTCB clientLifetimeTimeout;
 static ClientSocketContext *parseHttpRequestAbort(ConnStateData * conn, const char *uri);
-static ClientSocketContext *parseHttpRequest(ConnStateData *, const Http::Http1ParserPointer &);
+static ClientSocketContext *parseHttpRequest(ConnStateData *, Http::Http1Parser &);
 #if USE_IDENT
 static IDCB clientIdentDone;
 #endif
@@ -2080,22 +2080,21 @@ setLogUri(ClientHttpRequest * http, char const *uri, bool cleanUrl)
 }
 
 static void
-prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, const Http::Http1ParserPointer &hp)
+prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, Http::Http1Parser &hp)
 {
     int vhost = conn->port->vhost;
     int vport = conn->port->vport;
-    char *host;
-    char ipbuf[MAX_IPSTRLEN];
+    static char ipbuf[MAX_IPSTRLEN];
 
     http->flags.accel = true;
 
     /* BUG: Squid cannot deal with '*' URLs (RFC2616 5.1.2) */
 
     static const SBuf cache_object("cache_object://");
-    if (hp->requestUri().startsWith(cache_object))
+    if (hp.requestUri().startsWith(cache_object))
         return; /* already in good shape */
 
-    const char *url = hp->requestUri().c_str();
+    const char *url = SBuf(hp.requestUri()).c_str(); // XXX: performance regression. convert to SBuf parse
     if (*url != '/') {
         if (conn->port->vhost)
             return; /* already in good shape */
@@ -2106,7 +2105,7 @@ prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, const Http:
 #if SHOULD_REJECT_UNKNOWN_URLS
 
         if (!url) {
-            hp->request_parse_status = Http::scBadRequest;
+            hp.request_parse_status = Http::scBadRequest;
             return parseHttpRequestAbort(conn, "error:invalid-request");
         }
 #endif
@@ -2123,7 +2122,8 @@ prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, const Http:
 
     const bool switchedToHttps = conn->switchedToHttps();
     const bool tryHostHeader = vhost || switchedToHttps;
-    if (tryHostHeader && (host = hp->getHeaderField("Host")) != NULL) {
+    char *host = NULL;
+    if (tryHostHeader && (host = hp.getHeaderField("Host"))) {
         debugs(33, 5, "ACCEL VHOST REWRITE: vhost=" << host << " + vport=" << vport);
         char thost[256];
         if (vport > 0) {
@@ -2138,7 +2138,7 @@ prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, const Http:
                 host = thost;
             }
         } // else nothing to alter port-wise.
-        int url_sz = strlen(url) + 32 + Config.appendDomainLen +
+        const int url_sz = hp.requestUri().length() + 32 + Config.appendDomainLen +
                      strlen(host);
         http->uri = (char *)xcalloc(url_sz, 1);
         const char *protocol = switchedToHttps ?
@@ -2147,7 +2147,7 @@ prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, const Http:
         debugs(33, 5, "ACCEL VHOST REWRITE: '" << http->uri << "'");
     } else if (conn->port->defaultsite /* && !vhost */) {
         debugs(33, 5, "ACCEL DEFAULTSITE REWRITE: defaultsite=" << conn->port->defaultsite << " + vport=" << vport);
-        int url_sz = hp->requestUri().length() + 32 + Config.appendDomainLen +
+        const int url_sz = hp.requestUri().length() + 32 + Config.appendDomainLen +
                      strlen(conn->port->defaultsite);
         http->uri = (char *)xcalloc(url_sz, 1);
         char vportStr[32];
@@ -2161,7 +2161,7 @@ prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, const Http:
     } else if (vport > 0 /* && (!vhost || no Host:) */) {
         debugs(33, 5, "ACCEL VPORT REWRITE: http_port IP + vport=" << vport);
         /* Put the local socket IP address as the hostname, with whatever vport we found  */
-        int url_sz = hp->requestUri().length() + 32 + Config.appendDomainLen;
+        const int url_sz = hp.requestUri().length() + 32 + Config.appendDomainLen;
         http->uri = (char *)xcalloc(url_sz, 1);
         http->getConn()->clientConnection->local.toHostStr(ipbuf,MAX_IPSTRLEN);
         snprintf(http->uri, url_sz, "%s://%s:%d%s",
@@ -2172,30 +2172,30 @@ prepareAcceleratedURL(ConnStateData * conn, ClientHttpRequest *http, const Http:
 }
 
 static void
-prepareTransparentURL(ConnStateData * conn, ClientHttpRequest *http, const Http::Http1ParserPointer &hp)
+prepareTransparentURL(ConnStateData * conn, ClientHttpRequest *http, Http::Http1Parser &hp)
 {
-    char *host;
-    char ipbuf[MAX_IPSTRLEN];
+    static char ipbuf[MAX_IPSTRLEN];
 
-    if (hp->requestUri()[0] != '/')
+    // TODO Must() on URI length>0 when the parser supports throw. For now avoid assert().
+    if (!hp.requestUri().length() && hp.requestUri()[0] != '/')
         return; /* already in good shape */
 
     /* BUG: Squid cannot deal with '*' URLs (RFC2616 5.1.2) */
 
-    if ((host = hp->getHeaderField("Host")) != NULL) {
-        int url_sz = hp->requestUri().length() + 32 + Config.appendDomainLen +
+    if (const char *host = hp.getHeaderField("Host")) {
+        const int url_sz = hp.requestUri().length() + 32 + Config.appendDomainLen +
                      strlen(host);
         http->uri = (char *)xcalloc(url_sz, 1);
-        snprintf(http->uri, url_sz, "%s://%s%s", URLScheme(conn->port->transport.protocol).const_str(), host, hp->requestUri().c_str());
+        snprintf(http->uri, url_sz, "%s://%s%s", URLScheme(conn->port->transport.protocol).const_str(), host, SBuf(hp.requestUri()).c_str());
         debugs(33, 5, "TRANSPARENT HOST REWRITE: '" << http->uri <<"'");
     } else {
         /* Put the local socket IP address as the hostname.  */
-        int url_sz = hp->requestUri().length() + 32 + Config.appendDomainLen;
+        const int url_sz = hp.requestUri().length() + 32 + Config.appendDomainLen;
         http->uri = (char *)xcalloc(url_sz, 1);
         http->getConn()->clientConnection->local.toHostStr(ipbuf,MAX_IPSTRLEN);
         snprintf(http->uri, url_sz, "%s://%s:%d%s",
                  URLScheme(http->getConn()->port->transport.protocol).const_str(),
-                 ipbuf, http->getConn()->clientConnection->local.port(), hp->requestUri().c_str());
+                 ipbuf, http->getConn()->clientConnection->local.port(), SBuf(hp.requestUri()).c_str());
         debugs(33, 5, "TRANSPARENT REWRITE: '" << http->uri << "'");
     }
 }
@@ -2214,29 +2214,24 @@ prepareTransparentURL(ConnStateData * conn, ClientHttpRequest *http, const Http:
  *          a ClientSocketContext structure on success or failure.
  */
 static ClientSocketContext *
-parseHttpRequest(ConnStateData *csd, const Http::Http1ParserPointer &hp)
+parseHttpRequest(ConnStateData *csd, Http::Http1Parser &hp)
 {
-    size_t req_sz;
-    ClientHttpRequest *http;
-    ClientSocketContext *result;
-    StoreIOBuffer tempBuffer;
-
     /* NP: don't be tempted to move this down or remove again.
      * It's the only DDoS protection old-String has against long URL */
-    if ( hp->bufsiz <= 0) {
+    if ( hp.bufsiz <= 0) {
         debugs(33, 5, "Incomplete request, waiting for end of request line");
         return NULL;
-    } else if ( (size_t)hp->bufsiz >= Config.maxRequestHeaderSize && headersEnd(hp->buf, Config.maxRequestHeaderSize) == 0) {
+    } else if ( (size_t)hp.bufsiz >= Config.maxRequestHeaderSize && headersEnd(hp.buf, Config.maxRequestHeaderSize) == 0) {
         debugs(33, 5, "parseHttpRequest: Too large request");
-        hp->request_parse_status = Http::scHeaderTooLarge;
+        hp.request_parse_status = Http::scHeaderTooLarge;
         return parseHttpRequestAbort(csd, "error:request-too-large");
     }
 
     /* Attempt to parse the first line; this will define where the method, url, version and header begin */
     {
-        bool parsedOk = hp->parseRequest();
+        const bool parsedOk = hp.parseRequest();
 
-        if (!hp->isDone()) {
+        if (!hp.isDone()) {
             debugs(33, 5, "Incomplete request, waiting for end of request line");
             return NULL;
         }
@@ -2245,9 +2240,9 @@ parseHttpRequest(ConnStateData *csd, const Http::Http1ParserPointer &hp)
             return parseHttpRequestAbort(csd, "error:invalid-request");
     }
 
-    /* We know the whole request is in hp->buf now */
-    req_sz = hp->messageHeaderSize();
-    assert(req_sz <= (size_t) hp->bufsiz);
+    /* We know the whole request is in hp.buf now */
+    size_t req_sz = hp.messageHeaderSize();
+    assert(req_sz <= (size_t) hp.bufsiz);
 
     /* Will the following be true with HTTP/0.9 requests? probably not .. */
     /* So the rest of the code will need to deal with '0'-byte headers (ie, none, so don't try parsing em) */
@@ -2256,23 +2251,23 @@ parseHttpRequest(ConnStateData *csd, const Http::Http1ParserPointer &hp)
     /* Enforce max_request_size */
     if (req_sz >= Config.maxRequestHeaderSize) {
         debugs(33, 5, "parseHttpRequest: Too large request");
-        hp->request_parse_status = Http::scHeaderTooLarge;
+        hp.request_parse_status = Http::scHeaderTooLarge;
         return parseHttpRequestAbort(csd, "error:request-too-large");
     }
 
     /* deny CONNECT via accelerated ports */
-    if (*(hp->method()) == Http::METHOD_CONNECT && csd->port && csd->port->flags.accelSurrogate) {
+    if (hp.method() == Http::METHOD_CONNECT && csd->port && csd->port->flags.accelSurrogate) {
         debugs(33, DBG_IMPORTANT, "WARNING: CONNECT method received on " << csd->port->transport.protocol << " Accelerator port " << csd->port->s.port());
         /* XXX need a way to say "this many character length string" */
-        debugs(33, DBG_IMPORTANT, "WARNING: for request: " << hp->buf);
-        hp->request_parse_status = Http::scMethodNotAllowed;
+        debugs(33, DBG_IMPORTANT, "WARNING: for request: " << hp.buf);
+        hp.request_parse_status = Http::scMethodNotAllowed;
         return parseHttpRequestAbort(csd, "error:method-not-allowed");
     }
 
-    if (*(hp->method()) == Http::METHOD_NONE) {
+    if (hp.method() == Http::METHOD_NONE) {
         /* XXX need a way to say "this many character length string" */
-        debugs(33, DBG_IMPORTANT, "clientParseRequestMethod: Unsupported method in request '" << hp->buf << "'");
-        hp->request_parse_status = Http::scMethodNotAllowed;
+        debugs(33, DBG_IMPORTANT, "clientParseRequestMethod: Unsupported method in request '" << hp.buf << "'");
+        hp.request_parse_status = Http::scMethodNotAllowed;
         return parseHttpRequestAbort(csd, "error:unsupported-request-method");
     }
 
@@ -2280,16 +2275,18 @@ parseHttpRequest(ConnStateData *csd, const Http::Http1ParserPointer &hp)
      * Process headers after request line
      * TODO: Use httpRequestParse here.
      */
-    debugs(33, 3, Raw("req_hdr", hp->rawHeaderBuf(), hp->headerBlockSize()));
-    debugs(33, 3, "prefix_sz = " << hp->messageHeaderSize() <<
-           ", request-line-size=" << hp->firstLineSize() <<
-           ", mime-header-size=" << hp->headerBlockSize());
+    debugs(33, 3, Raw("req_hdr", hp.rawHeaderBuf(), hp.headerBlockSize()));
+    debugs(33, 3, "prefix_sz = " << hp.messageHeaderSize() <<
+           ", request-line-size=" << hp.firstLineSize() <<
+           ", mime-header-size=" << hp.headerBlockSize());
 
     /* Ok, all headers are received */
-    http = new ClientHttpRequest(csd);
+    ClientHttpRequest *http = new ClientHttpRequest(csd);
+
+    http->req_sz = hp.messageHeaderSize();
+    ClientSocketContext *result = ClientSocketContextNew(csd->clientConnection, http);
 
-    http->req_sz = hp->messageHeaderSize();
-    result = ClientSocketContextNew(csd->clientConnection, http);
+    StoreIOBuffer tempBuffer;
     tempBuffer.data = result->reqbuf;
     tempBuffer.length = HTTP_REQBUF_SZ;
 
@@ -2299,10 +2296,10 @@ parseHttpRequest(ConnStateData *csd, const Http::Http1ParserPointer &hp)
                      clientReplyStatus, newServer, clientSocketRecipient,
                      clientSocketDetach, newClient, tempBuffer);
 
-    debugs(33, 5, "parseHttpRequest: Request Header is\n" << hp->rawHeaderBuf());
+    debugs(33, 5, "parseHttpRequest: Request Header is\n" << hp.rawHeaderBuf());
 
     /* set url */
-    const char *url = hp->requestUri().c_str();
+    const char *url = SBuf(hp.requestUri()).c_str();
 
     debugs(33,5, HERE << "repare absolute URL from " <<
            (csd->transparent()?"intercept":(csd->port->flags.accelSurrogate ? "accel":"")));
@@ -2337,7 +2334,7 @@ parseHttpRequest(ConnStateData *csd, const Http::Http1ParserPointer &hp)
     if (!http->uri) {
         /* No special rewrites have been applied above, use the
          * requested url. may be rewritten later, so make extra room */
-        int url_sz = strlen(url) + Config.appendDomainLen + 5;
+        int url_sz = hp.requestUri().length() + Config.appendDomainLen + 5;
         http->uri = (char *)xcalloc(url_sz, 1);
         strcpy(http->uri, url);
     }
@@ -2347,8 +2344,8 @@ parseHttpRequest(ConnStateData *csd, const Http::Http1ParserPointer &hp)
     // XXX: crop this dump at the end of headers. No need for extras
     debugs(11, 2, "HTTP Client " << csd->clientConnection);
     debugs(11, 2, "HTTP Client REQUEST:\n---------\n" <<
-           hp->method() << " " << hp->requestUri() << " " << hp->messageProtocol() << "\n" <<
-           hp->rawHeaderBuf() <<
+           hp.method() << " " << hp.requestUri() << " " << hp.messageProtocol() << "\n" <<
+           hp.rawHeaderBuf() <<
            "\n----------");
 
     result->flags.parsed_ok = 1;
@@ -2594,7 +2591,7 @@ bool ConnStateData::serveDelayedError(ClientSocketContext *context)
 #endif // USE_SSL
 
 static void
-clientProcessRequest(ConnStateData *conn, const Http::Http1ParserPointer &hp, ClientSocketContext *context)
+clientProcessRequest(ConnStateData *conn, Http::Http1Parser &hp, ClientSocketContext *context)
 {
     ClientHttpRequest *http = context->http;
     HttpRequest::Pointer request;
@@ -2603,8 +2600,8 @@ clientProcessRequest(ConnStateData *conn, const Http::Http1ParserPointer &hp, Cl
     bool mustReplyToOptions = false;
     bool unsupportedTe = false;
     bool expectBody = false;
-    const AnyP::ProtocolVersion &http_ver = hp->messageProtocol();
-    const HttpRequestMethodPointer method = hp->method();
+    const AnyP::ProtocolVersion &http_ver = hp.messageProtocol();
+    const HttpRequestMethod &method = hp.method();
 
     /* We have an initial client stream in place should it be needed */
     /* setup our private context */
@@ -2618,16 +2615,16 @@ clientProcessRequest(ConnStateData *conn, const Http::Http1ParserPointer &hp, Cl
         setLogUri(http, http->uri,  true);
         clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
         assert (repContext);
-        switch (hp->request_parse_status) {
+        switch (hp.request_parse_status) {
         case Http::scHeaderTooLarge:
-            repContext->setReplyToError(ERR_TOO_BIG, Http::scBadRequest, *method, http->uri, conn->clientConnection->remote, NULL, conn->in.buf, NULL);
+            repContext->setReplyToError(ERR_TOO_BIG, Http::scBadRequest, method, http->uri, conn->clientConnection->remote, NULL, conn->in.buf, NULL);
             break;
         case Http::scMethodNotAllowed:
-            repContext->setReplyToError(ERR_UNSUP_REQ, Http::scMethodNotAllowed, *method, http->uri,
+            repContext->setReplyToError(ERR_UNSUP_REQ, Http::scMethodNotAllowed, method, http->uri,
                                         conn->clientConnection->remote, NULL, conn->in.buf, NULL);
             break;
         default:
-            repContext->setReplyToError(ERR_INVALID_REQ, hp->request_parse_status, *method, http->uri,
+            repContext->setReplyToError(ERR_INVALID_REQ, hp.request_parse_status, method, http->uri,
                                         conn->clientConnection->remote, NULL, conn->in.buf, NULL);
         }
         assert(context->http->out.offset == 0);
@@ -2635,7 +2632,7 @@ clientProcessRequest(ConnStateData *conn, const Http::Http1ParserPointer &hp, Cl
         goto finish;
     }
 
-    if ((request = HttpRequest::CreateFromUrlAndMethod(http->uri, *method)) == NULL) {
+    if ((request = HttpRequest::CreateFromUrlAndMethod(http->uri, method)) == NULL) {
         clientStreamNode *node = context->getClientReplyContext();
         debugs(33, 5, "Invalid URL: " << http->uri);
         conn->quitAfterError(request.getRaw());
@@ -2643,7 +2640,7 @@ clientProcessRequest(ConnStateData *conn, const Http::Http1ParserPointer &hp, Cl
         setLogUri(http, http->uri,  true);
         clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
         assert (repContext);
-        repContext->setReplyToError(ERR_INVALID_URL, Http::scBadRequest, *method, http->uri, conn->clientConnection->remote, NULL, NULL, NULL);
+        repContext->setReplyToError(ERR_INVALID_URL, Http::scBadRequest, method, http->uri, conn->clientConnection->remote, NULL, NULL, NULL);
         assert(context->http->out.offset == 0);
         context->pullData();
         goto finish;
@@ -2655,31 +2652,29 @@ clientProcessRequest(ConnStateData *conn, const Http::Http1ParserPointer &hp, Cl
             (http_ver.major > 1) ) {
 
         clientStreamNode *node = context->getClientReplyContext();
-        debugs(33, 5, "Unsupported HTTP version discovered. :\n" << hp->rawHeaderBuf());
+        debugs(33, 5, "Unsupported HTTP version discovered. :\n" << hp.messageProtocol());
         conn->quitAfterError(request.getRaw());
         // setLogUri should called before repContext->setReplyToError
         setLogUri(http, http->uri,  true);
         clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
         assert (repContext);
-        repContext->setReplyToError(ERR_UNSUP_HTTPVERSION, Http::scHttpVersionNotSupported, *method, http->uri,
-                                    conn->clientConnection->remote, NULL, hp->rawHeaderBuf(), NULL);
+        repContext->setReplyToError(ERR_UNSUP_HTTPVERSION, Http::scHttpVersionNotSupported, method, http->uri,
+                                    conn->clientConnection->remote, NULL, hp.rawHeaderBuf(), NULL);
         assert(context->http->out.offset == 0);
         context->pullData();
         goto finish;
     }
 
     /* compile headers */
-    /* we should skip request line! */
-    /* XXX should actually know the damned buffer size here */
-    if (http_ver.major >= 1 && !request->parseHeader(hp->rawHeaderBuf(), hp->headerBlockSize())) {
+    if (http_ver.major >= 1 && !request->parseHeader(hp.rawHeaderBuf(), hp.headerBlockSize())) {
         clientStreamNode *node = context->getClientReplyContext();
-        debugs(33, 5, "Failed to parse request headers:\n" << hp->rawHeaderBuf());
+        debugs(33, 5, "Failed to parse request headers:\n" << hp.rawHeaderBuf());
         conn->quitAfterError(request.getRaw());
         // setLogUri should called before repContext->setReplyToError
         setLogUri(http, http->uri,  true);
         clientReplyContext *repContext = dynamic_cast<clientReplyContext *>(node->data.getRaw());
         assert (repContext);
-        repContext->setReplyToError(ERR_INVALID_REQ, Http::scBadRequest, *method, http->uri, conn->clientConnection->remote, NULL, NULL, NULL);
+        repContext->setReplyToError(ERR_INVALID_REQ, Http::scBadRequest, method, http->uri, conn->clientConnection->remote, NULL, NULL, NULL);
         assert(context->http->out.offset == 0);
         context->pullData();
         goto finish;
@@ -2762,7 +2757,7 @@ clientProcessRequest(ConnStateData *conn, const Http::Http1ParserPointer &hp, Cl
         unsupportedTe = te.size() && te != "identity";
     } // else implied identity coding
 
-    mustReplyToOptions = (*method == Http::METHOD_OPTIONS) &&
+    mustReplyToOptions = (method == Http::METHOD_OPTIONS) &&
                          (request->header.getInt64(HDR_MAX_FORWARDS) == 0);
     if (!urlCheckRequest(request.getRaw()) || mustReplyToOptions || unsupportedTe) {
         clientStreamNode *node = context->getClientReplyContext();
@@ -2953,7 +2948,7 @@ ConnStateData::clientParseRequests()
             parser_->bufsiz = in.notYetUsed;
 
         /* Process request */
-        ClientSocketContext *context = parseHttpRequest(this, parser_);
+        ClientSocketContext *context = parseHttpRequest(this, *parser_);
         PROF_stop(parseHttpRequest);
 
         /* partial or incomplete request */
@@ -2971,7 +2966,7 @@ ConnStateData::clientParseRequests()
                                              CommTimeoutCbPtrFun(clientLifetimeTimeout, context->http));
             commSetConnTimeout(clientConnection, Config.Timeout.lifetime, timeoutCall);
 
-            clientProcessRequest(this, parser_, context);
+            clientProcessRequest(this, *parser_, context);
 
             parsed_req = true; // XXX: do we really need to parse everything right NOW ?
 
index b73f205d316901227ec6aff563d7c20a1907aba7..0b16f7f526d869112e3de8eabba50f3f07db4739 100644 (file)
@@ -19,7 +19,7 @@ Http::Http1Parser::clear()
     req.u_start = req.u_end = -1;
     req.v_start = req.v_end = -1;
     msgProtocol_ = AnyP::ProtocolVersion();
-    method_ = NULL;
+    method_ = HttpRequestMethod();
     mimeHeaderBlock_.clear();
 }
 
@@ -201,7 +201,7 @@ Http::Http1Parser::parseRequestFirstLine()
     }
 
     /* Set method_ */
-    method_ = new HttpRequestMethod(&buf[req.m_start], &buf[req.m_end]+1);
+    method_ = HttpRequestMethod(&buf[req.m_start], &buf[req.m_end]+1);
 
     // First non-whitespace after first SP = beginning of URL+Version
     if (second_word > line_end || second_word < req.start) {
@@ -328,7 +328,7 @@ Http::Http1Parser::parseRequest()
         PROF_start(HttpParserParseReqLine);
         int retcode = parseRequestFirstLine();
         debugs(74, 5, "request-line: retval " << retcode << ": from " << req.start << "->" << req.end << " " << Raw("line", &buf[req.start], req.end-req.start));
-        debugs(74, 5, "request-line: method " << req.m_start << "->" << req.m_end << " (" << *method_ << ")");
+        debugs(74, 5, "request-line: method " << req.m_start << "->" << req.m_end << " (" << method_ << ")");
         debugs(74, 5, "request-line: url " << req.u_start << "->" << req.u_end << " (" << uri_ << ")");
         debugs(74, 5, "request-line: proto " << req.v_start << "->" << req.v_end << " (" << msgProtocol_ << ")");
         debugs(74, 5, "Parser: parse-offset=" << parseOffset_);
index bee6de298d862ecf4607899129c0f2e13a2f62c8..bb6a6855f5614e7f63f7b621a46c4daf0bf0f900 100644 (file)
@@ -4,6 +4,7 @@
 #include "base/RefCount.h"
 #include "http/forward.h"
 #include "http/ProtocolVersion.h"
+#include "http/RequestMethod.h"
 #include "http/StatusCode.h"
 #include "SBuf.h"
 
@@ -86,11 +87,11 @@ public:
     /// the protocol label for this message
     const AnyP::ProtocolVersion & messageProtocol() const {return msgProtocol_;}
 
-    /// the HTTP method if this is a request method
-    const HttpRequestMethodPointer & method() const {return method_;}
+    /// the HTTP method if this is a request message
+    const HttpRequestMethod & method() const {return method_;}
 
-    /// the request-line URI if this is a request, or an empty string.
-    SBuf requestUri() const {return uri_;}
+    /// the request-line URI if this is a request message, or an empty string.
+    const SBuf &requestUri() const {return uri_;}
 
     // TODO: Offsets for pieces of the (HTTP reply) Status-Line as per RFC 2616
 
@@ -121,7 +122,7 @@ private:
     AnyP::ProtocolVersion msgProtocol_;
 
     /// what request method has been found on the first line
-    HttpRequestMethodPointer method_;
+    HttpRequestMethod method_;
 
     /// raw copy of the origina client reqeust-line URI field
     SBuf uri_;
index a49dbf45cacafb47bbaa585468d8cc07d31a6705..86acac2d92a0125acc2585e80eddc79461daabe7 100644 (file)
@@ -53,7 +53,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start], (output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start], (output.req.u_end-output.req.u_start+1)));
@@ -77,7 +77,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("POST", &output.buf[output.req.m_start], (output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_POST), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_POST), output.method_);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start], (output.req.u_end-output.req.u_start+1)));
@@ -102,7 +102,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -127,7 +127,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -153,7 +153,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -180,7 +180,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -218,7 +218,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
         CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
@@ -240,7 +240,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -265,7 +265,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -290,7 +290,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -315,7 +315,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -340,7 +340,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -365,7 +365,7 @@ testHttp1Parser::testParseRequestLineProtocols()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -402,7 +402,7 @@ testHttp1Parser::testParseRequestLineStrange()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -428,7 +428,7 @@ testHttp1Parser::testParseRequestLineStrange()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(9, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/fo o/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -454,7 +454,7 @@ testHttp1Parser::testParseRequestLineStrange()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end); // strangeness generated by following RFC
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -491,7 +491,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -516,7 +516,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -544,7 +544,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -594,7 +594,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(13, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/ HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -616,7 +616,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         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(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -634,7 +634,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         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(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -652,7 +652,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         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(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -670,7 +670,7 @@ testHttp1Parser::testParseRequestLineTerminators()
         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(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -705,7 +705,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp(".", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(".", NULL), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(".", NULL), output.method_);
         CPPUNIT_ASSERT_EQUAL(2, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -731,7 +731,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(6, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("OPTIONS", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_OPTIONS), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_OPTIONS), output.method_);
         CPPUNIT_ASSERT_EQUAL(8, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(8, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("*", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -757,7 +757,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(9, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HELLOWORLD", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("HELLOWORLD",NULL), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("HELLOWORLD",NULL), output.method_);
         CPPUNIT_ASSERT_EQUAL(11, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(11, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -781,7 +781,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("A\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)));
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
-        CPPUNIT_ASSERT(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -802,7 +802,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)));
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
-        CPPUNIT_ASSERT(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -827,7 +827,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(1, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -853,7 +853,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(0, memcmp(" GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)));
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
-        CPPUNIT_ASSERT(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -877,7 +877,7 @@ testHttp1Parser::testParseRequestLineMethods()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("\tGET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(&output.buf[output.req.m_start],&output.buf[output.req.m_end+1]), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(&output.buf[output.req.m_start],&output.buf[output.req.m_end+1]), output.method_);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -914,7 +914,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("/",NULL), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("/",NULL), output.method_);
         CPPUNIT_ASSERT_EQUAL(2, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(9, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -941,7 +941,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(1, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(1, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("/",NULL), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("/",NULL), output.method_);
         CPPUNIT_ASSERT_EQUAL(3, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(10, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -967,7 +967,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, memcmp(" / HTTP/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)));
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
-        CPPUNIT_ASSERT(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -991,7 +991,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET\x0B", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-//        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("GET\0x0B",NULL), *output.method_);
+//        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("GET\0x0B",NULL), output.method_);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -1015,7 +1015,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         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(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -1039,7 +1039,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET\0", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-//        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("GET\0",NULL), *output.method_);
+//        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod("GET\0",NULL), output.method_);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -1064,7 +1064,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(12, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -1088,7 +1088,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_GET), output.method_);
         CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(11, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)));
@@ -1111,7 +1111,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, memcmp("\xB\xC\xE\xF\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)));
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
-        CPPUNIT_ASSERT(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -1136,7 +1136,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
         CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
         CPPUNIT_ASSERT_EQUAL(0, memcmp("\t", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)));
-        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(&output.buf[output.req.m_start],&output.buf[output.req.m_end+1]), *output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(&output.buf[output.req.m_start],&output.buf[output.req.m_end+1]), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
@@ -1159,7 +1159,7 @@ testHttp1Parser::testParseRequestLineInvalid()
         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(!output.method_);
+        CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(), output.method_);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
         CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);