Mercurial > hg > nginx
view src/http/v3/ngx_http_v3.c @ 9251:3728a0ed243a
HTTP/3: fixed handling of request body larger than Content-Length.
Previously, 413 (Request entity too large) was returned, and incorrect
"client intended to send too large body" error message was logged.
Fix is to return 400 (Bad request) and log the "client intended to send
body data larger than declared" error message, similarly to what HTTP/2
code does.
Additionally, previously "client_max_body_size 0;" was incorrectly handled
by the HTTP/3 code, resulting in 413 instead of no limit. This is also
fixed by the correct checks added.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sat, 27 Apr 2024 18:17:03 +0300 |
parents | 4939fd04737f |
children |
line wrap: on
line source
/* * Copyright (C) Roman Arutyunyan * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static void ngx_http_v3_keepalive_handler(ngx_event_t *ev); 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; hc = c->data; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init session"); h3c = ngx_pcalloc(c->pool, sizeof(ngx_http_v3_session_t)); if (h3c == NULL) { goto failed; } h3c->http_connection = hc; ngx_queue_init(&h3c->blocked); h3c->keepalive.log = c->log; h3c->keepalive.data = c; h3c->keepalive.handler = ngx_http_v3_keepalive_handler; h3c->table.send_insert_count.log = c->log; h3c->table.send_insert_count.data = c; h3c->table.send_insert_count.handler = ngx_http_v3_inc_insert_count_handler; cln = ngx_pool_cleanup_add(c->pool, 0); if (cln == NULL) { goto failed; } cln->handler = ngx_http_v3_cleanup_session; cln->data = h3c; c->data = h3c; return NGX_OK; failed: ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to create http3 session"); return NGX_ERROR; } static void ngx_http_v3_keepalive_handler(ngx_event_t *ev) { ngx_connection_t *c; c = ev->data; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 keepalive handler"); ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, "keepalive timeout"); } static void ngx_http_v3_cleanup_session(void *data) { ngx_http_v3_session_t *h3c = data; ngx_http_v3_cleanup_table(h3c); if (h3c->keepalive.timer_set) { ngx_del_timer(&h3c->keepalive); } if (h3c->table.send_insert_count.posted) { ngx_delete_posted_event(&h3c->table.send_insert_count); } } ngx_int_t ngx_http_v3_check_flood(ngx_connection_t *c) { ngx_http_v3_session_t *h3c; h3c = ngx_http_v3_get_session(c); if (h3c->total_bytes / 8 > h3c->payload_bytes + 1048576) { ngx_log_error(NGX_LOG_INFO, c->log, 0, "http3 flood detected"); ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, "HTTP/3 flood detected"); return NGX_ERROR; } return NGX_OK; }