# HG changeset patch # User Sergey Kandaurov # Date 1615891709 -10800 # Node ID 5cb5b568282b26fee1f58f68e8d0d261d77db019 # Parent 554e11a325a94d84565cd8e683f65c72360ab5aa HTTP/3: do not push until a MAX_PUSH_ID frame is received. Fixes interop with quic-go that doesn't send MAX_PUSH_ID. diff --git a/src/http/v3/ngx_http_v3_filter_module.c b/src/http/v3/ngx_http_v3_filter_module.c --- a/src/http/v3/ngx_http_v3_filter_module.c +++ b/src/http/v3/ngx_http_v3_filter_module.c @@ -787,7 +787,7 @@ ngx_http_v3_push_resource(ngx_http_reque h3scf = ngx_http_get_module_srv_conf(r, ngx_http_v3_module); ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 push \"%V\" pushing:%ui/%ui id:%uL/%uL", + "http3 push \"%V\" pushing:%ui/%ui id:%uL/%L", path, h3c->npushing, h3scf->max_concurrent_pushes, h3c->next_push_id, h3c->max_push_id); @@ -797,7 +797,9 @@ ngx_http_v3_push_resource(ngx_http_reque return NGX_DECLINED; } - if (h3c->next_push_id > h3c->max_push_id) { + if (h3c->max_push_id == (uint64_t) -1 + || h3c->next_push_id > h3c->max_push_id) + { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 abort pushes due to max_push_id"); return NGX_ABORT; diff --git a/src/http/v3/ngx_http_v3_streams.c b/src/http/v3/ngx_http_v3_streams.c --- a/src/http/v3/ngx_http_v3_streams.c +++ b/src/http/v3/ngx_http_v3_streams.c @@ -62,6 +62,7 @@ ngx_http_v3_init_session(ngx_connection_ h3c->hc = *phc; h3c->hc.http3 = 1; + h3c->max_push_id = (uint64_t) -1; ngx_queue_init(&h3c->blocked); ngx_queue_init(&h3c->pushing); @@ -762,7 +763,7 @@ ngx_http_v3_set_max_push_id(ngx_connecti ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 MAX_PUSH_ID:%uL", max_push_id); - if (max_push_id < h3c->max_push_id) { + if (h3c->max_push_id != (uint64_t) -1 && max_push_id < h3c->max_push_id) { return NGX_HTTP_V3_ERR_ID_ERROR; }