Mercurial > hg > nginx-mail
diff src/http/ngx_http_request_body.c @ 665:0b460e61bdcd default tip
Merge with nginx 1.0.0.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 25 Apr 2011 04:22:17 +0400 |
parents | 1dcf6adad484 |
children |
line wrap: on
line diff
--- a/src/http/ngx_http_request_body.c +++ b/src/http/ngx_http_request_body.c @@ -13,7 +13,6 @@ static void ngx_http_read_client_request static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r); static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r, ngx_chain_t *body); -static void ngx_http_read_discarded_request_body_handler(ngx_http_request_t *r); static ngx_int_t ngx_http_read_discarded_request_body(ngx_http_request_t *r); static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r); @@ -460,6 +459,7 @@ ngx_http_discard_request_body(ngx_http_r if (size) { if (r->headers_in.content_length_n > size) { + r->header_in->pos += size; r->headers_in.content_length_n -= size; } else { @@ -469,23 +469,26 @@ ngx_http_discard_request_body(ngx_http_r } } - r->discard_body = 1; - - r->read_event_handler = ngx_http_read_discarded_request_body_handler; + r->read_event_handler = ngx_http_discarded_request_body_handler; if (ngx_handle_read_event(rev, 0) != NGX_OK) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } - r->count++; - (void) ngx_http_read_discarded_request_body(r); + if (ngx_http_read_discarded_request_body(r) == NGX_OK) { + r->lingering_close = 0; + + } else { + r->count++; + r->discard_body = 1; + } return NGX_OK; } -static void -ngx_http_read_discarded_request_body_handler(ngx_http_request_t *r) +void +ngx_http_discarded_request_body_handler(ngx_http_request_t *r) { ngx_int_t rc; ngx_msec_t timer; @@ -499,7 +502,7 @@ ngx_http_read_discarded_request_body_han if (rev->timedout) { c->timedout = 1; c->error = 1; - ngx_http_finalize_request(r, 0); + ngx_http_finalize_request(r, NGX_ERROR); return; } @@ -508,7 +511,8 @@ ngx_http_read_discarded_request_body_han if (timer <= 0) { r->discard_body = 0; - ngx_http_finalize_request(r, 0); + r->lingering_close = 0; + ngx_http_finalize_request(r, NGX_ERROR); return; } @@ -519,13 +523,9 @@ ngx_http_read_discarded_request_body_han rc = ngx_http_read_discarded_request_body(r); if (rc == NGX_OK) { - r->discard_body = 0; - - if (r->done) { - ngx_http_finalize_request(r, 0); - } - + r->lingering_close = 0; + ngx_http_finalize_request(r, NGX_DONE); return; } @@ -533,7 +533,7 @@ ngx_http_read_discarded_request_body_han if (ngx_handle_read_event(rev, 0) != NGX_OK) { c->error = 1; - ngx_http_finalize_request(r, rc); + ngx_http_finalize_request(r, NGX_ERROR); return; } @@ -562,12 +562,16 @@ ngx_http_read_discarded_request_body(ngx ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http read discarded body"); - do { + for ( ;; ) { if (r->headers_in.content_length_n == 0) { r->read_event_handler = ngx_http_block_reading; return NGX_OK; } + if (!r->connection->read->ready) { + return NGX_AGAIN; + } + size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ? NGX_HTTP_DISCARD_BUFFER_SIZE: (size_t) r->headers_in.content_length_n; @@ -588,10 +592,7 @@ ngx_http_read_discarded_request_body(ngx } r->headers_in.content_length_n -= n; - - } while (r->connection->read->ready); - - return NGX_AGAIN; + } }