diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/http/modules/ngx_http_grpc_module.c | 11 | ||||
-rw-r--r-- | src/http/modules/ngx_http_proxy_module.c | 14 | ||||
-rw-r--r-- | src/http/ngx_http_upstream.c | 10 | ||||
-rw-r--r-- | src/http/ngx_http_upstream.h | 1 |
4 files changed, 25 insertions, 11 deletions
diff --git a/src/http/modules/ngx_http_grpc_module.c b/src/http/modules/ngx_http_grpc_module.c index d74b17708..4c95525b4 100644 --- a/src/http/modules/ngx_http_grpc_module.c +++ b/src/http/modules/ngx_http_grpc_module.c @@ -1928,6 +1928,17 @@ ngx_http_grpc_process_header(ngx_http_request_t *r) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "grpc header done"); + if (u->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { + if (ctx->end_stream) { + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "upstream prematurely closed stream"); + return NGX_HTTP_UPSTREAM_INVALID_HEADER; + } + + ctx->status = 0; + return NGX_HTTP_UPSTREAM_EARLY_HINTS; + } + if (ctx->end_stream) { u->headers_in.content_length_n = 0; diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c index ff7460e44..8d5385c1d 100644 --- a/src/http/modules/ngx_http_proxy_module.c +++ b/src/http/modules/ngx_http_proxy_module.c @@ -1985,8 +1985,18 @@ ngx_http_proxy_process_header(ngx_http_request_t *r) ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http proxy header done"); + ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); + if (r->upstream->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { - return NGX_OK; + ctx->status.code = 0; + ctx->status.count = 0; + ctx->status.start = NULL; + ctx->status.end = NULL; + + r->upstream->process_header = + ngx_http_proxy_process_status_line; + r->state = 0; + return NGX_HTTP_UPSTREAM_EARLY_HINTS; } /* @@ -2036,8 +2046,6 @@ ngx_http_proxy_process_header(ngx_http_request_t *r) * connections alive in case of r->header_only or X-Accel-Redirect */ - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED || ctx->head diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c index d1bcdbbe0..de0f92a4f 100644 --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -1123,7 +1123,7 @@ ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u) return NGX_ERROR; } - if (rc == NGX_AGAIN) { + if (rc == NGX_AGAIN || rc == NGX_HTTP_UPSTREAM_EARLY_HINTS) { rc = NGX_HTTP_UPSTREAM_INVALID_HEADER; } @@ -2533,9 +2533,7 @@ ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u) continue; } - if (rc == NGX_OK - && u->headers_in.status_n == NGX_HTTP_EARLY_HINTS) - { + if (rc == NGX_HTTP_UPSTREAM_EARLY_HINTS) { rc = ngx_http_upstream_process_early_hints(r, u); if (rc == NGX_OK) { @@ -2651,10 +2649,6 @@ ngx_http_upstream_process_early_hints(ngx_http_request_t *r, } } - if (u->reinit_request(r) != NGX_OK) { - return NGX_ERROR; - } - ngx_http_clean_header(r); ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t)); diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h index 7a47675eb..f3e9f7979 100644 --- a/src/http/ngx_http_upstream.h +++ b/src/http/ngx_http_upstream.h @@ -43,6 +43,7 @@ |NGX_HTTP_UPSTREAM_FT_HTTP_429) #define NGX_HTTP_UPSTREAM_INVALID_HEADER 40 +#define NGX_HTTP_UPSTREAM_EARLY_HINTS 41 #define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT 0x00000002 |