mirror of
https://github.com/nginx/nginx.git
synced 2025-06-19 02:40:49 +08:00
HTTP/3: client GOAWAY support.
This commit is contained in:
parent
80a5227617
commit
96e1db1c34
@ -37,6 +37,7 @@ ngx_http_v3_init_session(ngx_connection_t *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
h3c->max_push_id = (uint64_t) -1;
|
h3c->max_push_id = (uint64_t) -1;
|
||||||
|
h3c->goaway_push_id = (uint64_t) -1;
|
||||||
|
|
||||||
ngx_queue_init(&h3c->blocked);
|
ngx_queue_init(&h3c->blocked);
|
||||||
ngx_queue_init(&h3c->pushing);
|
ngx_queue_init(&h3c->pushing);
|
||||||
|
@ -129,6 +129,7 @@ struct ngx_http_v3_session_s {
|
|||||||
ngx_uint_t npushing;
|
ngx_uint_t npushing;
|
||||||
uint64_t next_push_id;
|
uint64_t next_push_id;
|
||||||
uint64_t max_push_id;
|
uint64_t max_push_id;
|
||||||
|
uint64_t goaway_push_id;
|
||||||
|
|
||||||
ngx_uint_t goaway; /* unsigned goaway:1; */
|
ngx_uint_t goaway; /* unsigned goaway:1; */
|
||||||
|
|
||||||
|
@ -805,6 +805,12 @@ ngx_http_v3_push_resource(ngx_http_request_t *r, ngx_str_t *path,
|
|||||||
return NGX_ABORT;
|
return NGX_ABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (h3c->goaway_push_id != (uint64_t) -1) {
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||||
|
"http3 abort pushes due to goaway");
|
||||||
|
return NGX_ABORT;
|
||||||
|
}
|
||||||
|
|
||||||
if (h3c->npushing >= h3scf->max_concurrent_pushes) {
|
if (h3c->npushing >= h3scf->max_concurrent_pushes) {
|
||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||||
"http3 abort pushes due to max_concurrent_pushes");
|
"http3 abort pushes due to max_concurrent_pushes");
|
||||||
|
@ -1012,6 +1012,7 @@ ngx_http_v3_parse_control(ngx_connection_t *c, ngx_http_v3_parse_control_t *st,
|
|||||||
sw_cancel_push,
|
sw_cancel_push,
|
||||||
sw_settings,
|
sw_settings,
|
||||||
sw_max_push_id,
|
sw_max_push_id,
|
||||||
|
sw_goaway,
|
||||||
sw_skip
|
sw_skip
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1091,6 +1092,10 @@ ngx_http_v3_parse_control(ngx_connection_t *c, ngx_http_v3_parse_control_t *st,
|
|||||||
st->state = sw_max_push_id;
|
st->state = sw_max_push_id;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NGX_HTTP_V3_FRAME_GOAWAY:
|
||||||
|
st->state = sw_goaway;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||||
"http3 parse skip unknown frame");
|
"http3 parse skip unknown frame");
|
||||||
@ -1157,6 +1162,26 @@ ngx_http_v3_parse_control(ngx_connection_t *c, ngx_http_v3_parse_control_t *st,
|
|||||||
st->state = sw_type;
|
st->state = sw_type;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case sw_goaway:
|
||||||
|
|
||||||
|
rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, ch);
|
||||||
|
|
||||||
|
if (--st->length == 0 && rc == NGX_AGAIN) {
|
||||||
|
return NGX_HTTP_V3_ERR_FRAME_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc != NGX_DONE) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ngx_http_v3_goaway(c, st->vlint.value);
|
||||||
|
if (rc != NGX_OK) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
st->state = sw_type;
|
||||||
|
break;
|
||||||
|
|
||||||
case sw_skip:
|
case sw_skip:
|
||||||
|
|
||||||
if (--st->length == 0) {
|
if (--st->length == 0) {
|
||||||
|
@ -703,6 +703,21 @@ ngx_http_v3_set_max_push_id(ngx_connection_t *c, uint64_t max_push_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ngx_int_t
|
||||||
|
ngx_http_v3_goaway(ngx_connection_t *c, uint64_t push_id)
|
||||||
|
{
|
||||||
|
ngx_http_v3_session_t *h3c;
|
||||||
|
|
||||||
|
h3c = ngx_http_v3_get_session(c);
|
||||||
|
|
||||||
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 GOAWAY:%uL", push_id);
|
||||||
|
|
||||||
|
h3c->goaway_push_id = push_id;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ngx_int_t
|
ngx_int_t
|
||||||
ngx_http_v3_cancel_push(ngx_connection_t *c, uint64_t push_id)
|
ngx_http_v3_cancel_push(ngx_connection_t *c, uint64_t push_id)
|
||||||
{
|
{
|
||||||
|
@ -21,6 +21,7 @@ ngx_connection_t *ngx_http_v3_create_push_stream(ngx_connection_t *c,
|
|||||||
uint64_t push_id);
|
uint64_t push_id);
|
||||||
ngx_int_t ngx_http_v3_set_max_push_id(ngx_connection_t *c,
|
ngx_int_t ngx_http_v3_set_max_push_id(ngx_connection_t *c,
|
||||||
uint64_t max_push_id);
|
uint64_t max_push_id);
|
||||||
|
ngx_int_t ngx_http_v3_goaway(ngx_connection_t *c, uint64_t push_id);
|
||||||
ngx_int_t ngx_http_v3_cancel_push(ngx_connection_t *c, uint64_t push_id);
|
ngx_int_t ngx_http_v3_cancel_push(ngx_connection_t *c, uint64_t push_id);
|
||||||
ngx_int_t ngx_http_v3_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id);
|
ngx_int_t ngx_http_v3_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user