-#define SQUID_UNIT_TEST 1
+/*
+ * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
#include "squid.h"
#include <cppunit/TestAssert.h>
-#include "testHttpRequest.h"
#include "HttpHeader.h"
#include "HttpRequest.h"
-#include "Mem.h"
#include "mime_header.h"
+#include "MasterXaction.h"
+#include "testHttpRequest.h"
+#include "unitTestMain.h"
CPPUNIT_TEST_SUITE_REGISTRATION( testHttpRequest );
class PrivateHttpRequest : public HttpRequest
{
public:
- bool doSanityCheckStartLine(MemBuf *b, const size_t h, http_status *e) { return sanityCheckStartLine(b,h,e); };
+ PrivateHttpRequest(const MasterXactionPointer &mx) : HttpRequest(mx) {}
+ bool doSanityCheckStartLine(const char *b, const size_t h, Http::StatusCode *e) { return sanityCheckStartLine(b,h,e); };
};
/* init memory pools */
testHttpRequest::setUp()
{
Mem::Init();
+ AnyP::UriScheme::Init();
httpHeaderInitModule();
}
* Test creating an HttpRequest object from a Url and method
*/
void
-testHttpRequest::testCreateFromUrlAndMethod()
+testHttpRequest::testCreateFromUrl()
{
- /* vanilla url */
+ /* vanilla url, implict method */
unsigned short expected_port;
char * url = xstrdup("http://foo:90/bar");
- HttpRequest *aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
+ const MasterXaction::Pointer mx = new MasterXaction(XactionInitiator::initClient);
+ HttpRequest *aRequest = HttpRequest::FromUrl(url, mx);
expected_port = 90;
- HttpRequest *nullRequest = NULL;
- CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
- CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
- CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
- CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->url.port());
+ CPPUNIT_ASSERT(aRequest->method == Http::METHOD_GET);
+ CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->url.host()));
+ CPPUNIT_ASSERT_EQUAL(SBuf("/bar"), aRequest->url.path());
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, static_cast<AnyP::ProtocolType>(aRequest->url.getScheme()));
+ CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
+ xfree(url);
+
+ /* vanilla url */
+ url = xstrdup("http://foo:90/bar");
+ aRequest = HttpRequest::FromUrl(url, mx, Http::METHOD_GET);
+ expected_port = 90;
+ CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->url.port());
+ CPPUNIT_ASSERT(aRequest->method == Http::METHOD_GET);
+ CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->url.host()));
+ CPPUNIT_ASSERT_EQUAL(SBuf("/bar"), aRequest->url.path());
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, static_cast<AnyP::ProtocolType>(aRequest->url.getScheme()));
CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
xfree(url);
/* vanilla url, different method */
url = xstrdup("http://foo/bar");
- aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_PUT);
+ aRequest = HttpRequest::FromUrl(url, mx, Http::METHOD_PUT);
expected_port = 80;
- CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
- CPPUNIT_ASSERT(aRequest->method == METHOD_PUT);
- CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
- CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->url.port());
+ CPPUNIT_ASSERT(aRequest->method == Http::METHOD_PUT);
+ CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->url.host()));
+ CPPUNIT_ASSERT_EQUAL(SBuf("/bar"), aRequest->url.path());
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, static_cast<AnyP::ProtocolType>(aRequest->url.getScheme()));
CPPUNIT_ASSERT_EQUAL(String("http://foo/bar"), String(url));
+ xfree(url);
/* a connect url with non-CONNECT data */
+ HttpRequest *nullRequest = nullptr;
url = xstrdup(":foo/bar");
- aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_CONNECT);
+ aRequest = HttpRequest::FromUrl(url, mx, Http::METHOD_CONNECT);
xfree(url);
CPPUNIT_ASSERT_EQUAL(nullRequest, aRequest);
/* a CONNECT url with CONNECT data */
url = xstrdup("foo:45");
- aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_CONNECT);
+ aRequest = HttpRequest::FromUrl(url, mx, Http::METHOD_CONNECT);
expected_port = 45;
- CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
- CPPUNIT_ASSERT(aRequest->method == METHOD_CONNECT);
- CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
- CPPUNIT_ASSERT_EQUAL(String(""), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_NONE, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->url.port());
+ CPPUNIT_ASSERT(aRequest->method == Http::METHOD_CONNECT);
+ CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->url.host()));
+ CPPUNIT_ASSERT_EQUAL(SBuf(), aRequest->url.path());
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_NONE, static_cast<AnyP::ProtocolType>(aRequest->url.getScheme()));
CPPUNIT_ASSERT_EQUAL(String("foo:45"), String(url));
xfree(url);
-}
-/*
- * Test creating an HttpRequest object from a Url alone.
- */
-void
-testHttpRequest::testCreateFromUrl()
-{
- /* vanilla url */
- unsigned short expected_port;
- char * url = xstrdup("http://foo:90/bar");
- HttpRequest *aRequest = HttpRequest::CreateFromUrl(url);
- expected_port = 90;
- CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
- CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
- CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
- CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
- CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
- xfree(url);
+ // XXX: check METHOD_NONE input handling
}
/*
/* valid IPv6 address without port */
url = xstrdup("http://[2000:800::45]/foo");
- aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
+ const MasterXaction::Pointer mx = new MasterXaction(XactionInitiator::initClient);
+ aRequest = HttpRequest::FromUrl(url, mx, Http::METHOD_GET);
expected_port = 80;
- CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
- CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
- CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->GetHost()));
- CPPUNIT_ASSERT_EQUAL(String("/foo"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->url.port());
+ CPPUNIT_ASSERT(aRequest->method == Http::METHOD_GET);
+ CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->url.host()));
+ CPPUNIT_ASSERT_EQUAL(SBuf("/foo"), aRequest->url.path());
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, static_cast<AnyP::ProtocolType>(aRequest->url.getScheme()));
CPPUNIT_ASSERT_EQUAL(String("http://[2000:800::45]/foo"), String(url));
xfree(url);
/* valid IPv6 address with port */
url = xstrdup("http://[2000:800::45]:90/foo");
- aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
+ aRequest = HttpRequest::FromUrl(url, mx, Http::METHOD_GET);
expected_port = 90;
- CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
- CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
- CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->GetHost()));
- CPPUNIT_ASSERT_EQUAL(String("/foo"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->url.port());
+ CPPUNIT_ASSERT(aRequest->method == Http::METHOD_GET);
+ CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->url.host()));
+ CPPUNIT_ASSERT_EQUAL(SBuf("/foo"), aRequest->url.path());
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, static_cast<AnyP::ProtocolType>(aRequest->url.getScheme()));
CPPUNIT_ASSERT_EQUAL(String("http://[2000:800::45]:90/foo"), String(url));
xfree(url);
/* IPv6 address as invalid (bug trigger) */
url = xstrdup("http://2000:800::45/foo");
- aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
+ aRequest = HttpRequest::FromUrl(url, mx, Http::METHOD_GET);
expected_port = 80;
- CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
- CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
- CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->GetHost()));
- CPPUNIT_ASSERT_EQUAL(String("/foo"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->url.port());
+ CPPUNIT_ASSERT(aRequest->method == Http::METHOD_GET);
+ CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->url.host()));
+ CPPUNIT_ASSERT_EQUAL(SBuf("/foo"), aRequest->url.path());
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, static_cast<AnyP::ProtocolType>(aRequest->url.getScheme()));
CPPUNIT_ASSERT_EQUAL(String("http://2000:800::45/foo"), String(url));
xfree(url);
}
testHttpRequest::testSanityCheckStartLine()
{
MemBuf input;
- PrivateHttpRequest engine;
- http_status error = HTTP_STATUS_NONE;
+ const MasterXaction::Pointer mx = new MasterXaction(XactionInitiator::initClient);
+ PrivateHttpRequest engine(mx);
+ Http::StatusCode error = Http::scNone;
size_t hdr_len;
input.init();
// a valid request line
input.append("GET / HTTP/1.1\n\n", 16);
hdr_len = headersEnd(input.content(), input.contentSize());
- CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
- CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(input.content(), hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
input.reset();
- error = HTTP_STATUS_NONE;
+ error = Http::scNone;
input.append("GET / HTTP/1.1\n\n", 18);
hdr_len = headersEnd(input.content(), input.contentSize());
- CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
- CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(input.content(), hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
input.reset();
- error = HTTP_STATUS_NONE;
+ error = Http::scNone;
// strange but valid methods
input.append(". / HTTP/1.1\n\n", 14);
hdr_len = headersEnd(input.content(), input.contentSize());
- CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
- CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(input.content(), hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
input.reset();
- error = HTTP_STATUS_NONE;
+ error = Http::scNone;
input.append("OPTIONS * HTTP/1.1\n\n", 20);
hdr_len = headersEnd(input.content(), input.contentSize());
- CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
- CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(input.content(), hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
input.reset();
- error = HTTP_STATUS_NONE;
+ error = Http::scNone;
// TODO no method
input.append(" \n\n", 8);
hdr_len = headersEnd(input.content(), input.contentSize());
- CPPUNIT_ASSERT(!engine.doSanityCheckStartLine(&input, hdr_len, &error) );
- CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
+ CPPUNIT_ASSERT(!engine.doSanityCheckStartLine(input.content(), hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
input.reset();
- error = HTTP_STATUS_NONE;
+ error = Http::scNone;
}
+