Mercurial > hg > nginx
changeset 7957:f5732fa038ad stable-1.20
gRPC: handling GOAWAY with a higher last stream identifier.
Previously, once received from upstream, it couldn't limit
opening additional streams in a cached keepalive connection.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Thu, 17 Jun 2021 11:43:55 +0300 |
parents | ae70fcb8ac93 |
children | 9b72da2b5b57 |
files | src/http/modules/ngx_http_grpc_module.c |
diffstat | 1 files changed, 9 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_grpc_module.c +++ b/src/http/modules/ngx_http_grpc_module.c @@ -124,6 +124,7 @@ typedef struct { unsigned done:1; unsigned status:1; unsigned rst:1; + unsigned goaway:1; ngx_http_request_t *request; @@ -1213,6 +1214,7 @@ ngx_http_grpc_reinit_request(ngx_http_re ctx->done = 0; ctx->status = 0; ctx->rst = 0; + ctx->goaway = 0; ctx->connection = NULL; return NGX_OK; @@ -1568,6 +1570,7 @@ ngx_http_grpc_body_output_filter(void *d && ctx->out == NULL && ctx->output_closed && !ctx->output_blocked + && !ctx->goaway && ctx->state == ngx_http_grpc_st_start) { u->keepalive = 1; @@ -1717,6 +1720,8 @@ ngx_http_grpc_process_header(ngx_http_re return NGX_HTTP_UPSTREAM_INVALID_HEADER; } + ctx->goaway = 1; + continue; } @@ -1910,6 +1915,7 @@ ngx_http_grpc_process_header(ngx_http_re && ctx->out == NULL && ctx->output_closed && !ctx->output_blocked + && !ctx->goaway && b->last == b->pos) { u->keepalive = 1; @@ -2038,6 +2044,7 @@ ngx_http_grpc_filter(void *data, ssize_t if (ctx->in == NULL && ctx->output_closed && !ctx->output_blocked + && !ctx->goaway && ctx->state == ngx_http_grpc_st_start) { u->keepalive = 1; @@ -2207,6 +2214,8 @@ ngx_http_grpc_filter(void *data, ssize_t return NGX_ERROR; } + ctx->goaway = 1; + continue; }