24db85c5ab
Content-Length is not necesserily the last header, more headers can follow it. Closes: #41072
76 lines
2.1 KiB
C
76 lines
2.1 KiB
C
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
|
|
void log_message(const char *msg, ...) {
|
|
va_list args;
|
|
va_start(args, msg);
|
|
vfprintf(stderr, msg, args);
|
|
fprintf(stderr, "\n");
|
|
fflush(stderr);
|
|
}
|
|
|
|
#include "url.c" /* yes, include the source file */
|
|
|
|
static int test_parse_content_length(const char *headers, unsigned long expected, int shouldfail) {
|
|
int err;
|
|
unsigned long val;
|
|
err = parse_content_length(headers, &val);
|
|
if (err < 0 && !shouldfail) {
|
|
log_message("%s: unexpectedly failed on input '%s'", __func__, headers);
|
|
return 2;
|
|
}
|
|
if (err == 0 && shouldfail) {
|
|
log_message("%s: unexpectedly passed on invalid input '%s'", __func__, headers);
|
|
return 3;
|
|
}
|
|
if (!shouldfail && val != expected) {
|
|
log_message("%s: expected %lu, got %lu on input '%s'",
|
|
__func__, expected, val, headers);
|
|
return 5;
|
|
}
|
|
if (!shouldfail && val == expected) {
|
|
log_message("%s: OK: '%s'", __func__, headers);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
|
|
|
|
int main(int argc, char **argv) {
|
|
int i, err = 0;
|
|
const char *invalid_inputs[] = {
|
|
"", /* empty */
|
|
"Abyrvalg: foobar", /* no Content-Length: */
|
|
"Content-Length: xyz", /* no digits */
|
|
"Content-Length: 12xyz", /* invalid characters */
|
|
"Content-Length: 12 34", /* stray symbols */
|
|
"Content-Length: 123456789012345678901234567890", /* too big */
|
|
};
|
|
const char *valid_inputs[] = {
|
|
"Content-Length: 1234",
|
|
"Content-Length: 1234",
|
|
"Content-Length: 1234 ",
|
|
"Content-Length: 1234 ",
|
|
"Content-Length: 1234 \r\n\r\n",
|
|
"Content-Length: 1234\r\n"
|
|
"Last-Modified: Sun, 12 Sep 2021 22:31:46 GMT\r\n"
|
|
"Connection: close\r\n"
|
|
"Etag: \"613e7fd2-3849a800\"\r\n"
|
|
"Accept-Ranges: bytes\r\n\r\n"
|
|
};
|
|
|
|
for (i = 0; i < ARRAY_SIZE(invalid_inputs); i++) {
|
|
err += test_parse_content_length(invalid_inputs[i], 0,
|
|
/* shouldfail = */ 1);
|
|
}
|
|
for (i = 0; i < ARRAY_SIZE(valid_inputs); i++) {
|
|
err += test_parse_content_length(valid_inputs[i], 1234,
|
|
/* shouldfail = */ 0);
|
|
}
|
|
return err;
|
|
}
|
|
|
|
/* compile command:
|
|
gcc -O2 -g -flto -o test_parse_content_length.c test_parse_content_length.c
|
|
*/
|