Latest update - 9048
This commit is contained in:
@@ -17,12 +17,9 @@ static void ngx_http_v3_cleanup_session(void *data);
|
||||
ngx_int_t
|
||||
ngx_http_v3_init_session(ngx_connection_t *c)
|
||||
{
|
||||
ngx_pool_cleanup_t *cln;
|
||||
ngx_http_connection_t *hc;
|
||||
ngx_http_v3_session_t *h3c;
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
ngx_http_v3_srv_conf_t *h3scf;
|
||||
#endif
|
||||
ngx_pool_cleanup_t *cln;
|
||||
ngx_http_connection_t *hc;
|
||||
ngx_http_v3_session_t *h3c;
|
||||
|
||||
hc = c->data;
|
||||
|
||||
@@ -36,13 +33,6 @@ ngx_http_v3_init_session(ngx_connection_t *c)
|
||||
h3c->max_push_id = (uint64_t) -1;
|
||||
h3c->goaway_push_id = (uint64_t) -1;
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
h3scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v3_module);
|
||||
if (h3scf->hq) {
|
||||
h3c->hq = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
ngx_queue_init(&h3c->blocked);
|
||||
ngx_queue_init(&h3c->pushing);
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#define NGX_HTTP_V3_ALPN_PROTO "\x02h3"
|
||||
#define NGX_HTTP_V3_HQ_ALPN_PROTO "\x0Ahq-interop"
|
||||
#define NGX_HTTP_V3_HQ_PROTO "hq-interop"
|
||||
|
||||
#define NGX_HTTP_V3_VARLEN_INT_LEN 4
|
||||
#define NGX_HTTP_V3_PREFIX_INT_LEN 11
|
||||
@@ -101,13 +102,12 @@
|
||||
|
||||
|
||||
typedef struct {
|
||||
ngx_flag_t enable;
|
||||
ngx_flag_t enable_hq;
|
||||
size_t max_table_capacity;
|
||||
ngx_uint_t max_blocked_streams;
|
||||
ngx_uint_t max_concurrent_pushes;
|
||||
ngx_uint_t max_concurrent_streams;
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
ngx_flag_t hq;
|
||||
#endif
|
||||
ngx_quic_conf_t quic;
|
||||
} ngx_http_v3_srv_conf_t;
|
||||
|
||||
@@ -147,9 +147,7 @@ struct ngx_http_v3_session_s {
|
||||
off_t payload_bytes;
|
||||
|
||||
unsigned goaway:1;
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
unsigned hq:1;
|
||||
#endif
|
||||
|
||||
ngx_connection_t *known_streams[NGX_HTTP_V3_MAX_KNOWN_STREAM];
|
||||
};
|
||||
|
||||
@@ -32,6 +32,20 @@ static ngx_conf_post_t ngx_http_quic_mtu_post =
|
||||
|
||||
static ngx_command_t ngx_http_v3_commands[] = {
|
||||
|
||||
{ ngx_string("http3"),
|
||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
|
||||
ngx_conf_set_flag_slot,
|
||||
NGX_HTTP_SRV_CONF_OFFSET,
|
||||
offsetof(ngx_http_v3_srv_conf_t, enable),
|
||||
NULL },
|
||||
|
||||
{ ngx_string("http3_hq"),
|
||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
|
||||
ngx_conf_set_flag_slot,
|
||||
NGX_HTTP_SRV_CONF_OFFSET,
|
||||
offsetof(ngx_http_v3_srv_conf_t, enable_hq),
|
||||
NULL },
|
||||
|
||||
{ ngx_string("http3_max_concurrent_pushes"),
|
||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
|
||||
ngx_conf_set_num_slot,
|
||||
@@ -46,15 +60,6 @@ static ngx_command_t ngx_http_v3_commands[] = {
|
||||
offsetof(ngx_http_v3_srv_conf_t, max_concurrent_streams),
|
||||
NULL },
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
{ ngx_string("http3_hq"),
|
||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG,
|
||||
ngx_conf_set_flag_slot,
|
||||
NGX_HTTP_SRV_CONF_OFFSET,
|
||||
offsetof(ngx_http_v3_srv_conf_t, hq),
|
||||
NULL },
|
||||
#endif
|
||||
|
||||
{ ngx_string("http3_push"),
|
||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||
ngx_http_v3_push,
|
||||
@@ -160,14 +165,12 @@ static ngx_int_t
|
||||
ngx_http_v3_variable(ngx_http_request_t *r,
|
||||
ngx_http_variable_value_t *v, uintptr_t data)
|
||||
{
|
||||
ngx_http_v3_session_t *h3c;
|
||||
|
||||
if (r->connection->quic) {
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
h3c = ngx_http_v3_get_session(r->connection);
|
||||
|
||||
ngx_http_v3_srv_conf_t *h3scf;
|
||||
|
||||
h3scf = ngx_http_get_module_srv_conf(r, ngx_http_v3_module);
|
||||
|
||||
if (h3scf->hq) {
|
||||
if (h3c->hq) {
|
||||
v->len = sizeof("hq") - 1;
|
||||
v->valid = 1;
|
||||
v->no_cacheable = 0;
|
||||
@@ -177,8 +180,6 @@ ngx_http_v3_variable(ngx_http_request_t *r,
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
v->len = sizeof("h3") - 1;
|
||||
v->valid = 1;
|
||||
v->no_cacheable = 0;
|
||||
@@ -232,12 +233,12 @@ ngx_http_v3_create_srv_conf(ngx_conf_t *cf)
|
||||
* h3scf->quic.timeout = 0;
|
||||
* h3scf->max_blocked_streams = 0;
|
||||
*/
|
||||
|
||||
h3scf->enable = NGX_CONF_UNSET;
|
||||
h3scf->enable_hq = NGX_CONF_UNSET;
|
||||
h3scf->max_table_capacity = NGX_HTTP_V3_MAX_TABLE_CAPACITY;
|
||||
h3scf->max_concurrent_pushes = NGX_CONF_UNSET_UINT;
|
||||
h3scf->max_concurrent_streams = NGX_CONF_UNSET_UINT;
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
h3scf->hq = NGX_CONF_UNSET;
|
||||
#endif
|
||||
|
||||
h3scf->quic.mtu = NGX_CONF_UNSET_SIZE;
|
||||
h3scf->quic.stream_buffer_size = NGX_CONF_UNSET_SIZE;
|
||||
@@ -264,6 +265,10 @@ ngx_http_v3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||
|
||||
ngx_http_ssl_srv_conf_t *sscf;
|
||||
|
||||
ngx_conf_merge_value(conf->enable, prev->enable, 1);
|
||||
|
||||
ngx_conf_merge_value(conf->enable_hq, prev->enable_hq, 0);
|
||||
|
||||
ngx_conf_merge_uint_value(conf->max_concurrent_pushes,
|
||||
prev->max_concurrent_pushes, 10);
|
||||
|
||||
@@ -272,11 +277,6 @@ ngx_http_v3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||
|
||||
conf->max_blocked_streams = conf->max_concurrent_streams;
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
ngx_conf_merge_value(conf->hq, prev->hq, 0);
|
||||
#endif
|
||||
|
||||
|
||||
ngx_conf_merge_size_value(conf->quic.mtu, prev->quic.mtu,
|
||||
NGX_QUIC_MAX_UDP_PAYLOAD_SIZE);
|
||||
|
||||
|
||||
@@ -110,7 +110,10 @@ ngx_http_v3_init_stream(ngx_connection_t *c)
|
||||
ngx_int_t
|
||||
ngx_http_v3_init(ngx_connection_t *c)
|
||||
{
|
||||
unsigned int len;
|
||||
const unsigned char *data;
|
||||
ngx_http_v3_session_t *h3c;
|
||||
ngx_http_v3_srv_conf_t *h3scf;
|
||||
ngx_http_core_loc_conf_t *clcf;
|
||||
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init");
|
||||
@@ -119,11 +122,23 @@ ngx_http_v3_init(ngx_connection_t *c)
|
||||
clcf = ngx_http_v3_get_module_loc_conf(c, ngx_http_core_module);
|
||||
ngx_add_timer(&h3c->keepalive, clcf->keepalive_timeout);
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
if (h3c->hq) {
|
||||
return NGX_OK;
|
||||
h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module);
|
||||
|
||||
if (h3scf->enable_hq) {
|
||||
if (!h3scf->enable) {
|
||||
h3c->hq = 1;
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
SSL_get0_alpn_selected(c->ssl->connection, &data, &len);
|
||||
|
||||
if (len == sizeof(NGX_HTTP_V3_HQ_PROTO) - 1
|
||||
&& ngx_strncmp(data, NGX_HTTP_V3_HQ_PROTO, len) == 0)
|
||||
{
|
||||
h3c->hq = 1;
|
||||
return NGX_OK;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return ngx_http_v3_send_settings(c);
|
||||
}
|
||||
@@ -147,10 +162,7 @@ ngx_http_v3_shutdown(ngx_connection_t *c)
|
||||
if (!h3c->goaway) {
|
||||
h3c->goaway = 1;
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
if (!h3c->hq)
|
||||
#endif
|
||||
{
|
||||
if (!h3c->hq) {
|
||||
(void) ngx_http_v3_send_goaway(c, h3c->next_request_id);
|
||||
}
|
||||
|
||||
@@ -205,10 +217,7 @@ ngx_http_v3_init_request_stream(ngx_connection_t *c)
|
||||
{
|
||||
h3c->goaway = 1;
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
if (!h3c->hq)
|
||||
#endif
|
||||
{
|
||||
if (!h3c->hq) {
|
||||
if (ngx_http_v3_send_goaway(c, h3c->next_request_id) != NGX_OK) {
|
||||
ngx_http_close_connection(c);
|
||||
return;
|
||||
@@ -236,10 +245,7 @@ ngx_http_v3_init_request_stream(ngx_connection_t *c)
|
||||
|
||||
rev = c->read;
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
if (!h3c->hq)
|
||||
#endif
|
||||
{
|
||||
if (!h3c->hq) {
|
||||
rev->handler = ngx_http_v3_wait_request_handler;
|
||||
c->write->handler = ngx_http_empty_handler;
|
||||
}
|
||||
@@ -398,14 +404,14 @@ ngx_http_v3_wait_request_handler(ngx_event_t *rev)
|
||||
void
|
||||
ngx_http_v3_reset_stream(ngx_connection_t *c)
|
||||
{
|
||||
ngx_http_v3_session_t *h3c;
|
||||
ngx_http_v3_srv_conf_t *h3scf;
|
||||
|
||||
h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module);
|
||||
|
||||
if (h3scf->max_table_capacity > 0 && !c->read->eof
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
&& !h3scf->hq
|
||||
#endif
|
||||
h3c = ngx_http_v3_get_session(c);
|
||||
|
||||
if (h3scf->max_table_capacity > 0 && !c->read->eof && !h3c->hq
|
||||
&& (c->quic->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0)
|
||||
{
|
||||
(void) ngx_http_v3_send_cancel_stream(c, c->quic->id);
|
||||
@@ -993,9 +999,11 @@ failed:
|
||||
static ngx_int_t
|
||||
ngx_http_v3_process_request_header(ngx_http_request_t *r)
|
||||
{
|
||||
ssize_t n;
|
||||
ngx_buf_t *b;
|
||||
ngx_connection_t *c;
|
||||
ssize_t n;
|
||||
ngx_buf_t *b;
|
||||
ngx_connection_t *c;
|
||||
ngx_http_v3_session_t *h3c;
|
||||
ngx_http_v3_srv_conf_t *h3scf;
|
||||
|
||||
c = r->connection;
|
||||
|
||||
@@ -1003,6 +1011,19 @@ ngx_http_v3_process_request_header(ngx_http_request_t *r)
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
h3c = ngx_http_v3_get_session(c);
|
||||
h3scf = ngx_http_get_module_srv_conf(r, ngx_http_v3_module);
|
||||
|
||||
if (!r->http_connection->addr_conf->http3) {
|
||||
if ((h3c->hq && !h3scf->enable_hq) || (!h3c->hq && !h3scf->enable)) {
|
||||
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
||||
"client attempted to request the server name "
|
||||
"for which the negotiated protocol is disabled");
|
||||
ngx_http_finalize_request(r, NGX_HTTP_MISDIRECTED_REQUEST);
|
||||
return NGX_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (ngx_http_v3_construct_cookie_header(r) != NGX_OK) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
@@ -37,12 +37,9 @@ void
|
||||
ngx_http_v3_init_uni_stream(ngx_connection_t *c)
|
||||
{
|
||||
uint64_t n;
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
ngx_http_v3_session_t *h3c;
|
||||
#endif
|
||||
ngx_http_v3_uni_stream_t *us;
|
||||
|
||||
#if (NGX_HTTP_V3_HQ)
|
||||
h3c = ngx_http_v3_get_session(c);
|
||||
if (h3c->hq) {
|
||||
ngx_http_v3_finalize_connection(c,
|
||||
@@ -52,7 +49,6 @@ ngx_http_v3_init_uni_stream(ngx_connection_t *c)
|
||||
ngx_http_v3_close_uni_stream(c);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init uni stream");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user