Mercurial > hg > nginx
diff src/http/ngx_http_request_body.c @ 293:ec3c049681fd
nginx-0.0.3-2004-03-19-08:25:53 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 19 Mar 2004 05:25:53 +0000 |
parents | a472bfb778b3 |
children | 5cfd65b8b0a7 |
line wrap: on
line diff
--- a/src/http/ngx_http_request_body.c +++ b/src/http/ngx_http_request_body.c @@ -6,11 +6,13 @@ static void ngx_http_read_client_request_body_handler(ngx_event_t *rev); +static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r); ngx_int_t ngx_http_read_client_request_body(ngx_http_request_t *r, size_t request_buffer_size) { + ngx_int_t rc; ssize_t size; ngx_hunk_t *h; ngx_chain_t *cl; @@ -48,11 +50,6 @@ ngx_int_t ngx_http_read_client_request_b ngx_test_null(r->request_body_hunk, ngx_create_temp_hunk(r->pool, size), NGX_ERROR); - r->connection->read->event_handler = - ngx_http_read_client_request_body_handler; - - ngx_http_read_client_request_body_handler(r->connection->read); - ngx_alloc_link_and_set_hunk(cl, r->request_body_hunk, r->pool, NGX_ERROR); @@ -63,25 +60,39 @@ ngx_int_t ngx_http_read_client_request_b r->request_hunks = cl; } - if (r->request_body_len) { - return NGX_AGAIN; - } + r->connection->read->event_handler = + ngx_http_read_client_request_body_handler; - return NGX_OK; + return ngx_http_do_read_client_request_body(r); } static void ngx_http_read_client_request_body_handler(ngx_event_t *rev) { + ngx_int_t rc; + ngx_connection_t *c; + ngx_http_request_t *r; + + c = rev->data; + r = c->data; + + rc = ngx_http_do_read_client_request_body(r); + + if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { + ngx_http_finalize_request(r, rc); + } +} + + +static ngx_int_t ngx_http_do_read_client_request_body(ngx_http_request_t *r) +{ size_t size; ssize_t n; ngx_hunk_t *h; ngx_connection_t *c; - ngx_http_request_t *r; ngx_http_core_loc_conf_t *clcf; - c = rev->data; - r = c->data; + c = r->connection; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http read client request body"); @@ -95,8 +106,7 @@ static void ngx_http_read_client_request /* TODO: n == 0 or not complete and level event */ if (n == NGX_ERROR) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + return NGX_HTTP_INTERNAL_SERVER_ERROR; } r->temp_file->offset += n; @@ -113,15 +123,18 @@ static void ngx_http_read_client_request n = ngx_recv(c, r->request_body_hunk->last, size); + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http client request body recv " SIZE_T_FMT, n); + if (n == NGX_AGAIN) { clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - ngx_add_timer(rev, clcf->client_body_timeout); + ngx_add_timer(c->read, clcf->client_body_timeout); - if (ngx_handle_read_event(rev, 0) == NGX_ERROR) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; } - return; + return NGX_AGAIN; } if (n == 0) { @@ -130,8 +143,7 @@ static void ngx_http_read_client_request } if (n == 0 || n == NGX_ERROR) { - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return; + return NGX_HTTP_BAD_REQUEST; } r->request_body_hunk->last += n; @@ -142,8 +154,12 @@ static void ngx_http_read_client_request } } + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, + "http client request body left " SIZE_T_FMT, + r->request_body_len); + if (r->request_body_len) { - return; + return NGX_AGAIN; } if (r->temp_file->file.fd != NGX_INVALID_FILE) { @@ -156,14 +172,12 @@ static void ngx_http_read_client_request /* TODO: n == 0 or not complete and level event */ if (n == NGX_ERROR) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + return NGX_HTTP_INTERNAL_SERVER_ERROR; } h = ngx_calloc_hunk(r->pool); if (h == NULL) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + return NGX_HTTP_INTERNAL_SERVER_ERROR; } h->type = NGX_HUNK_FILE; @@ -180,4 +194,6 @@ static void ngx_http_read_client_request } r->request_body_handler(r->data); + + return NGX_OK; }