#define NGX_HTTP_V3_STREAM_SERVER_DECODER 5
#define NGX_HTTP_V3_MAX_KNOWN_STREAM 6
+#define NGX_HTTP_V3_DEFAULT_MAX_FIELD_SIZE 4096
+
typedef struct {
ngx_quic_tp_t quic;
+ size_t max_field_size;
} ngx_http_v3_srv_conf_t;
offsetof(ngx_http_v3_srv_conf_t, quic.retry),
NULL },
+ { ngx_string("http3_max_field_size"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_size_slot,
+ NGX_HTTP_SRV_CONF_OFFSET,
+ offsetof(ngx_http_v3_srv_conf_t, max_field_size),
+ NULL },
+
ngx_null_command
};
v3cf->quic.retry = NGX_CONF_UNSET;
+ v3cf->max_field_size = NGX_CONF_UNSET_SIZE;
+
return v3cf;
}
}
}
+ ngx_conf_merge_size_value(conf->max_field_size,
+ prev->max_field_size,
+ NGX_HTTP_V3_DEFAULT_MAX_FIELD_SIZE);
return NGX_CONF_OK;
}
ngx_http_v3_parse_literal(ngx_connection_t *c, ngx_http_v3_parse_literal_t *st,
u_char ch)
{
- ngx_uint_t n;
+ ngx_uint_t n;
+ ngx_http_v3_srv_conf_t *v3cf;
enum {
sw_start = 0,
sw_value
n = st->length;
+ v3cf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module);
+
+ if (n > v3cf->max_field_size) {
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "client exceeded http3_max_field_size limit");
+ return NGX_ERROR;
+ }
+
if (st->huffman) {
n = n * 8 / 5;
st->huffstate = 0;