1 #define SQUID_UNIT_TEST 1
4 #include <cppunit/TestAssert.h>
6 #include "testHttpParser.h"
7 #include "HttpParser.h"
12 CPPUNIT_TEST_SUITE_REGISTRATION( testHttpParser
);
15 testHttpParser::globalSetup()
17 static bool setup_done
= false;
26 testHttpParser::testParseRequestLine()
28 // ensure MemPools etc exist
35 // TEST: Do we comply with RFC 1945 section 5.1 ?
36 // TEST: Do we comply with RFC 2616 section 5.1 ?
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
379 CPPUNIT_ASSERT_EQUAL(-1, HttpParserParseReqLine(&output
));
380 CPPUNIT_ASSERT_EQUAL(HTTP_HTTP_VERSION_NOT_SUPPORTED
, output
.request_parse_status
);
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
);
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);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
615 // binary code in method (strange but ...)
616 input
.append("GET\x0B / HTTP/1.1\n", 16);
617 //printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
618 output
.reset(input
.content(), input
.contentSize());
619 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output
));
620 CPPUNIT_ASSERT_EQUAL(HTTP_OK
, output
.request_parse_status
);
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
);
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
);
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
);
656 // binary code NUL! in method (strange but ...)
657 input
.append("GET\0 / HTTP/1.1\n", 16);
658 //printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
659 output
.reset(input
.content(), input
.contentSize());
660 CPPUNIT_ASSERT_EQUAL(1, HttpParserParseReqLine(&output
));
661 CPPUNIT_ASSERT_EQUAL(HTTP_OK
, output
.request_parse_status
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);