nghttpx: Enable link header field based push for non-final response
This commit is contained in:
parent
2cac7bb838
commit
a14cea6363
|
@ -1393,6 +1393,34 @@ int Http2Upstream::on_downstream_header_complete(Downstream *downstream) {
|
||||||
}
|
}
|
||||||
#endif // HAVE_MRUBY
|
#endif // HAVE_MRUBY
|
||||||
|
|
||||||
|
auto &http2conf = get_config()->http2;
|
||||||
|
|
||||||
|
// We need some conditions that must be fulfilled to initiate server
|
||||||
|
// push.
|
||||||
|
//
|
||||||
|
// * Server push is disabled for http2 proxy or client proxy, since
|
||||||
|
// incoming headers are mixed origins. We don't know how to
|
||||||
|
// reliably determine the authority yet.
|
||||||
|
//
|
||||||
|
// * We need non-final response or 200 response code for associated
|
||||||
|
// resource. This is too restrictive, we will review this later.
|
||||||
|
//
|
||||||
|
// * We requires GET or POST for associated resource. Probably we
|
||||||
|
// don't want to push for HEAD request. Not sure other methods
|
||||||
|
// are also eligible for push.
|
||||||
|
if (!http2conf.no_server_push &&
|
||||||
|
nghttp2_session_get_remote_settings(session_,
|
||||||
|
NGHTTP2_SETTINGS_ENABLE_PUSH) == 1 &&
|
||||||
|
!get_config()->http2_proxy && (downstream->get_stream_id() % 2) &&
|
||||||
|
resp.fs.header(http2::HD_LINK) &&
|
||||||
|
(downstream->get_non_final_response() || resp.http_status == 200) &&
|
||||||
|
(req.method == HTTP_GET || req.method == HTTP_POST)) {
|
||||||
|
|
||||||
|
if (prepare_push_promise(downstream) != 0) {
|
||||||
|
// Continue to send response even if push was failed.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto nva = std::vector<nghttp2_nv>();
|
auto nva = std::vector<nghttp2_nv>();
|
||||||
// 4 means :status and possible server, via and x-http2-push header
|
// 4 means :status and possible server, via and x-http2-push header
|
||||||
// field.
|
// field.
|
||||||
|
@ -1481,8 +1509,6 @@ int Http2Upstream::on_downstream_header_complete(Downstream *downstream) {
|
||||||
log_response_headers(downstream, nva);
|
log_response_headers(downstream, nva);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &http2conf = get_config()->http2;
|
|
||||||
|
|
||||||
if (http2conf.upstream.debug.dump.response_header) {
|
if (http2conf.upstream.debug.dump.response_header) {
|
||||||
http2::dump_nv(http2conf.upstream.debug.dump.response_header, nva.data(),
|
http2::dump_nv(http2conf.upstream.debug.dump.response_header, nva.data(),
|
||||||
nva.size());
|
nva.size());
|
||||||
|
@ -1500,31 +1526,6 @@ int Http2Upstream::on_downstream_header_complete(Downstream *downstream) {
|
||||||
data_prdptr = nullptr;
|
data_prdptr = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need some conditions that must be fulfilled to initiate server
|
|
||||||
// push.
|
|
||||||
//
|
|
||||||
// * Server push is disabled for http2 proxy or client proxy, since
|
|
||||||
// incoming headers are mixed origins. We don't know how to
|
|
||||||
// reliably determine the authority yet.
|
|
||||||
//
|
|
||||||
// * We need 200 response code for associated resource. This is too
|
|
||||||
// restrictive, we will review this later.
|
|
||||||
//
|
|
||||||
// * We requires GET or POST for associated resource. Probably we
|
|
||||||
// don't want to push for HEAD request. Not sure other methods
|
|
||||||
// are also eligible for push.
|
|
||||||
if (!http2conf.no_server_push &&
|
|
||||||
nghttp2_session_get_remote_settings(session_,
|
|
||||||
NGHTTP2_SETTINGS_ENABLE_PUSH) == 1 &&
|
|
||||||
!get_config()->http2_proxy && (downstream->get_stream_id() % 2) &&
|
|
||||||
resp.fs.header(http2::HD_LINK) && resp.http_status == 200 &&
|
|
||||||
(req.method == HTTP_GET || req.method == HTTP_POST)) {
|
|
||||||
|
|
||||||
if (prepare_push_promise(downstream) != 0) {
|
|
||||||
// Continue to send response even if push was failed.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = nghttp2_submit_response(session_, downstream->get_stream_id(),
|
rv = nghttp2_submit_response(session_, downstream->get_stream_id(),
|
||||||
nva.data(), nva.size(), data_prdptr);
|
nva.data(), nva.size(), data_prdptr);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
|
|
Loading…
Reference in New Issue