nghttpx: Refactor and simplify Downstream::rewrite_location_response_header
This commit is contained in:
parent
198e253e9d
commit
74c77926a8
|
@ -540,56 +540,25 @@ void Downstream::rewrite_location_response_header(
|
||||||
if (!hd) {
|
if (!hd) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (request_downstream_host_.empty() || req_.authority.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
http_parser_url u{};
|
http_parser_url u{};
|
||||||
int rv =
|
auto rv = http_parser_parse_url(hd->value.c_str(), hd->value.size(), 0, &u);
|
||||||
http_parser_parse_url((*hd).value.c_str(), (*hd).value.size(), 0, &u);
|
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::string new_uri;
|
|
||||||
if (get_config()->no_host_rewrite || req_.method == HTTP_CONNECT) {
|
auto new_uri = http2::rewrite_location_uri(
|
||||||
if (!req_.authority.empty()) {
|
hd->value, u, request_downstream_host_, req_.authority, upstream_scheme);
|
||||||
new_uri = http2::rewrite_location_uri((*hd).value, u, req_.authority,
|
|
||||||
req_.authority, upstream_scheme);
|
|
||||||
}
|
|
||||||
if (new_uri.empty()) {
|
|
||||||
auto host = req_.fs.header(http2::HD_HOST);
|
|
||||||
if (host) {
|
|
||||||
new_uri = http2::rewrite_location_uri((*hd).value, u, (*host).value,
|
|
||||||
(*host).value, upstream_scheme);
|
|
||||||
} else if (!request_downstream_host_.empty()) {
|
|
||||||
new_uri = http2::rewrite_location_uri(
|
|
||||||
(*hd).value, u, request_downstream_host_, "", upstream_scheme);
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (request_downstream_host_.empty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!req_.authority.empty()) {
|
|
||||||
new_uri =
|
|
||||||
http2::rewrite_location_uri((*hd).value, u, request_downstream_host_,
|
|
||||||
req_.authority, upstream_scheme);
|
|
||||||
} else {
|
|
||||||
auto host = req_.fs.header(http2::HD_HOST);
|
|
||||||
if (host) {
|
|
||||||
new_uri = http2::rewrite_location_uri((*hd).value, u,
|
|
||||||
request_downstream_host_,
|
|
||||||
(*host).value, upstream_scheme);
|
|
||||||
} else {
|
|
||||||
new_uri = http2::rewrite_location_uri(
|
|
||||||
(*hd).value, u, request_downstream_host_, "", upstream_scheme);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_uri.empty()) {
|
if (new_uri.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*hd).value = std::move(new_uri);
|
hd->value = std::move(new_uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Downstream::get_chunked_response() const { return chunked_response_; }
|
bool Downstream::get_chunked_response() const { return chunked_response_; }
|
||||||
|
|
|
@ -124,31 +124,16 @@ void test_downstream_assemble_request_cookie(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_downstream_rewrite_location_response_header(void) {
|
void test_downstream_rewrite_location_response_header(void) {
|
||||||
{
|
Downstream d(nullptr, nullptr, 0);
|
||||||
Downstream d(nullptr, nullptr, 0);
|
auto &req = d.request();
|
||||||
auto &req = d.request();
|
auto &resp = d.response();
|
||||||
auto &resp = d.response();
|
d.set_request_downstream_host("localhost2");
|
||||||
d.set_request_downstream_host("localhost:3000");
|
req.authority = "localhost:8443";
|
||||||
req.fs.add_header("host", "localhost");
|
resp.fs.add_header("location", "http://localhost2:3000/");
|
||||||
resp.fs.add_header("location", "http://localhost:3000/");
|
resp.fs.index_headers();
|
||||||
req.fs.index_headers();
|
d.rewrite_location_response_header("https");
|
||||||
resp.fs.index_headers();
|
auto location = resp.fs.header(http2::HD_LOCATION);
|
||||||
d.rewrite_location_response_header("https");
|
CU_ASSERT("https://localhost:8443/" == (*location).value);
|
||||||
auto location = resp.fs.header(http2::HD_LOCATION);
|
|
||||||
CU_ASSERT("https://localhost/" == (*location).value);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
Downstream d(nullptr, nullptr, 0);
|
|
||||||
auto &req = d.request();
|
|
||||||
auto &resp = d.response();
|
|
||||||
d.set_request_downstream_host("localhost");
|
|
||||||
req.authority = "localhost";
|
|
||||||
resp.fs.add_header("location", "http://localhost:3000/");
|
|
||||||
resp.fs.index_headers();
|
|
||||||
d.rewrite_location_response_header("https");
|
|
||||||
auto location = resp.fs.header(http2::HD_LOCATION);
|
|
||||||
CU_ASSERT("https://localhost/" == (*location).value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
Loading…
Reference in New Issue