]> git.kaiwu.me - nginx.git/commitdiff
Request body: improved handling of incorrect chunked request body.
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 26 Nov 2012 18:00:14 +0000 (18:00 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 26 Nov 2012 18:00:14 +0000 (18:00 +0000)
While discarding chunked request body in some cases after detecting
request body corruption no error was returned, while it was possible
to correctly return 400 Bad Request.  If error is detected too late,
make sure to properly close connection.

Additionally, in ngx_http_special_response_handler() don't return body
of 500 Internal Server Error to a client if ngx_http_discard_request_body()
fails, but disable keepalive and continue.

src/http/ngx_http_request_body.c
src/http/ngx_http_special_response.c

index 90da110054ad6a13f5a688ea9c4f9c25359d5fe8..0b2f89ff538b9101a065ca8d962a2f026247d9b4 100644 (file)
@@ -471,12 +471,18 @@ ngx_http_discard_request_body(ngx_http_request_t *r)
         }
     }
 
-    if (ngx_http_read_discarded_request_body(r) == NGX_OK) {
+    rc = ngx_http_read_discarded_request_body(r);
+
+    if (rc == NGX_OK) {
         r->lingering_close = 0;
         return NGX_OK;
     }
 
-    /* == NGX_AGAIN */
+    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
+        return rc;
+    }
+
+    /* rc == NGX_AGAIN */
 
     r->read_event_handler = ngx_http_discarded_request_body_handler;
 
@@ -533,6 +539,12 @@ ngx_http_discarded_request_body_handler(ngx_http_request_t *r)
         return;
     }
 
+    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
+        c->error = 1;
+        ngx_http_finalize_request(r, NGX_ERROR);
+        return;
+    }
+
     /* rc == NGX_AGAIN */
 
     if (ngx_handle_read_event(rev, 0) != NGX_OK) {
@@ -606,8 +618,7 @@ ngx_http_read_discarded_request_body(ngx_http_request_t *r)
         rc = ngx_http_discard_request_body_filter(r, &b);
 
         if (rc != NGX_OK) {
-            r->connection->error = 1;
-            return NGX_OK;
+            return rc;
         }
     }
 }
index 318b52be2730bc8818744947e1c940d182ac09f1..875c24d9c75518000c0cab3309ae792c1790a979 100644 (file)
@@ -421,7 +421,7 @@ ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
     r->expect_tested = 1;
 
     if (ngx_http_discard_request_body(r) != NGX_OK) {
-        error = NGX_HTTP_INTERNAL_SERVER_ERROR;
+        r->keepalive = 0;
     }
 
     if (clcf->msie_refresh