]> git.ipfire.org Git - thirdparty/squid.git/blob - src/tests/testHttpReply.cc
Merged from trunk (r13356).
[thirdparty/squid.git] / src / tests / testHttpReply.cc
1 #define SQUID_UNIT_TEST 1
2 #include "squid.h"
3 #include <cppunit/TestAssert.h>
4
5 #include "HttpHeader.h"
6 #include "HttpReply.h"
7 #include "Mem.h"
8 #include "mime_header.h"
9 #include "SquidConfig.h"
10 #include "testHttpReply.h"
11
12 CPPUNIT_TEST_SUITE_REGISTRATION( testHttpReply );
13
14 class SquidConfig Config;
15
16 /* stub functions to link successfully */
17
18 #include "MemObject.h"
19 int64_t
20 MemObject::endOffset() const
21 {
22 return 0;
23 }
24
25 #include "ConfigParser.h"
26
27 void
28 eventAdd(const char *name, EVH * func, void *arg, double when, int, bool cbdata)
29 {
30 // CALLED as setUp no-op
31 // fatal("eventAdd. Not implemented.");
32 }
33
34 /* end */
35
36 void
37 testHttpReply::setUp()
38 {
39 Mem::Init();
40 httpHeaderInitModule();
41 }
42
43 void
44 testHttpReply::testSanityCheckFirstLine()
45 {
46 MemBuf input;
47 HttpReply engine;
48 Http::StatusCode error = Http::scNone;
49 size_t hdr_len;
50 input.init();
51
52 // a valid status line
53 input.append("HTTP/1.1 200 Okay\n\n", 19);
54 hdr_len = headersEnd(input.content(),input.contentSize());
55 CPPUNIT_ASSERT( 1 && engine.sanityCheckStartLine(&input, hdr_len, &error) );
56 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
57 input.reset();
58 error = Http::scNone;
59
60 input.append("HTTP/1.1 200 Okay \n\n", 28);
61 hdr_len = headersEnd(input.content(),input.contentSize());
62 CPPUNIT_ASSERT( 2 && engine.sanityCheckStartLine(&input, hdr_len, &error) );
63 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
64 input.reset();
65 error = Http::scNone;
66
67 #if TODO // these cases are only checked after parse...
68 // invalid status line
69 input.append("HTTP/1.1 999 Okay\n\n", 19);
70 hdr_len = headersEnd(input.content(),input.contentSize());
71 CPPUNIT_ASSERT( 3 && !engine.sanityCheckStartLine(&input, hdr_len, &error) );
72 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
73 input.reset();
74 error = Http::scNone;
75
76 input.append("HTTP/1.1 2000 Okay \n\n", 29);
77 hdr_len = headersEnd(input.content(),input.contentSize());
78 CPPUNIT_ASSERT( 4 && engine.sanityCheckStartLine(&input, hdr_len, &error) );
79 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
80 input.reset();
81 error = Http::scNone;
82 #endif
83
84 // valid ICY protocol status line
85 input.append("ICY 200 Okay\n\n", 14);
86 hdr_len = headersEnd(input.content(),input.contentSize());
87 CPPUNIT_ASSERT( engine.sanityCheckStartLine(&input, hdr_len, &error) );
88 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
89 input.reset();
90 error = Http::scNone;
91 /* NP: the engine saves details about the protocol. even when being reset :( */
92 engine.protoPrefix="HTTP/";
93 engine.reset();
94
95 // empty status line
96 input.append("\n\n", 2);
97 hdr_len = headersEnd(input.content(),input.contentSize());
98 CPPUNIT_ASSERT( 5 && !engine.sanityCheckStartLine(&input, hdr_len, &error) );
99 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
100 input.reset();
101 error = Http::scNone;
102
103 input.append(" \n\n", 8);
104 hdr_len = headersEnd(input.content(),input.contentSize());
105 CPPUNIT_ASSERT( 6 && !engine.sanityCheckStartLine(&input, hdr_len, &error) );
106 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
107 input.reset();
108 error = Http::scNone;
109
110 // status line with no message
111 input.append("HTTP/1.1 200\n\n", 14); /* real case seen */
112 hdr_len = headersEnd(input.content(),input.contentSize());
113 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
114 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
115 input.reset();
116 error = Http::scNone;
117
118 input.append("HTTP/1.1 200 \n\n", 15); /* real case seen */
119 hdr_len = headersEnd(input.content(),input.contentSize());
120 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
121 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
122 input.reset();
123 error = Http::scNone;
124
125 // incomplete (short) status lines... not sane (yet), but no error either.
126 input.append("H", 1);
127 hdr_len = headersEnd(input.content(),input.contentSize());
128 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
129 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
130 input.reset();
131 error = Http::scNone;
132
133 input.append("HTTP/", 5);
134 hdr_len = headersEnd(input.content(),input.contentSize());
135 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
136 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
137 input.reset();
138 error = Http::scNone;
139
140 input.append("HTTP/1", 6);
141 hdr_len = headersEnd(input.content(),input.contentSize());
142 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
143 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
144 input.reset();
145 error = Http::scNone;
146
147 input.append("HTTP/1.1", 8);
148 hdr_len = headersEnd(input.content(),input.contentSize());
149 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
150 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
151 input.reset();
152 error = Http::scNone;
153
154 input.append("HTTP/1.1 ", 9); /* real case seen */
155 hdr_len = headersEnd(input.content(),input.contentSize());
156 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
157 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
158 input.reset();
159 error = Http::scNone;
160
161 input.append("HTTP/1.1 20", 14);
162 hdr_len = headersEnd(input.content(),input.contentSize());
163 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
164 CPPUNIT_ASSERT_EQUAL(error, Http::scNone);
165 input.reset();
166 error = Http::scNone;
167
168 // status line with no status
169 input.append("HTTP/1.1 \n\n", 11);
170 hdr_len = headersEnd(input.content(),input.contentSize());
171 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
172 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
173 input.reset();
174 error = Http::scNone;
175
176 input.append("HTTP/1.1 \n\n", 15);
177 hdr_len = headersEnd(input.content(),input.contentSize());
178 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
179 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
180 input.reset();
181 error = Http::scNone;
182
183 input.append("HTTP/1.1 Okay\n\n", 16); /* real case seen */
184 hdr_len = headersEnd(input.content(),input.contentSize());
185 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
186 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
187 input.reset();
188 error = Http::scNone;
189
190 // status line with nul-byte
191 input.append("HTTP/1.1" "\0" "200 Okay\n\n", 19); /* real case seen */
192 hdr_len = headersEnd(input.content(),input.contentSize());
193 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
194 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
195 input.reset();
196 error = Http::scNone;
197
198 // status line with negative status
199 input.append("HTTP/1.1 -000\n\n", 15); /* real case seen */
200 hdr_len = headersEnd(input.content(),input.contentSize());
201 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
202 CPPUNIT_ASSERT_EQUAL(error, Http::scInvalidHeader);
203 input.reset();
204 error = Http::scNone;
205 }