nghttpx: Implement Forwarded in HTTP/2 backend
This commit is contained in:
parent
54f5ea9d6e
commit
41047aece0
|
@ -283,7 +283,7 @@ int Http2DownstreamConnection::push_request_headers() {
|
||||||
num_cookies = downstream_->count_crumble_request_cookie();
|
num_cookies = downstream_->count_crumble_request_cookie();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 8 means:
|
// 9 means:
|
||||||
// 1. :method
|
// 1. :method
|
||||||
// 2. :scheme
|
// 2. :scheme
|
||||||
// 3. :path
|
// 3. :path
|
||||||
|
@ -292,8 +292,9 @@ int Http2DownstreamConnection::push_request_headers() {
|
||||||
// 6. x-forwarded-for (optional)
|
// 6. x-forwarded-for (optional)
|
||||||
// 7. x-forwarded-proto (optional)
|
// 7. x-forwarded-proto (optional)
|
||||||
// 8. te (optional)
|
// 8. te (optional)
|
||||||
|
// 9. forwarded (optional)
|
||||||
auto nva = std::vector<nghttp2_nv>();
|
auto nva = std::vector<nghttp2_nv>();
|
||||||
nva.reserve(req.fs.headers().size() + 8 + num_cookies +
|
nva.reserve(req.fs.headers().size() + 9 + num_cookies +
|
||||||
get_config()->add_request_headers.size());
|
get_config()->add_request_headers.size());
|
||||||
|
|
||||||
nva.push_back(
|
nva.push_back(
|
||||||
|
@ -326,6 +327,44 @@ int Http2DownstreamConnection::push_request_headers() {
|
||||||
downstream_->crumble_request_cookie(nva);
|
downstream_->crumble_request_cookie(nva);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto upstream = downstream_->get_upstream();
|
||||||
|
auto handler = upstream->get_client_handler();
|
||||||
|
|
||||||
|
std::string forwarded_value;
|
||||||
|
|
||||||
|
auto fwd = get_config()->strip_incoming_forwarded
|
||||||
|
? nullptr
|
||||||
|
: req.fs.header(http2::HD_FORWARDED);
|
||||||
|
|
||||||
|
if (get_config()->forwarded_params) {
|
||||||
|
auto params = get_config()->forwarded_params;
|
||||||
|
|
||||||
|
if (get_config()->http2_proxy || get_config()->client_proxy ||
|
||||||
|
req.method == HTTP_CONNECT) {
|
||||||
|
params &= ~FORWARDED_PROTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto value = http::create_forwarded(params, handler->get_forwarded_by(),
|
||||||
|
handler->get_forwarded_for(),
|
||||||
|
req.authority, req.scheme);
|
||||||
|
if (fwd || !value.empty()) {
|
||||||
|
if (fwd) {
|
||||||
|
forwarded_value = fwd->value;
|
||||||
|
|
||||||
|
if (!value.empty()) {
|
||||||
|
forwarded_value += ", ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
forwarded_value += value;
|
||||||
|
|
||||||
|
nva.push_back(http2::make_nv_ls("forwarded", forwarded_value));
|
||||||
|
}
|
||||||
|
} else if (fwd) {
|
||||||
|
nva.push_back(http2::make_nv_ls_nocopy("forwarded", fwd->value));
|
||||||
|
forwarded_value = fwd->value;
|
||||||
|
}
|
||||||
|
|
||||||
std::string xff_value;
|
std::string xff_value;
|
||||||
auto xff = req.fs.header(http2::HD_X_FORWARDED_FOR);
|
auto xff = req.fs.header(http2::HD_X_FORWARDED_FOR);
|
||||||
if (get_config()->add_x_forwarded_for) {
|
if (get_config()->add_x_forwarded_for) {
|
||||||
|
@ -333,8 +372,7 @@ int Http2DownstreamConnection::push_request_headers() {
|
||||||
xff_value = (*xff).value;
|
xff_value = (*xff).value;
|
||||||
xff_value += ", ";
|
xff_value += ", ";
|
||||||
}
|
}
|
||||||
xff_value +=
|
xff_value += upstream->get_client_handler()->get_ipaddr();
|
||||||
downstream_->get_upstream()->get_client_handler()->get_ipaddr();
|
|
||||||
nva.push_back(http2::make_nv_ls("x-forwarded-for", xff_value));
|
nva.push_back(http2::make_nv_ls("x-forwarded-for", xff_value));
|
||||||
} else if (xff && !get_config()->strip_incoming_x_forwarded_for) {
|
} else if (xff && !get_config()->strip_incoming_x_forwarded_for) {
|
||||||
nva.push_back(http2::make_nv_ls_nocopy("x-forwarded-for", (*xff).value));
|
nva.push_back(http2::make_nv_ls_nocopy("x-forwarded-for", (*xff).value));
|
||||||
|
|
Loading…
Reference in New Issue