]> git.ipfire.org Git - thirdparty/squid.git/blame - src/tests/testHttpParser.cc
Renamed squid.h to squid-old.h and config.h to squid.h
[thirdparty/squid.git] / src / tests / testHttpParser.cc
CommitLineData
4c14658e 1#define SQUID_UNIT_TEST 1
f7f3304a 2#include "squid.h"
4c14658e
AJ
3
4#include <cppunit/TestAssert.h>
5
6#include "testHttpParser.h"
7#include "HttpParser.h"
8#include "Mem.h"
9#include "MemBuf.h"
10
11
12CPPUNIT_TEST_SUITE_REGISTRATION( testHttpParser );
13
14void
15testHttpParser::globalSetup()
16{
17 static bool setup_done = false;
18 if (setup_done)
19 return;
26c66627 20
4c14658e
AJ
21 Mem::Init();
22 setup_done = true;
23}
24
25void
26testHttpParser::testParseRequestLine()
27{
28 // ensure MemPools etc exist
29 globalSetup();
30
31 MemBuf input;
32 HttpParser output;
33 input.init();
34
35 // TEST: Do we comply with RFC 1945 section 5.1 ?
36 // TEST: Do we comply with RFC 2616 section 5.1 ?
37
38 // RFC 1945 : HTTP/0.9 simple-request
39 input.append("GET /\r\n", 7);
40 output.reset(input.content(), input.contentSize());
41 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
42 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
43 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
44 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
45 CPPUNIT_ASSERT(memcmp("GET /\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
46 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
47 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
48 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start], (output.req.m_end-output.req.m_start+1)) == 0);
49 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
50 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
51 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start], (output.req.u_end-output.req.u_start+1)) == 0);
52 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
53 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
54 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
55 CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
4c14658e
AJ
56 input.reset();
57
58 // RFC 1945 and 2616 : HTTP/1.0 full-request
59 input.append("GET / HTTP/1.0\r\n", 16);
60 output.reset(input.content(), input.contentSize());
61 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
62 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
63 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
64 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
65 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.0\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
66 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
67 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
68 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
69 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
70 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
71 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
72 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
73 CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
74 CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
75 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
76 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
77 input.reset();
78
79
80 // RFC 2616 : HTTP/1.1 full-request
81 input.append("GET / HTTP/1.1\r\n", 16);
82 output.reset(input.content(), input.contentSize());
83 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
84 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
85 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
86 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
87 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
88 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
89 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
90 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
91 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
92 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
93 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
94 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
95 CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
96 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
97 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
98 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
99 input.reset();
100
101 // RFC 2616 : future version full-request
102 input.append("GET / HTTP/10.12\r\n", 18);
103 //printf("TEST: '%s'\n",input.content());
104 output.reset(input.content(), input.contentSize());
105 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
106 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
107 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
108 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
109 CPPUNIT_ASSERT(memcmp("GET / HTTP/10.12\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
110 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
111 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
112 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
113 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
114 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
115 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
116 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
117 CPPUNIT_ASSERT_EQUAL(15, output.req.v_end);
118 CPPUNIT_ASSERT(memcmp("HTTP/10.12", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
119 CPPUNIT_ASSERT_EQUAL(10, output.req.v_maj);
120 CPPUNIT_ASSERT_EQUAL(12, output.req.v_min);
4c14658e
AJ
121 input.reset();
122
123 // space padded URL
124 input.append("GET / HTTP/1.1\r\n", 21);
125 //printf("TEST: '%s'\n",input.content());
126 output.reset(input.content(), input.contentSize());
127 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
128 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
129 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
130 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
131 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
132 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
133 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
134 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
135 CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
136 CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
137 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
138 CPPUNIT_ASSERT_EQUAL(11, output.req.v_start);
139 CPPUNIT_ASSERT_EQUAL(18, output.req.v_end);
140 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
141 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
142 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
143 input.reset();
144
145 // space padded version
146 // RFC 1945 and 2616 specify version is followed by CRLF. No intermediary bytes.
147 // NP: the terminal whitespace is a special case: invalid for even HTTP/0.9 with no version tag
148 input.append("GET / HTTP/1.1 \n", 16);
149 //printf("TEST: '%s'\n",input.content());
150 output.reset(input.content(), input.contentSize());
151 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
152 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
153 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
154 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
155 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1 \n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
156 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
157 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
158 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
159 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
160 CPPUNIT_ASSERT_EQUAL(13, output.req.u_end);
161 CPPUNIT_ASSERT(memcmp("/ HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
162 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
163 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
164 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
165 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
166 input.reset();
167
168 // whitespace inside URI. (nasty but happens)
169 input.append("GET /fo o/ HTTP/1.1\n", 20);
170 //printf("TEST: '%s'\n",input.content());
171 output.reset(input.content(), input.contentSize());
172 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
173 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
174 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
175 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
176 CPPUNIT_ASSERT(memcmp("GET /fo o/ HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
177 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
178 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
179 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
180 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
181 CPPUNIT_ASSERT_EQUAL(9, output.req.u_end);
182 CPPUNIT_ASSERT(memcmp("/fo o/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
183 CPPUNIT_ASSERT_EQUAL(11, output.req.v_start);
184 CPPUNIT_ASSERT_EQUAL(18, output.req.v_end);
185 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
186 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
187 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
188 input.reset();
189
190 // additional data in buffer
191 input.append("GET / HTTP/1.1\nboo!", 23);
192 //printf("TEST: '%s'\n",input.content());
193 output.reset(input.content(), input.contentSize());
194 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
195 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
196 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
197 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-5, output.req.end);
198 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
199 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
200 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
201 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
202 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
203 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end); // strangeness generated by following RFC
204 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
205 CPPUNIT_ASSERT_EQUAL(10, output.req.v_start);
206 CPPUNIT_ASSERT_EQUAL(17, output.req.v_end);
207 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
208 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
209 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
210 input.reset();
211
212 // alternative EOL sequence: NL-only
213 input.append("GET / HTTP/1.1\n", 15);
214 //printf("TEST: '%s'\n",input.content());
215 output.reset(input.content(), input.contentSize());
216 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
217 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
218 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
219 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
220 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
221 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
222 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
223 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
224 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
225 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
226 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
227 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
228 CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
229 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
230 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
231 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
232 input.reset();
233
234 // alternative EOL sequence: double-NL-only
235 input.append("GET / HTTP/1.1\n\n", 16);
236 //printf("TEST: '%s'\n",input.content());
237 output.reset(input.content(), input.contentSize());
238 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
239 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
240 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
241 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-2, output.req.end);
242 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
243 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
244 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
245 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
246 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
247 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
248 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
249 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
250 CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
251 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
252 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
253 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
254 input.reset();
255
256 // RELAXED alternative EOL sequence: multi-CR-NL
257 input.append("GET / HTTP/1.1\r\r\r\n", 18);
258 //printf("TEST: '%s'\n",input.content());
259 output.reset(input.content(), input.contentSize());
260 Config.onoff.relaxed_header_parser = 1;
261 // Being tolerant we can ignore and elide these apparently benign CR
262 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
263 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
264 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
265 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
266 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\r\r\r\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
267 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
268 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
269 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
270 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
271 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
272 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
273 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
274 CPPUNIT_ASSERT_EQUAL(13, output.req.v_end);
275 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
276 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
277 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
278 input.reset();
279
280 // STRICT alternative EOL sequence: multi-CR-NL
281 input.append("GET / HTTP/1.1\r\r\r\n", 18);
282 //printf("TEST: '%s'\n",input.content());
283 output.reset(input.content(), input.contentSize());
284 // strict mode treats these as several bare-CR in the request line which is explicitly invalid.
285 Config.onoff.relaxed_header_parser = 0;
286 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
287 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
288 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
289 CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
290 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
291 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
292 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
293 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
294 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
295 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
296 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
297 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
298 input.reset();
299
300 // RFC 2616 : . method
301 input.append(". / HTTP/1.1\n", 13);
302 //printf("TEST: '%s'\n",input.content());
303 output.reset(input.content(), input.contentSize());
304 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
305 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
306 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
307 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
308 CPPUNIT_ASSERT(memcmp(". / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
309 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
310 CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
311 CPPUNIT_ASSERT(memcmp(".", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
312 CPPUNIT_ASSERT_EQUAL(2, output.req.u_start);
313 CPPUNIT_ASSERT_EQUAL(2, output.req.u_end);
314 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
315 CPPUNIT_ASSERT_EQUAL(4, output.req.v_start);
316 CPPUNIT_ASSERT_EQUAL(11, output.req.v_end);
317 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
318 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
319 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
320 input.reset();
321
322 // OPTIONS with * URL
323 input.append("OPTIONS * HTTP/1.1\n", 19);
324 //printf("TEST: '%s'\n",input.content());
325 output.reset(input.content(), input.contentSize());
326 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
327 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
328 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
329 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
330 CPPUNIT_ASSERT(memcmp("OPTIONS * HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
331 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
332 CPPUNIT_ASSERT_EQUAL(6, output.req.m_end);
333 CPPUNIT_ASSERT(memcmp("OPTIONS", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
334 CPPUNIT_ASSERT_EQUAL(8, output.req.u_start);
335 CPPUNIT_ASSERT_EQUAL(8, output.req.u_end);
336 CPPUNIT_ASSERT(memcmp("*", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
337 CPPUNIT_ASSERT_EQUAL(10, output.req.v_start);
338 CPPUNIT_ASSERT_EQUAL(17, output.req.v_end);
339 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
340 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
341 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
342 input.reset();
343
344 // unknown method
345 input.append("HELLOWORLD / HTTP/1.1\n", 22);
346 //printf("TEST: '%s'\n",input.content());
347 output.reset(input.content(), input.contentSize());
348 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
349 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
350 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
351 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
352 CPPUNIT_ASSERT(memcmp("HELLOWORLD / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
353 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
354 CPPUNIT_ASSERT_EQUAL(9, output.req.m_end);
355 CPPUNIT_ASSERT(memcmp("HELLOWORLD", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
356 CPPUNIT_ASSERT_EQUAL(11, output.req.u_start);
357 CPPUNIT_ASSERT_EQUAL(11, output.req.u_end);
358 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
359 CPPUNIT_ASSERT_EQUAL(13, output.req.v_start);
360 CPPUNIT_ASSERT_EQUAL(20, output.req.v_end);
361 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
362 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
363 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
364 input.reset();
365
366 // This stage of the parser does not yet accept non-HTTP protocol names.
367 // violations mode treats them as HTTP/0.9 requests!
368 input.append("GET / FOO/1.0\n", 14);
369 //printf("TEST: '%s'\n",input.content());
370 output.reset(input.content(), input.contentSize());
371#if USE_HTTP_VIOLATIONS
372 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
373 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
374 CPPUNIT_ASSERT_EQUAL(12, output.req.u_end);
375 CPPUNIT_ASSERT(memcmp("/ FOO/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
376 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
377 CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
4c14658e
AJ
378#else
379 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
380 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
74f478f8
AJ
381 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
382 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
383 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
384 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e 385#endif
74f478f8
AJ
386 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
387 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
388 CPPUNIT_ASSERT(memcmp("GET / FOO/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
389 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
390 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
391 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
392 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
393 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
394 CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
395 CPPUNIT_ASSERT(memcmp("FOO/1.0", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
4c14658e
AJ
396 input.reset();
397
398 // RELAXED space padded method (in strict mode SP is reserved so invalid as a method byte)
399 input.append(" GET / HTTP/1.1\n", 16);
400 //printf("TEST: '%s'\n",input.content());
401 output.reset(input.content(), input.contentSize());
402 Config.onoff.relaxed_header_parser = 1;
403 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
404 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
405 CPPUNIT_ASSERT_EQUAL(1, output.req.start);
406 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
407 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
408 CPPUNIT_ASSERT_EQUAL(1, output.req.m_start);
409 CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
410 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
411 CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
412 CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
413 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
414 CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
415 CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
416 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
417 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
418 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
419 input.reset();
420
421 // STRICT space padded method (in strict mode SP is reserved so invalid as a method byte)
422 input.append(" GET / HTTP/1.1\n", 16);
423 //printf("TEST: '%s'\n",input.content());
424 output.reset(input.content(), input.contentSize());
425 Config.onoff.relaxed_header_parser = 0;
426 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
427 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
428 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
429 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
430 CPPUNIT_ASSERT(memcmp(" GET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
431 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
432 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
433 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
434 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
435 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
436 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
437 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
438 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
439 input.reset();
440
441 // tab padded method (NP: tab is not SP so treated as any other binary)
442 input.append("\tGET / HTTP/1.1\n", 16);
443 //printf("TEST: '%s'\n",input.content());
444 output.reset(input.content(), input.contentSize());
445 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
446 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
447 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
448 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
449 CPPUNIT_ASSERT(memcmp("\tGET / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
450 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
451 CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
452 CPPUNIT_ASSERT(memcmp("\tGET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
453 CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
454 CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
455 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
456 CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
457 CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
458 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
459 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
460 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
461 input.reset();
462
463 input.append("GET", 3);
464 //printf("TEST: '%s'\n",input.content());
465 output.reset(input.content(), input.contentSize());
466 CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
467 CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
74f478f8
AJ
468 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
469 CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
470 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
471 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
472 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
473 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
474 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
475 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
476 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
477 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
478 input.reset();
479
480 input.append("GET ", 4);
481 //printf("TEST: '%s'\n",input.content());
482 output.reset(input.content(), input.contentSize());
483 CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
484 CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
74f478f8
AJ
485 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
486 CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
487 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
488 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
489 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
490 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
491 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
492 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
493 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
494 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
495 input.reset();
496
497 input.append("GET / HT", 8);
498 //printf("TEST: '%s'\n",input.content());
499 output.reset(input.content(), input.contentSize());
500 CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
501 CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
74f478f8
AJ
502 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
503 CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
504 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
505 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
506 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
507 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
508 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
509 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
510 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
511 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
512 input.reset();
513
514 input.append("GET / HTTP/1.1", 14);
515 //printf("TEST: '%s'\n",input.content());
516 output.reset(input.content(), input.contentSize());
517 CPPUNIT_ASSERT_EQUAL(0, HttpParserParseReqLine(&output));
518 CPPUNIT_ASSERT_EQUAL(HTTP_STATUS_NONE, output.request_parse_status);
74f478f8
AJ
519 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
520 CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
521 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
522 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
523 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
524 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
525 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
526 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
527 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
528 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
529 input.reset();
530
531 // method-only
532 input.append("A\n", 2);
533 //printf("TEST: '%s'\n",input.content());
534 output.reset(input.content(), input.contentSize());
535 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
536 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
537 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
538 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
539 CPPUNIT_ASSERT(memcmp("A\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
540 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
541 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
542 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
543 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
544 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
545 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
546 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
547 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
548 input.reset();
549
550 // no method (but in a form which is ambiguous with HTTP/0.9 simple-request)
551 input.append("/ HTTP/1.0\n", 11);
552 //printf("TEST: '%s'\n",input.content());
553 output.reset(input.content(), input.contentSize());
554 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
555 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
556 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
557 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
558 CPPUNIT_ASSERT(memcmp("/ HTTP/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
559 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
560 CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
561 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
562 CPPUNIT_ASSERT_EQUAL(2, output.req.u_start);
563 CPPUNIT_ASSERT_EQUAL(9, output.req.u_end);
564 CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
565 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
566 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
567 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
568 CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
4c14658e
AJ
569 input.reset();
570
571 // RELAXED no method (an invalid format)
572 input.append(" / HTTP/1.0\n", 12);
573 //printf("TEST: '%s'\n",input.content());
574 output.reset(input.content(), input.contentSize());
575 // When tolerantly ignoring SP prefix this case becomes ambiguous with HTTP/0.9 simple-request)
576 Config.onoff.relaxed_header_parser = 1;
577 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
578 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
579 CPPUNIT_ASSERT_EQUAL(1, output.req.start);
580 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
581 CPPUNIT_ASSERT(memcmp("/ HTTP/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
582 CPPUNIT_ASSERT_EQUAL(1, output.req.m_start);
583 CPPUNIT_ASSERT_EQUAL(1, output.req.m_end);
584 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
585 CPPUNIT_ASSERT_EQUAL(3, output.req.u_start);
586 CPPUNIT_ASSERT_EQUAL(10, output.req.u_end);
587 CPPUNIT_ASSERT(memcmp("HTTP/1.0", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
588 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
589 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
590 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
591 CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
4c14658e
AJ
592 input.reset();
593
594 // STRICT no method (an invalid format)
595 input.append(" / HTTP/1.0\n", 12);
596 //printf("TEST: '%s'\n",input.content());
597 output.reset(input.content(), input.contentSize());
598 // When tolerantly ignoring SP prefix this case becomes ambiguous with HTTP/0.9 simple-request)
599 Config.onoff.relaxed_header_parser = 0;
600 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
601 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
602 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
603 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
604 CPPUNIT_ASSERT(memcmp(" / HTTP/1.0\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
605 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
606 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
607 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
608 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
609 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
610 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
611 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
612 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
613 input.reset();
614
615 // binary code in method (strange but ...)
616 input.append("GET\x0B / HTTP/1.1\n", 16);
74f478f8 617 //printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
4c14658e
AJ
618 output.reset(input.content(), input.contentSize());
619 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
620 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
621 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
622 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
623 CPPUNIT_ASSERT(memcmp("GET\x0B / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
624 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
625 CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
626 CPPUNIT_ASSERT(memcmp("GET\x0B", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
627 CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
628 CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
629 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
630 CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
631 CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
632 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
633 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
634 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
635 input.reset();
636
637 // CR in method
638 // RFC 2616 sec 5.1 prohibits CR other than in terminator.
639 input.append("GET\r / HTTP/1.1\r\n", 16);
640 //printf("TEST: '%s'\n",input.content());
641 output.reset(input.content(), input.contentSize());
642 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
643 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
644 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
645 CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
646 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
647 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
648 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
649 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
650 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
651 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
652 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
653 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
654 input.reset();
655
656 // binary code NUL! in method (strange but ...)
657 input.append("GET\0 / HTTP/1.1\n", 16);
74f478f8 658 //printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
4c14658e
AJ
659 output.reset(input.content(), input.contentSize());
660 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
661 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
662 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
663 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
664 CPPUNIT_ASSERT(memcmp("GET\0 / HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
665 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
666 CPPUNIT_ASSERT_EQUAL(3, output.req.m_end);
667 CPPUNIT_ASSERT(memcmp("GET\0", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
668 CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
669 CPPUNIT_ASSERT_EQUAL(5, output.req.u_end);
670 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
671 CPPUNIT_ASSERT_EQUAL(7, output.req.v_start);
672 CPPUNIT_ASSERT_EQUAL(14, output.req.v_end);
673 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
674 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
675 CPPUNIT_ASSERT_EQUAL(1, output.req.v_min);
4c14658e
AJ
676 input.reset();
677
678 // no URL (grammer otherwise correct)
679 input.append("GET HTTP/1.1\n", 14);
680 //printf("TEST: '%s'\n",input.content());
681 output.reset(input.content(), input.contentSize());
682 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
683 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
684 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
685 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
686 CPPUNIT_ASSERT(memcmp("GET HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
687 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
688 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
689 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
690 CPPUNIT_ASSERT_EQUAL(5, output.req.u_start);
691 CPPUNIT_ASSERT_EQUAL(12, output.req.u_end);
692 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
693 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
694 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
695 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
696 CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
4c14658e
AJ
697 input.reset();
698
699 // no URL (grammer invalid, ambiguous with RFC 1945 HTTP/0.9 simple-request)
700 input.append("GET HTTP/1.1\n", 13);
701 //printf("TEST: '%s'\n",input.content());
702 output.reset(input.content(), input.contentSize());
703 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output));
704 CPPUNIT_ASSERT_EQUAL(HTTP_OK, output.request_parse_status);
74f478f8
AJ
705 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
706 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
707 CPPUNIT_ASSERT(memcmp("GET HTTP/1.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
708 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
709 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
710 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
711 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
712 CPPUNIT_ASSERT_EQUAL(11, output.req.u_end);
713 CPPUNIT_ASSERT(memcmp("HTTP/1.1", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
714 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
715 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
716 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
717 CPPUNIT_ASSERT_EQUAL(9, output.req.v_min);
4c14658e
AJ
718 input.reset();
719
720 // no version
721 input.append("GET / HTTP/\n", 12);
722 //printf("TEST: '%s'\n",input.content());
723 output.reset(input.content(), input.contentSize());
724 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
725 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
74f478f8
AJ
726 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
727 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
728 CPPUNIT_ASSERT(memcmp("GET / HTTP/\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
729 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
730 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
731 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
732 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
733 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
734 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
735 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
736 CPPUNIT_ASSERT_EQUAL(10, output.req.v_end);
737 CPPUNIT_ASSERT(memcmp("HTTP/", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
738 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
739 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
740 input.reset();
741
742 // no major version
743 input.append("GET / HTTP/.1\n", 14);
744 //printf("TEST: '%s'\n",input.content());
745 output.reset(input.content(), input.contentSize());
746 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
747 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
74f478f8
AJ
748 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
749 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
750 CPPUNIT_ASSERT(memcmp("GET / HTTP/.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
751 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
752 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
753 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
754 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
755 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
756 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
757 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
758 CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
759 CPPUNIT_ASSERT(memcmp("HTTP/.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
760 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
761 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
762 input.reset();
763
764 // no version dot
765 input.append("GET / HTTP/11\n", 14);
766 //printf("TEST: '%s'\n",input.content());
767 output.reset(input.content(), input.contentSize());
768 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
769 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
74f478f8
AJ
770 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
771 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
772 CPPUNIT_ASSERT(memcmp("GET / HTTP/11\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
773 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
774 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
775 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
776 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
777 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
778 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
779 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
780 CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
781 CPPUNIT_ASSERT(memcmp("HTTP/11", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
782 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
783 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
784 input.reset();
785
786 // negative major version (bug 3062)
787 input.append("GET / HTTP/-999999.1\n", 21);
788 //printf("TEST: '%s'\n",input.content());
789 output.reset(input.content(), input.contentSize());
790 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
791 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
74f478f8
AJ
792 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
793 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
794 CPPUNIT_ASSERT(memcmp("GET / HTTP/-999999.1\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
795 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
796 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
797 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
798 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
799 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
800 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
801 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
802 CPPUNIT_ASSERT_EQUAL(19, output.req.v_end);
803 CPPUNIT_ASSERT(memcmp("HTTP/-999999.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
804 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
805 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
806 input.reset();
807
808 // no minor version
809 input.append("GET / HTTP/1.\n", 14);
810 //printf("TEST: '%s'\n",input.content());
811 output.reset(input.content(), input.contentSize());
812 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
813 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
74f478f8
AJ
814 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
815 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
816 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
817 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
818 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
819 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
820 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
821 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
822 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
823 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
824 CPPUNIT_ASSERT_EQUAL(12, output.req.v_end);
825 CPPUNIT_ASSERT(memcmp("HTTP/1.", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
826 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
827 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
828 input.reset();
829
830 // negative major version (bug 3062 corollary)
831 input.append("GET / HTTP/1.-999999\n", 21);
832 //printf("TEST: '%s'\n",input.content());
833 output.reset(input.content(), input.contentSize());
834 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
835 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED, output.request_parse_status);
74f478f8
AJ
836 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
837 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
838 CPPUNIT_ASSERT(memcmp("GET / HTTP/1.-999999\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
839 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
840 CPPUNIT_ASSERT_EQUAL(2, output.req.m_end);
841 CPPUNIT_ASSERT(memcmp("GET", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
842 CPPUNIT_ASSERT_EQUAL(4, output.req.u_start);
843 CPPUNIT_ASSERT_EQUAL(4, output.req.u_end);
844 CPPUNIT_ASSERT(memcmp("/", &output.buf[output.req.u_start],(output.req.u_end-output.req.u_start+1)) == 0);
845 CPPUNIT_ASSERT_EQUAL(6, output.req.v_start);
846 CPPUNIT_ASSERT_EQUAL(19, output.req.v_end);
847 CPPUNIT_ASSERT(memcmp("HTTP/1.-999999", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)) == 0);
848 CPPUNIT_ASSERT_EQUAL(1, output.req.v_maj);
849 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
850 input.reset();
851
852 // binary line
853 input.append("\xB\xC\xE\xF\n", 5);
854 //printf("TEST: binary-line\n");
855 output.reset(input.content(), input.contentSize());
856 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
857 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
858 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
859 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
860 CPPUNIT_ASSERT(memcmp("\xB\xC\xE\xF\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
861 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
862 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
863 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
864 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
865 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
866 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
867 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
868 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
869 input.reset();
870
871 // mixed whitespace line
872 // We accept non-space binary bytes for method so first \t shows up as that
873 // but remaining space and tabs are skipped searching for URI-start
874 input.append("\t \t \t\n", 6);
875 //printf("TEST: mixed whitespace\n");
876 output.reset(input.content(), input.contentSize());
877 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
878 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
879 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
880 CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
881 CPPUNIT_ASSERT(memcmp("\t \t \t\n", &output.buf[output.req.start],(output.req.end-output.req.start+1)) == 0);
882 CPPUNIT_ASSERT_EQUAL(0, output.req.m_start);
883 CPPUNIT_ASSERT_EQUAL(0, output.req.m_end);
884 CPPUNIT_ASSERT(memcmp("\t", &output.buf[output.req.m_start],(output.req.m_end-output.req.m_start+1)) == 0);
885 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
886 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
887 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
888 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
889 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
890 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
891 input.reset();
892
893 // mixed whitespace line with CR middle
894 // CR aborts on sight, so even initial \t method is not marked as above
895 // (not when parsing clean with whole line available anyway)
896 input.append("\t \r \n", 6);
897 //printf("TEST: mixed whitespace with CR\n");
898 output.reset(input.content(), input.contentSize());
899 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output));
900 CPPUNIT_ASSERT_EQUAL(HTTP_BAD_REQUEST, output.request_parse_status);
74f478f8
AJ
901 CPPUNIT_ASSERT_EQUAL(0, output.req.start);
902 CPPUNIT_ASSERT_EQUAL(-1, output.req.end);
903 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_start);
904 CPPUNIT_ASSERT_EQUAL(-1, output.req.m_end);
905 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_start);
906 CPPUNIT_ASSERT_EQUAL(-1, output.req.u_end);
907 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_start);
908 CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
909 CPPUNIT_ASSERT_EQUAL(0, output.req.v_maj);
910 CPPUNIT_ASSERT_EQUAL(0, output.req.v_min);
4c14658e
AJ
911 input.reset();
912}