n_http_req regression: valid requests parse, and the smuggling / malformed / oversized cases are rejected.
n_http_req regression: valid requests parse, and the smuggling / malformed / oversized cases are rejected.
#include <string.h>
}
#define WANT(expr, want, msg) \
do { \
if ((expr) != (want)) { \
n_log(LOG_ERR, "FAIL: %s", (msg)); \
failures++; \
} \
} while (0)
"valid GET should parse");
if (strcmp(r.
path,
"/v1/me?x=1") != 0) {
}
WANT(
parse(
"POST /v1/send HTTP/1.1\r\nContent-Length: 5\r\n"
"Authorization: Bearer tok\r\n\r\nhello",
&r),
}
}
"unsupported method rejected");
"non-origin-form target rejected");
"fragment in target rejected");
"unsupported version rejected");
WANT(
parse(
"POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n", &r),
WANT(
parse(
"POST / HTTP/1.1\r\nContent-Length: 1\r\nContent-Length: 2\r\n"
"\r\n",
&r),
WANT(
parse(
"POST / HTTP/1.1\r\nContent-Length: abc\r\n\r\n", &r),
"partial head is INCOMPLETE");
"empty buffer is INCOMPLETE");
"buffer shorter than CRLFCRLF is INCOMPLETE");
return 1;
}
return 0;
}
static n_http_req_status parse(const char *s, n_http_request *out)
#define WANT(expr, want, msg)
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
#define LOG_ERR
error conditions
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL ).
#define LOG_NOTICE
normal but significant condition
n_http_req_status n_http_request_parse(const char *buf, size_t len, n_http_request *out)
parse an HTTP/1.1 request head from [buf, buf+len)
Pure, strict, bounded parser for an HTTP/1.1 request head.
n_http_req_status
Result of n_http_request_parse.
@ N_HTTP_REQ_INCOMPLETE
no CRLFCRLF yet, still under the cap
@ N_HTTP_REQ_ERROR
malformed / oversized / unsupported
@ N_HTTP_REQ_OK
a complete, valid head was parsed
char authorization[256u+1]