-#define SQUID_UNIT_TEST 1
+/*
+ * Copyright (C) 1996-2020 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 "Mem.h"
+#include "http/RequestMethod.h"
+#include "SquidConfig.h"
#include "testHttpRequestMethod.h"
-#include "HttpRequestMethod.h"
-#if HAVE_SSTREAM
#include <sstream>
-#endif
CPPUNIT_TEST_SUITE_REGISTRATION( testHttpRequestMethod );
-
/*
* We should be able to make an HttpRequestMethod straight from a string.
*/
void
testHttpRequestMethod::testConstructCharStart()
{
- /* parse an empty string -> METHOD_NONE */
- CPPUNIT_ASSERT(HttpRequestMethod(NULL,NULL) == METHOD_NONE);
+ // string in SBuf
+
+ /* parse an empty string -> Http::METHOD_NONE */
+ CPPUNIT_ASSERT(HttpRequestMethod(SBuf()) == Http::METHOD_NONE);
+
/* parsing a literal should work */
- CPPUNIT_ASSERT(HttpRequestMethod("GET", NULL) == METHOD_GET);
- CPPUNIT_ASSERT(HttpRequestMethod("QWERTY", NULL) == METHOD_OTHER);
+ CPPUNIT_ASSERT(HttpRequestMethod(SBuf("GET")) == Http::METHOD_GET);
+ CPPUNIT_ASSERT(HttpRequestMethod(SBuf("QWERTY")) == Http::METHOD_OTHER);
+
+ // string in char*
+
+ /* parse an empty string -> Http::METHOD_NONE */
+ HttpRequestMethod a;
+ a.HttpRequestMethodXXX(NULL);
+ CPPUNIT_ASSERT(a == Http::METHOD_NONE);
+
+ /* parsing a literal should work */
+ HttpRequestMethod b;
+ b.HttpRequestMethodXXX("GET");
+ CPPUNIT_ASSERT(b == Http::METHOD_GET);
+ CPPUNIT_ASSERT_EQUAL(SBuf("GET"), b.image());
+ HttpRequestMethod c;
+ c.HttpRequestMethodXXX("QWERTY");
+ CPPUNIT_ASSERT(c == Http::METHOD_OTHER);
+ CPPUNIT_ASSERT_EQUAL(SBuf("QWERTY"), c.image());
+
+ // parsing error should not leave stale results
+ b.HttpRequestMethodXXX(NULL);
+ CPPUNIT_ASSERT(b == Http::METHOD_NONE);
+ CPPUNIT_ASSERT_EQUAL(SBuf("NONE"), b.image());
}
/*
- * We can also parse precise ranges of characters
+ * We can also parse precise ranges of characters with SBuf
*/
void
testHttpRequestMethod::testConstructCharStartEnd()
{
char const * buffer;
- /* parse an empty string -> METHOD_NONE */
- CPPUNIT_ASSERT(HttpRequestMethod(NULL, NULL) == METHOD_NONE);
+ /* parse an empty string -> Http::METHOD_NONE */
+ CPPUNIT_ASSERT(HttpRequestMethod(SBuf()) == Http::METHOD_NONE);
/* parsing a literal should work */
- CPPUNIT_ASSERT(HttpRequestMethod("GET", NULL) == METHOD_GET);
+ CPPUNIT_ASSERT(HttpRequestMethod(SBuf("GET")) == Http::METHOD_GET);
/* parsing with an explicit end should work */
buffer = "POSTPLUS";
- CPPUNIT_ASSERT(HttpRequestMethod(buffer, buffer + 4) == METHOD_POST);
+ CPPUNIT_ASSERT(HttpRequestMethod(SBuf(buffer, 4)) == Http::METHOD_POST);
}
/*
- * we should be able to assign a method_t to a HttpRequestMethod
+ * we should be able to assign a Http::MethodType to a HttpRequestMethod
*/
void
testHttpRequestMethod::testAssignFrommethod_t()
{
HttpRequestMethod method;
- method = METHOD_NONE;
- CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(METHOD_NONE), method);
- method = METHOD_POST;
- CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(METHOD_POST), method);
+ method = Http::METHOD_NONE;
+ CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_NONE), method);
+ method = Http::METHOD_POST;
+ CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_POST), method);
}
/*
- * a default constructed HttpRequestMethod is == METHOD_NONE
+ * a default constructed HttpRequestMethod is == Http::METHOD_NONE
*/
void
testHttpRequestMethod::testDefaultConstructor()
{
HttpRequestMethod lhs;
- HttpRequestMethod rhs(METHOD_NONE);
+ HttpRequestMethod rhs(Http::METHOD_NONE);
CPPUNIT_ASSERT_EQUAL(lhs, rhs);
}
/*
- * we should be able to construct a HttpRequestMethod from a method_t
+ * we should be able to construct a HttpRequestMethod from a Http::MethodType
*/
void
testHttpRequestMethod::testConstructmethod_t()
{
- CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(METHOD_NONE), HttpRequestMethod(METHOD_NONE));
- CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(METHOD_POST), HttpRequestMethod(METHOD_POST));
- CPPUNIT_ASSERT(HttpRequestMethod(METHOD_NONE) != HttpRequestMethod(METHOD_POST));
+ CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_NONE), HttpRequestMethod(Http::METHOD_NONE));
+ CPPUNIT_ASSERT_EQUAL(HttpRequestMethod(Http::METHOD_POST), HttpRequestMethod(Http::METHOD_POST));
+ CPPUNIT_ASSERT(HttpRequestMethod(Http::METHOD_NONE) != HttpRequestMethod(Http::METHOD_POST));
}
/*
void
testHttpRequestMethod::testImage()
{
- CPPUNIT_ASSERT_EQUAL(String("POST"), String(HttpRequestMethod("post",NULL).image()));
+ // relaxed RFC-compliance parse HTTP methods are upgraded to correct case
+ Config.onoff.relaxed_header_parser = 1;
+ CPPUNIT_ASSERT_EQUAL(SBuf("POST"), HttpRequestMethod(SBuf("POST")).image());
+ CPPUNIT_ASSERT_EQUAL(SBuf("POST"), HttpRequestMethod(SBuf("pOsT")).image());
+ CPPUNIT_ASSERT_EQUAL(SBuf("POST"), HttpRequestMethod(SBuf("post")).image());
+
+ // strict RFC-compliance parse HTTP methods are case sensitive
+ Config.onoff.relaxed_header_parser = 0;
+ CPPUNIT_ASSERT_EQUAL(SBuf("POST"), HttpRequestMethod(SBuf("POST")).image());
+ CPPUNIT_ASSERT_EQUAL(SBuf("pOsT"), HttpRequestMethod(SBuf("pOsT")).image());
+ CPPUNIT_ASSERT_EQUAL(SBuf("post"), HttpRequestMethod(SBuf("post")).image());
}
/*
- * an HttpRequestMethod should be comparable to a method_t without false
+ * an HttpRequestMethod should be comparable to a Http::MethodType without false
* matches
*/
void
testHttpRequestMethod::testEqualmethod_t()
{
- CPPUNIT_ASSERT(HttpRequestMethod(METHOD_NONE) == METHOD_NONE);
- CPPUNIT_ASSERT(not (HttpRequestMethod(METHOD_POST) == METHOD_GET));
- CPPUNIT_ASSERT(HttpRequestMethod(METHOD_GET) == METHOD_GET);
- CPPUNIT_ASSERT(not (HttpRequestMethod(METHOD_TRACE) == METHOD_SEARCH));
+ CPPUNIT_ASSERT(HttpRequestMethod(Http::METHOD_NONE) == Http::METHOD_NONE);
+ CPPUNIT_ASSERT(not (HttpRequestMethod(Http::METHOD_POST) == Http::METHOD_GET));
+ CPPUNIT_ASSERT(HttpRequestMethod(Http::METHOD_GET) == Http::METHOD_GET);
+ CPPUNIT_ASSERT(not (HttpRequestMethod(Http::METHOD_TRACE) == Http::METHOD_SEARCH));
}
/*
void
testHttpRequestMethod::testNotEqualmethod_t()
{
- CPPUNIT_ASSERT(HttpRequestMethod(METHOD_NONE) != METHOD_GET);
- CPPUNIT_ASSERT(not (HttpRequestMethod(METHOD_POST) != METHOD_POST));
- CPPUNIT_ASSERT(HttpRequestMethod(METHOD_GET) != METHOD_NONE);
- CPPUNIT_ASSERT(not (HttpRequestMethod(METHOD_SEARCH) != METHOD_SEARCH));
+ CPPUNIT_ASSERT(HttpRequestMethod(Http::METHOD_NONE) != Http::METHOD_GET);
+ CPPUNIT_ASSERT(not (HttpRequestMethod(Http::METHOD_POST) != Http::METHOD_POST));
+ CPPUNIT_ASSERT(HttpRequestMethod(Http::METHOD_GET) != Http::METHOD_NONE);
+ CPPUNIT_ASSERT(not (HttpRequestMethod(Http::METHOD_SEARCH) != Http::METHOD_SEARCH));
}
/*
void
testHttpRequestMethod::testStream()
{
+ // relaxed RFC-compliance parse HTTP methods are upgraded to correct case
+ Config.onoff.relaxed_header_parser = 1;
std::ostringstream buffer;
- buffer << HttpRequestMethod("get",NULL);
+ buffer << HttpRequestMethod(SBuf("get"));
CPPUNIT_ASSERT_EQUAL(String("GET"), String(buffer.str().c_str()));
+
+ // strict RFC-compliance parse HTTP methods are case sensitive
+ Config.onoff.relaxed_header_parser = 0;
+ std::ostringstream buffer2;
+ buffer2 << HttpRequestMethod(SBuf("get"));
+ CPPUNIT_ASSERT_EQUAL(String("get"), String(buffer2.str().c_str()));
}
+