static const struct http_request_valid_parse_test
valid_request_parse_tests[] = {
- { .request =
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Host: example.com\r\n"
"\r\n",
.target_raw = "/",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ORIGIN,
- .url = { .host = { .name = "example.com" } }
+ .url = {
+ .host = { .name = "example.com" },
+ },
},
.version_major = 1, .version_minor = 1,
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Host: \r\n"
"\r\n",
.target_raw = "/",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ORIGIN,
- .url = { .host = { .name = "example.org" } }
+ .url = {
+ .host = { .name = "example.org" },
+ },
},
.version_major = 1, .version_minor = 1,
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.0\r\n"
"\r\n",
.method = "GET",
.target_raw = "/",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ORIGIN,
- .url = { .host = { .name = "example.org" } }
+ .url = {
+ .host = { .name = "example.org" },
+ },
},
.version_major = 1, .version_minor = 0,
.connection_close = TRUE,
- },{ .request =
+ },
+ {
+ .request =
"OPTIONS * HTTP/1.1\r\n"
"Host: example.com\r\n"
"Connection: Keep-Alive\r\n"
.target_raw = "*",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ASTERISK,
- .url = { .host = { .name = "example.com" } }
+ .url = {
+ .host = { .name = "example.com" },
+ },
},
.version_major = 1, .version_minor = 1,
- },{ .request =
+ },
+ {
+ .request =
"OPTIONS * HTTP/1.0\r\n"
"Connection: Keep-Alive\r\n"
"\r\n",
.target_raw = "*",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ASTERISK,
- .url = { .host = { .name = "example.org" } }
+ .url = {
+ .host = { .name = "example.org" },
+ },
},
.version_major = 1, .version_minor = 0,
- },{ .request =
+ },
+ {
+ .request =
"CONNECT example.com:443 HTTP/1.2\r\n"
"Host: example.com:443\r\n"
"\r\n",
.format = HTTP_REQUEST_TARGET_FORMAT_AUTHORITY,
.url = {
.host = { .name = "example.com" },
- .port = 443 }
+ .port = 443,
+ }
},
.version_major = 1, .version_minor = 2,
- },{ .request =
+ },
+ {
+ .request =
"GET https://www.example.com:443 HTTP/1.1\r\n"
"Host: www.example.com:80\r\n"
"\r\n",
.url = {
.host = { .name = "www.example.com" },
.port = 443,
- .have_ssl = TRUE
- }
+ .have_ssl = TRUE,
+ },
},
.version_major = 1, .version_minor = 1,
- },{ .request =
+ },
+ {
+ .request =
"POST http://api.example.com:8080/commit?user=dirk HTTP/1.1\r\n"
"Host: api.example.com:8080\r\n"
"Content-Length: 10\r\n"
.format = HTTP_REQUEST_TARGET_FORMAT_ABSOLUTE,
.url = {
.host = { .name = "api.example.com" },
- .port = 8080 }
+ .port = 8080,
+ },
},
.version_major = 1, .version_minor = 1,
- .payload = "Content!\r\n"
- },{ .request =
+ .payload = "Content!\r\n",
+ },
+ {
+ .request =
"GET http://www.example.com/index.php?seq=1 HTTP/1.1\r\n"
"Host: www.example.com\r\n"
"Connection: close\r\n"
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ABSOLUTE,
.url = {
- .host = { .name = "www.example.com" }}
+ .host = { .name = "www.example.com" },
+ },
},
.version_major = 1, .version_minor = 1,
- .connection_close = TRUE
- },{ .request =
+ .connection_close = TRUE,
+ },
+ {
+ .request =
"GET http://www.example.com/index.html HTTP/1.0\r\n"
"Host: www.example.com\r\n"
"\r\n",
.target_raw = "http://www.example.com/index.html",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ABSOLUTE,
- .url = { .host = { .name = "www.example.com" } }
+ .url = {
+ .host = { .name = "www.example.com" },
+ },
},
.version_major = 1, .version_minor = 0,
- .connection_close = TRUE
- },{ .request =
+ .connection_close = TRUE,
+ },
+ {
+ .request =
"GET http://www.example.com/index.html HTTP/1.1\r\n"
"Host: www.example.com\r\n"
"Expect: 100-continue\r\n"
.target_raw = "http://www.example.com/index.html",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ABSOLUTE,
- .url = { .host = { .name = "www.example.com" } }
+ .url = {
+ .host = { .name = "www.example.com" },
+ },
},
.version_major = 1, .version_minor = 1,
.expect_100_continue = TRUE
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Date: Mon, 09 Kul 2018 02:24:29 GMT\r\n"
"Host: example.com\r\n"
.target_raw = "/",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ORIGIN,
- .url = { .host = { .name = "example.com" } }
+ .url = {
+ .host = { .name = "example.com" },
+ },
},
.version_major = 1, .version_minor = 1,
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Date: Sun, 07 Oct 2012 19:52:03 GMT\r\n"
"Host: example.com\r\n"
.target_raw = "/",
.target = {
.format = HTTP_REQUEST_TARGET_FORMAT_ORIGIN,
- .url = { .host = { .name = "example.com" } }
+ .url = {
+ .host = { .name = "example.com" },
+ },
},
.version_major = 1, .version_minor = 1,
- }
+ },
};
static const unsigned int valid_request_parse_test_count =
test = &valid_request_parse_tests[i];
request_text = test->request;
request_text_len = strlen(request_text);
- input = test_istream_create_data(request_text, request_text_len);
+ input = test_istream_create_data(request_text,
+ request_text_len);
parser = http_request_parser_init(input, &default_base_url,
NULL, test->flags);
payload = NULL;
for (pos = 0; pos <= request_text_len && ret == 0; pos++) {
test_istream_set_size(input, pos);
- ret = http_request_parse_next
- (parser, NULL, &request_parsed, &error_code, &error);
+ ret = http_request_parse_next(parser, NULL,
+ &request_parsed,
+ &error_code, &error);
}
test_istream_set_size(input, request_text_len);
i_stream_unref(&input);
buffer_set_used_size(payload_buffer, 0);
output = o_stream_create_buffer(payload_buffer);
test_out("payload receive",
- o_stream_send_istream(output, request.payload) == OSTREAM_SEND_ISTREAM_RESULT_FINISHED);
+ o_stream_send_istream(
+ output, request.payload) ==
+ OSTREAM_SEND_ISTREAM_RESULT_FINISHED);
o_stream_destroy(&output);
payload = str_c(payload_buffer);
} else {
payload = NULL;
}
- ret = http_request_parse_next
- (parser, NULL, &request_parsed, &error_code, &error);
+ ret = http_request_parse_next(
+ parser, NULL, &request_parsed,
+ &error_code, &error);
}
test_out_reason("parse success", ret == 0, error);
if (ret == 0) {
/* verify last request only */
if (request.method == NULL || test->method == NULL) {
- test_out(t_strdup_printf("request->method = %s", request.method),
- request.method == test->method);
+ test_out(t_strdup_printf("request->method = %s",
+ request.method),
+ request.method == test->method);
} else {
- test_out(t_strdup_printf("request->method = %s", request.method),
- strcmp(request.method, test->method) == 0);
+ test_out(t_strdup_printf("request->method = %s",
+ request.method),
+ strcmp(request.method, test->method) == 0);
}
if (request.target_raw == NULL || test->target_raw == NULL) {
- test_out(t_strdup_printf
- ("request->target_raw = %s", request.target_raw),
- request.target_raw == test->target_raw);
+ test_out(t_strdup_printf("request->target_raw = %s",
+ request.target_raw),
+ request.target_raw == test->target_raw);
} else {
- test_out(t_strdup_printf
- ("request->target_raw = %s", request.target_raw),
- strcmp(request.target_raw, test->target_raw) == 0);
+ test_out(t_strdup_printf("request->target_raw = %s",
+ request.target_raw),
+ strcmp(request.target_raw, test->target_raw) == 0);
}
if (request.target.url == NULL) {
test_out("request->target.url = (null)",
- test->target.url.host.name == NULL && test->target.url.port == 0);
+ (test->target.url.host.name == NULL &&
+ test->target.url.port == 0));
} else {
if (request.target.url->host.name == NULL ||
- test->target.url.host.name == NULL) {
+ test->target.url.host.name == NULL) {
test_out(t_strdup_printf("request->target.url->host.name = %s",
- request.target.url->host.name),
- request.target.url->host.name == test->target.url.host.name);
+ request.target.url->host.name),
+ request.target.url->host.name == test->target.url.host.name);
} else {
test_out(t_strdup_printf("request->target.url->host.name = %s",
- request.target.url->host.name),
- strcmp(request.target.url->host.name,
+ request.target.url->host.name),
+ strcmp(request.target.url->host.name,
test->target.url.host.name) == 0);
}
if (request.target.url->port == 0) {
test_out("request->target.url->port = (unspecified)",
- request.target.url->port == test->target.url.port);
+ request.target.url->port == test->target.url.port);
} else {
- test_out(t_strdup_printf
- ("request->target.url->port = %u", request.target.url->port),
- request.target.url->port == test->target.url.port);
+ test_out(t_strdup_printf("request->target.url->port = %u",
+ request.target.url->port),
+ request.target.url->port == test->target.url.port);
}
test_out(t_strdup_printf("request->target.url->have_ssl = %s",
- (request.target.url->have_ssl ? "yes" : "no")),
- request.target.url->have_ssl == test->target.url.have_ssl);
+ (request.target.url->have_ssl ? "yes" : "no")),
+ request.target.url->have_ssl == test->target.url.have_ssl);
}
test_out(t_strdup_printf("request->target_format = %s",
- _request_target_format(request.target.format)),
- request.target.format == test->target.format);
+ _request_target_format(request.target.format)),
+ request.target.format == test->target.format);
test_out(t_strdup_printf("request->version = %u.%u",
- request.version_major, request.version_minor),
- request.version_major == test->version_major &&
- request.version_minor == test->version_minor);
+ request.version_major, request.version_minor),
+ (request.version_major == test->version_major &&
+ request.version_minor == test->version_minor));
test_out(t_strdup_printf("request->connection_close = %s",
- (request.connection_close ? "yes" : "no")),
- request.connection_close == test->connection_close);
+ (request.connection_close ? "yes" : "no")),
+ request.connection_close == test->connection_close);
test_out(t_strdup_printf("request->expect_100_continue = %s",
- (request.expect_100_continue ? "yes" : "no")),
- request.expect_100_continue == test->expect_100_continue);
+ (request.expect_100_continue ? "yes" : "no")),
+ request.expect_100_continue == test->expect_100_continue);
if (payload == NULL || test->payload == NULL) {
test_out(t_strdup_printf("request->payload = %s",
- str_sanitize(payload, 80)),
- payload == test->payload);
+ str_sanitize(payload, 80)),
+ payload == test->payload);
} else {
test_out(t_strdup_printf("request->payload = %s",
- str_sanitize(payload, 80)),
- strcmp(payload, test->payload) == 0);
+ str_sanitize(payload, 80)),
+ strcmp(payload, test->payload) == 0);
}
}
test_end();
static const struct http_request_invalid_parse_test
invalid_request_parse_tests[] = {
- { .request =
+ {
+ .request =
"GET: / HTTP/1.1\r\n"
"Host: example.com\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET % HTTP/1.1\r\n"
"Host: example.com\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET /frop\" HTTP/1.1\r\n"
"Host: example.com\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET / HTCPCP/1.0\r\n"
"Host: example.com\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.0.1\r\n"
"Host: example.com\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Host: \"example.com\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Host: www.example.com\r\n"
"Transfer-Encoding: gzip\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Host: www.example.com\r\n"
"Expect: payment\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_EXPECTATION_FAILED
- },{ .request =
+ },
+ {
+ .request =
"GET / HTTP/1.1\r\n"
"Host: www.example.com\r\n"
"Transfer-Encoding: cuneiform, chunked\r\n"
"\r\n",
.error_code = HTTP_REQUEST_PARSE_ERROR_NOT_IMPLEMENTED
- },{
+ },
+ {
.request =
"GET / HTTP/1.1\r\n"
"Date: Mon, 09 Kul 2018 02:24:29 GMT\r\n"
"\r\n",
.flags = HTTP_REQUEST_PARSE_FLAG_STRICT,
.error_code = HTTP_REQUEST_PARSE_ERROR_BROKEN_REQUEST
- },{
+ },
+ {
.request =
"GET / HTTP/1.1\r\n"
"Date: Sun, 07 Oct 2012 19:52:03 GMT\r\n"
for (i = 0; i < invalid_request_parse_test_count; i++) T_BEGIN {
test = &invalid_request_parse_tests[i];
request_text = test->request;
- input = i_stream_create_from_data(request_text, strlen(request_text));
+ input = i_stream_create_from_data(request_text,
+ strlen(request_text));
parser = http_request_parser_init(input, &default_base_url,
NULL, test->flags);
i_stream_unref(&input);
test_out_reason("parse failure", ret < 0, error);
if (ret < 0) {
+ const char *error = _request_parse_error(error_code);
test_out(t_strdup_printf("parse error code = %s",
- _request_parse_error(error_code)), error_code == test->error_code);
+ error),
+ error_code == test->error_code);
}
test_end();
http_request_parser_deinit(&parser);