{
input.append("GET / HTTP/1.0\r\n", 16);
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
{
input.append("GET / HTTP/1.1\r\n", 16);
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
}
// RFC 2616 : future version full-request
- { input.append("GET / HTTP/1.2\r\n", 16);
+ {
+ input.append("GET / HTTP/1.2\r\n", 16);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
// RFC 2616 : future version full-request
{
- // XXX: IETF HTTPbis WG has made this two-digits format invalid.
+ // IETF HTTPbis WG has made this two-digits format invalid.
+ // it gets treated same as HTTP/0.9 for now
input.append("GET / HTTP/10.12\r\n", 18);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(true, output.parseRequest()); // BUG: declares true
CPPUNIT_ASSERT_EQUAL(true, output.isDone());
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
input.append("GET / HTTP/1.1\r\n", 21);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
input.append("GET /fo o/ HTTP/1.1\n", 20);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
input.append("GET / HTTP/1.1\nboo!", 23);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-5, output.req.end);
input.append("GET / HTTP/1.1\n", 15);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
output.reset(input.content(), input.contentSize());
Config.onoff.relaxed_header_parser = 1;
// Being tolerant we can ignore and elide these apparently benign CR
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
input.reset();
+ Config.onoff.relaxed_header_parser = 0;
}
// STRICT alternative EOL sequence: multi-CR-NL
input.append(". / HTTP/1.1\n", 13);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
input.append("OPTIONS * HTTP/1.1\n", 19);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
input.append("HELLOWORLD / HTTP/1.1\n", 22);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
Config.onoff.relaxed_header_parser = 1;
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(1, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
CPPUNIT_ASSERT_EQUAL(0, memcmp("HTTP/1.1", &output.buf[output.req.v_start],(output.req.v_end-output.req.v_start+1)));
CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,1,1), output.msgProtocol_);
input.reset();
+ Config.onoff.relaxed_header_parser = 0;
}
// STRICT space padded method (in strict mode SP is reserved so invalid as a method byte)
CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_NONE,0,0), output.msgProtocol_);
input.reset();
- Config.onoff.relaxed_header_parser = 1;
}
// tab padded method (NP: tab is not SP so treated as any other binary)
input.append("\tGET / HTTP/1.1\n", 16);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
input.append(" / HTTP/1.0\n", 12);
//printf("TEST: '%s'\n",input.content());
output.reset(input.content(), input.contentSize());
- // When tolerantly ignoring SP prefix this case becomes ambiguous with HTTP/0.9 simple-request)
+ // BUG: When tolerantly ignoring SP prefix this case becomes ambiguous with HTTP/0.9 simple-request)
Config.onoff.relaxed_header_parser = 1;
CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+// CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_NEW, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(1, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
CPPUNIT_ASSERT_EQUAL(-1, output.req.v_end);
CPPUNIT_ASSERT_EQUAL(AnyP::ProtocolVersion(AnyP::PROTO_HTTP,0,9), output.msgProtocol_);
input.reset();
+ Config.onoff.relaxed_header_parser = 0;
}
// STRICT no method (an invalid format)
input.append("GET\x0B / HTTP/1.1\n", 16);
//printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
input.append("GET\0 / HTTP/1.1\n", 16);
//printf("TEST: %d-%d/%d '%.*s'\n", output.req.start, output.req.end, input.contentSize(), 16, input.content());
output.reset(input.content(), input.contentSize());
- CPPUNIT_ASSERT_EQUAL(true, output.parseRequest());
- CPPUNIT_ASSERT_EQUAL(true, output.isDone());
+ CPPUNIT_ASSERT_EQUAL(false, output.parseRequest());
+ CPPUNIT_ASSERT_EQUAL(false, output.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, output.completedState_);
CPPUNIT_ASSERT_EQUAL(Http::scOkay, output.request_parse_status);
CPPUNIT_ASSERT_EQUAL(0, output.req.start);
CPPUNIT_ASSERT_EQUAL((int)input.contentSize()-1, output.req.end);
int garbageEnd = mb.contentSize();
mb.append("GET http://example.com/ HTTP/1.1\r\n", 34);
int reqLineEnd = mb.contentSize();
- mb.append("\n", 1);
+ mb.append("Host: example.com\r\n\r\n.", 22);
Http::Http1Parser hp(mb.content(), 0);
// only relaxed parser accepts the garbage whitespace
Config.onoff.relaxed_header_parser = 1;
- for (; hp.bufsiz < mb.contentSize(); ++hp.bufsiz) {
+ for (; hp.bufsiz <= mb.contentSize(); ++hp.bufsiz) {
bool parseResult = hp.parseRequest();
#if WHEN_TEST_DEBUG_IS_NEEDED
CPPUNIT_ASSERT_EQUAL(garbageEnd, (int)hp.parseOffset_);
CPPUNIT_ASSERT_EQUAL(false, parseResult);
CPPUNIT_ASSERT_EQUAL(false, hp.isDone());
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_NEW, hp.completedState_);
+ continue;
+ }
+
+ // before request headers entirely found, parse announces incomplete
+ if (hp.bufsiz < mb.contentSize()-1) {
+ CPPUNIT_ASSERT_EQUAL(reqLineEnd, (int)hp.parseOffset_);
+ CPPUNIT_ASSERT_EQUAL(false, parseResult);
+ CPPUNIT_ASSERT_EQUAL(false, hp.isDone());
+ // TODO: add all the other usual tests for request-line details
+ CPPUNIT_ASSERT_EQUAL((uint8_t)HTTP_PARSE_FIRST, hp.completedState_);
continue;
}