Welcome! Log In Create A New Profile

Advanced

Timeout for whole request body

January 01, 2015 02:44PM
Nginx provides client_body_timeout which is only for a period between two successive read operations but in one of our use case we want to set timeout for whole request body. To set the timeout for whole request body, we changed the source to add a new timer. We would like to know whether this approach is correct or not. Please correct me if there is any issue in the following code.
Thanks

diff -bur src/core/ngx_connection.c src/core/ngx_connection.c
--- src/core/ngx_connection.c 2014-12-19 15:33:48.000000000 +0530
+++ src/core/ngx_connection.c 2015-01-02 00:18:19.000000000 +0530
@@ -884,6 +884,10 @@
ngx_del_timer(c->write);
}

+ if (c->read_full->timer_set) {
+ ngx_del_timer(c->read_full);
+ }
+
if (ngx_del_conn) {
ngx_del_conn(c, NGX_CLOSE_EVENT);

diff -bur src/core/ngx_connection.h src/core/ngx_connection.h
--- src/core/ngx_connection.h 2014-12-19 15:33:48.000000000 +0530
+++ src/core/ngx_connection.h 2015-01-02 00:42:41.000000000 +0530
@@ -114,6 +114,7 @@
void *data;
ngx_event_t *read;
ngx_event_t *write;
+ ngx_event_t *read_full;

ngx_socket_t fd;

diff -bur src/http/ngx_http_request_body.c src/http/ngx_http_request_body.c
--- src/http/ngx_http_request_body.c 2014-12-19 15:33:48.000000000 +0530
+++ src/http/ngx_http_request_body.c 2015-01-02 00:53:37.000000000 +0530
@@ -27,6 +27,7 @@
static ngx_int_t ngx_http_request_body_save_filter(ngx_http_request_t *r,
ngx_chain_t *in);

+static void ngx_http_full_body_timer_handler(ngx_event_t *wev);

ngx_int_t
ngx_http_read_client_request_body(ngx_http_request_t *r,
@@ -355,6 +356,15 @@
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
ngx_add_timer(c->read, clcf->client_body_timeout);

+ if (c->read_full == NULL) {
+ c->read_full=ngx_pcalloc(c->pool, sizeof(ngx_event_t));
+ c->read_full->handler = ngx_http_full_body_timer_handler;
+ c->read_full->data = r;
+ c->read_full->log = r->connection->log;
+ ngx_add_timer(c->read_full, 10000);
+ }
+
+
if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
@@ -1081,3 +1091,13 @@

return NGX_OK;
}
+
+static void ngx_http_full_body_timer_handler(ngx_event_t *wev)
+{
+ if (wev->timedout) {
+ ngx_http_request_t *r;
+ r = wev->data;
+ //ngx_close_connection(r->connection);
+ ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);
+ }
+}
diff -bur src/http/ngx_http_request.c src/http/ngx_http_request.c
--- src/http/ngx_http_request.c 2014-12-19 15:33:48.000000000 +0530
+++ src/http/ngx_http_request.c 2015-01-02 00:24:32.000000000 +0530
@@ -2263,6 +2263,10 @@
if (c->write->timer_set) {
ngx_del_timer(c->write);
}
+
+ if (c->read_full->timer_set) {
+ ngx_del_timer(c->read_full);
+ }
}

c->read->handler = ngx_http_request_handler;
@@ -2376,6 +2380,10 @@
ngx_del_timer(c->write);
}

+ if (c->read_full->timer_set) {
+ ngx_del_timer(c->read_full);
+ }
+
if (c->read->eof) {
ngx_http_close_request(r, 0);
return;
Subject Author Posted

Timeout for whole request body

saravsars January 01, 2015 02:44PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 209
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready