diff options
| author | Roman Arutyunyan <arut@nginx.com> | 2026-02-11 12:29:37 +0000 |
|---|---|---|
| committer | Roman Arutyunyan <arutyunyan.roman@gmail.com> | 2026-02-11 18:57:43 +0400 |
| commit | f8e1bc5b9821eba7995905fe46c8ca383b5ea782 (patch) | |
| tree | 2739176c5bb2b5e372ab5c906d7ff97ca1e48cf8 /src/http/modules | |
| parent | d662a5cc469b64d9423ccae0a400ca34d11c3764 (diff) | |
| download | nginx-f8e1bc5b9821eba7995905fe46c8ca383b5ea782.tar.gz nginx-f8e1bc5b9821eba7995905fe46c8ca383b5ea782.tar.bz2 | |
Proxy: fixed HTTP/2 upstream with caching enabled.
Previously, when proxy_cache and keepalive were both enabled with an
HTTP/2 upstream, the second request for a cached resource could fail with
"upstream sent frame for unknown stream" error followed by "cache file
contains invalid header".
This happened because ctx->id was set to 1 in the case when no upstream
connection exists (e.g. cache hit), making the stream id check fail when
the cached response contained frames from a different stream.
The fix is to set ctx->id to 0 when there is no upstream connection,
indicating that no real stream exists, and skip the stream id validation
in this case. Also, ctx->id = 1 is now set only for new connections,
not in the shared done label.
Closes: https://github.com/nginx/nginx/issues/1101
Diffstat (limited to 'src/http/modules')
| -rw-r--r-- | src/http/modules/ngx_http_proxy_v2_module.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/http/modules/ngx_http_proxy_v2_module.c b/src/http/modules/ngx_http_proxy_v2_module.c index f109fe94e..2c8a3d4d1 100644 --- a/src/http/modules/ngx_http_proxy_v2_module.c +++ b/src/http/modules/ngx_http_proxy_v2_module.c @@ -1395,7 +1395,7 @@ ngx_http_proxy_v2_process_header(ngx_http_request_t *r) return NGX_HTTP_UPSTREAM_INVALID_HEADER; } - if (ctx->stream_id && ctx->stream_id != ctx->id) { + if (ctx->id && ctx->stream_id && ctx->stream_id != ctx->id) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "upstream sent frame for unknown stream %ui", ctx->stream_id); @@ -4076,6 +4076,8 @@ ngx_http_proxy_v2_get_connection_data(ngx_http_request_t *r, return NGX_ERROR; } + ctx->id = 0; + goto done; } @@ -4117,6 +4119,8 @@ ngx_http_proxy_v2_get_connection_data(ngx_http_request_t *r, cln->handler = ngx_http_proxy_v2_cleanup; ctx->connection = cln->data; + ctx->id = 1; + done: ctx->connection->init_window = NGX_HTTP_V2_DEFAULT_WINDOW; @@ -4126,7 +4130,6 @@ done: ctx->send_window = NGX_HTTP_V2_DEFAULT_WINDOW; ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW; - ctx->id = 1; ctx->connection->last_stream_id = 1; return NGX_OK; |
