-#if 0
+#define SQUID_UNIT_TEST 1
#include "squid.h"
-#endif
#include <cppunit/TestAssert.h>
#include "testHttpRequest.h"
#include "HttpRequest.h"
#include "Mem.h"
-
+#include "protos.h"
CPPUNIT_TEST_SUITE_REGISTRATION( testHttpRequest );
-/* stub functions to link successfully */
-void
-shut_down(int)
-{}
-
-/* end stubs */
+/** wrapper for testing HttpRequest object private and protected functions */
+class PrivateHttpRequest : public HttpRequest
+{
+public:
+ bool doSanityCheckStartLine(MemBuf *b, const size_t h, http_status *e) { return sanityCheckStartLine(b,h,e); };
+};
/* init memory pools */
testHttpRequest::setUp()
{
Mem::Init();
+ httpHeaderInitModule();
}
/*
testHttpRequest::testCreateFromUrlAndMethod()
{
/* vanilla url */
- ushort expected_port;
+ unsigned short expected_port;
char * url = xstrdup("http://foo:90/bar");
HttpRequest *aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
expected_port = 90;
CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
xfree(url);
CPPUNIT_ASSERT(aRequest->method == METHOD_PUT);
CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
CPPUNIT_ASSERT_EQUAL(String("http://foo/bar"), String(url));
/* a connect url with non-CONNECT data */
CPPUNIT_ASSERT(aRequest->method == METHOD_CONNECT);
CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
CPPUNIT_ASSERT_EQUAL(String(""), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(PROTO_NONE, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_NONE, aRequest->protocol);
CPPUNIT_ASSERT_EQUAL(String("foo:45"), String(url));
xfree(url);
}
testHttpRequest::testCreateFromUrl()
{
/* vanilla url */
- ushort expected_port;
+ unsigned short expected_port;
char * url = xstrdup("http://foo:90/bar");
HttpRequest *aRequest = HttpRequest::CreateFromUrl(url);
expected_port = 90;
CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
xfree(url);
}
void
testHttpRequest::testIPv6HostColonBug()
{
- ushort expected_port;
+ unsigned short expected_port;
char * url = NULL;
HttpRequest *aRequest = NULL;
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(PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
CPPUNIT_ASSERT_EQUAL(String("http://[2000:800::45]/foo"), String(url));
xfree(url);
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(PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
CPPUNIT_ASSERT_EQUAL(String("http://[2000:800::45]:90/foo"), String(url));
xfree(url);
expected_port = 80;
CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
-#if USE_IPV6
- /* We hasve fixed this in IPv6 build. */
CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->GetHost()));
-#else
- /* NO fix is possible in IPv4-pure build. */
- CPPUNIT_ASSERT_EQUAL(String("2000:800::45"), String(aRequest->GetHost()));
-#endif
CPPUNIT_ASSERT_EQUAL(String("/foo"), aRequest->urlpath);
- CPPUNIT_ASSERT_EQUAL(PROTO_HTTP, aRequest->protocol);
+ CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
CPPUNIT_ASSERT_EQUAL(String("http://2000:800::45/foo"), String(url));
xfree(url);
}
+
+void
+testHttpRequest::testSanityCheckStartLine()
+{
+ MemBuf input;
+ PrivateHttpRequest engine;
+ http_status error = HTTP_STATUS_NONE;
+ size_t hdr_len;
+ input.init();
+
+ // a valid request line
+ input.append("GET / HTTP/1.1\n\n", 16);
+ hdr_len = headersEnd(input.content(), input.contentSize());
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ input.reset();
+ error = HTTP_STATUS_NONE;
+
+ input.append("GET / HTTP/1.1\n\n", 18);
+ hdr_len = headersEnd(input.content(), input.contentSize());
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ input.reset();
+ error = HTTP_STATUS_NONE;
+
+ // strange but valid methods
+ input.append(". / HTTP/1.1\n\n", 14);
+ hdr_len = headersEnd(input.content(), input.contentSize());
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ input.reset();
+ error = HTTP_STATUS_NONE;
+
+ input.append("OPTIONS * HTTP/1.1\n\n", 20);
+ hdr_len = headersEnd(input.content(), input.contentSize());
+ CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
+ input.reset();
+ error = HTTP_STATUS_NONE;
+
+// TODO no method
+
+// TODO binary code in method
+
+// TODO no URL
+
+// TODO no status (okay)
+
+// TODO non-HTTP protocol
+
+ input.append(" \n\n", 8);
+ hdr_len = headersEnd(input.content(), input.contentSize());
+ CPPUNIT_ASSERT(!engine.doSanityCheckStartLine(&input, hdr_len, &error) );
+ CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
+ input.reset();
+ error = HTTP_STATUS_NONE;
+}