]> git.ipfire.org Git - thirdparty/squid.git/blame - src/tests/testHttpRequest.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / tests / testHttpRequest.cc
CommitLineData
8e46cda5 1#define SQUID_UNIT_TEST 1
f7f3304a 2#include "squid.h"
e1f7507e 3
c21ad0f5 4#include <cppunit/TestAssert.h>
5
c21ad0f5 6#include "testHttpRequest.h"
7#include "HttpRequest.h"
e1f7507e 8#include "Mem.h"
582c2af2 9#include "protos.h"
c21ad0f5 10
c21ad0f5 11CPPUNIT_TEST_SUITE_REGISTRATION( testHttpRequest );
12
0f9db2d6
AJ
13/** wrapper for testing HttpRequest object private and protected functions */
14class PrivateHttpRequest : public HttpRequest
15{
16public:
17 bool doSanityCheckStartLine(MemBuf *b, const size_t h, http_status *e) { return sanityCheckStartLine(b,h,e); };
18};
19
c21ad0f5 20/* init memory pools */
21
16555581 22void
23testHttpRequest::setUp()
c21ad0f5 24{
16555581 25 Mem::Init();
0f9db2d6 26 httpHeaderInitModule();
16555581 27}
c21ad0f5 28
29/*
30 * Test creating an HttpRequest object from a Url and method
31 */
32void
33testHttpRequest::testCreateFromUrlAndMethod()
34{
35 /* vanilla url */
f45dd259 36 unsigned short expected_port;
c21ad0f5 37 char * url = xstrdup("http://foo:90/bar");
38 HttpRequest *aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
39 expected_port = 90;
40 HttpRequest *nullRequest = NULL;
41 CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
914b89a2 42 CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
cc192b50 43 CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
30abd221 44 CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
0c3d3f65 45 CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
30abd221 46 CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
c21ad0f5 47 xfree(url);
cc192b50 48
c21ad0f5 49 /* vanilla url, different method */
50 url = xstrdup("http://foo/bar");
51 aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_PUT);
52 expected_port = 80;
53 CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
914b89a2 54 CPPUNIT_ASSERT(aRequest->method == METHOD_PUT);
cc192b50 55 CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
30abd221 56 CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
0c3d3f65 57 CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
30abd221 58 CPPUNIT_ASSERT_EQUAL(String("http://foo/bar"), String(url));
cc192b50 59
c21ad0f5 60 /* a connect url with non-CONNECT data */
61 url = xstrdup(":foo/bar");
62 aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_CONNECT);
63 xfree(url);
64 CPPUNIT_ASSERT_EQUAL(nullRequest, aRequest);
cc192b50 65
c21ad0f5 66 /* a CONNECT url with CONNECT data */
67 url = xstrdup("foo:45");
68 aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_CONNECT);
69 expected_port = 45;
70 CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
914b89a2 71 CPPUNIT_ASSERT(aRequest->method == METHOD_CONNECT);
cc192b50 72 CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
30abd221 73 CPPUNIT_ASSERT_EQUAL(String(""), aRequest->urlpath);
0c3d3f65 74 CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_NONE, aRequest->protocol);
30abd221 75 CPPUNIT_ASSERT_EQUAL(String("foo:45"), String(url));
c21ad0f5 76 xfree(url);
77}
78
79/*
80 * Test creating an HttpRequest object from a Url alone.
81 */
82void
83testHttpRequest::testCreateFromUrl()
84{
85 /* vanilla url */
f45dd259 86 unsigned short expected_port;
c21ad0f5 87 char * url = xstrdup("http://foo:90/bar");
88 HttpRequest *aRequest = HttpRequest::CreateFromUrl(url);
89 expected_port = 90;
90 CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
914b89a2 91 CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
cc192b50 92 CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->GetHost()));
30abd221 93 CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
0c3d3f65 94 CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
30abd221 95 CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
c21ad0f5 96 xfree(url);
97}
cc192b50 98
99/*
100 * Test BUG: URL '2000:800:45' opens host 2000 port 800 !!
101 */
102void
103testHttpRequest::testIPv6HostColonBug()
104{
f45dd259 105 unsigned short expected_port;
cc192b50 106 char * url = NULL;
107 HttpRequest *aRequest = NULL;
108
109 /* valid IPv6 address without port */
110 url = xstrdup("http://[2000:800::45]/foo");
111 aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
112 expected_port = 80;
113 CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
914b89a2 114 CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
cc192b50 115 CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->GetHost()));
116 CPPUNIT_ASSERT_EQUAL(String("/foo"), aRequest->urlpath);
0c3d3f65 117 CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
cc192b50 118 CPPUNIT_ASSERT_EQUAL(String("http://[2000:800::45]/foo"), String(url));
119 xfree(url);
120
121 /* valid IPv6 address with port */
122 url = xstrdup("http://[2000:800::45]:90/foo");
123 aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
124 expected_port = 90;
125 CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
914b89a2 126 CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
cc192b50 127 CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->GetHost()));
128 CPPUNIT_ASSERT_EQUAL(String("/foo"), aRequest->urlpath);
0c3d3f65 129 CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
cc192b50 130 CPPUNIT_ASSERT_EQUAL(String("http://[2000:800::45]:90/foo"), String(url));
131 xfree(url);
132
133 /* IPv6 address as invalid (bug trigger) */
134 url = xstrdup("http://2000:800::45/foo");
135 aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_GET);
136 expected_port = 80;
137 CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
914b89a2 138 CPPUNIT_ASSERT(aRequest->method == METHOD_GET);
cc192b50 139 CPPUNIT_ASSERT_EQUAL(String("[2000:800::45]"), String(aRequest->GetHost()));
cc192b50 140 CPPUNIT_ASSERT_EQUAL(String("/foo"), aRequest->urlpath);
0c3d3f65 141 CPPUNIT_ASSERT_EQUAL(AnyP::PROTO_HTTP, aRequest->protocol);
cc192b50 142 CPPUNIT_ASSERT_EQUAL(String("http://2000:800::45/foo"), String(url));
143 xfree(url);
144}
0f9db2d6
AJ
145
146void
147testHttpRequest::testSanityCheckStartLine()
148{
149 MemBuf input;
150 PrivateHttpRequest engine;
151 http_status error = HTTP_STATUS_NONE;
152 size_t hdr_len;
153 input.init();
154
155 // a valid request line
156 input.append("GET / HTTP/1.1\n\n", 16);
157 hdr_len = headersEnd(input.content(), input.contentSize());
158 CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
159 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
160 input.reset();
161 error = HTTP_STATUS_NONE;
162
163 input.append("GET / HTTP/1.1\n\n", 18);
164 hdr_len = headersEnd(input.content(), input.contentSize());
165 CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
166 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
167 input.reset();
168 error = HTTP_STATUS_NONE;
169
170 // strange but valid methods
171 input.append(". / HTTP/1.1\n\n", 14);
172 hdr_len = headersEnd(input.content(), input.contentSize());
173 CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
174 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
175 input.reset();
176 error = HTTP_STATUS_NONE;
177
178 input.append("OPTIONS * HTTP/1.1\n\n", 20);
179 hdr_len = headersEnd(input.content(), input.contentSize());
180 CPPUNIT_ASSERT(engine.doSanityCheckStartLine(&input, hdr_len, &error) );
181 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
182 input.reset();
183 error = HTTP_STATUS_NONE;
184
185// TODO no method
186
187// TODO binary code in method
188
189// TODO no URL
190
191// TODO no status (okay)
192
193// TODO non-HTTP protocol
194
195 input.append(" \n\n", 8);
196 hdr_len = headersEnd(input.content(), input.contentSize());
197 CPPUNIT_ASSERT(!engine.doSanityCheckStartLine(&input, hdr_len, &error) );
198 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
199 input.reset();
200 error = HTTP_STATUS_NONE;
201}