diff options
Diffstat (limited to 'src/http/modules/proxy/ngx_http_proxy_handler.c')
-rw-r--r-- | src/http/modules/proxy/ngx_http_proxy_handler.c | 88 |
1 files changed, 66 insertions, 22 deletions
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c index 0bb3cce40..b4a0d425d 100644 --- a/src/http/modules/proxy/ngx_http_proxy_handler.c +++ b/src/http/modules/proxy/ngx_http_proxy_handler.c @@ -175,7 +175,6 @@ static char connection_close_header[] = "Connection: close" CRLF; static int ngx_http_proxy_handler(ngx_http_request_t *r) { - int rc; ngx_http_proxy_ctx_t *p; ngx_http_create_ctx(r, p, ngx_http_proxy_module, @@ -208,11 +207,9 @@ static int ngx_http_proxy_handler(ngx_http_request_t *r) r->request_body_handler = ngx_http_proxy_init_request; r->data = p; - rc = ngx_http_read_client_request_body(r, p->lcf->request_buffer_size); + ngx_http_read_client_request_body(r, p->lcf->request_buffer_size); - if (rc != NGX_OK) { - return rc; - } + return NGX_DONE; } ngx_http_proxy_init_request(p); @@ -227,16 +224,31 @@ static void ngx_http_proxy_init_request(void *data) ngx_chain_t *cl; ngx_http_request_t *r; - ngx_output_chain_ctx_t *ctx; + ngx_output_chain_ctx_t *out_ctx; + ngx_chain_write_ctx_t *write_ctx; r = p->request; +ngx_log_debug(r->connection->log, "timer_set: %d" _ + r->connection->read->timer_set); + + if (r->connection->read->timer_set) { + ngx_del_timer(r->connection->read); + } + + ngx_is_null(cl, ngx_http_proxy_create_request(p)) { + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + +#if 0 cl = ngx_http_proxy_create_request(p); if (cl == NULL) { ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } +#endif if (r->request_hunks) { cl->next = r->request_hunks; @@ -251,28 +263,36 @@ static void ngx_http_proxy_init_request(void *data) r->connection->log->handler = ngx_http_proxy_log_error; p->action = "connecting to upstream"; - ctx = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t)); - if (ctx == NULL) { + out_ctx = ngx_pcalloc(r->pool, sizeof(ngx_output_chain_ctx_t)); + if (out_ctx == NULL) { ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR); } - p->output_chain_ctx = ctx; + p->output_chain_ctx = out_ctx; if (r->request_body_hunk) { - ctx->free = ngx_alloc_chain_link(r->pool); - if (ctx->free == NULL) { + out_ctx->free = ngx_alloc_chain_link(r->pool); + if (out_ctx->free == NULL) { ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR); } - ctx->free->hunk = r->request_body_hunk; - ctx->free->next = NULL; + out_ctx->free->hunk = r->request_body_hunk; + out_ctx->free->next = NULL; + } + + out_ctx->sendfile = r->sendfile; + out_ctx->pool = r->pool; + out_ctx->bufs.num = 1; + out_ctx->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module; + out_ctx->output_filter = (ngx_output_chain_filter_pt) ngx_chain_write; + + write_ctx = ngx_pcalloc(r->pool, sizeof(ngx_chain_write_ctx_t)); + if (write_ctx == NULL) { + ngx_http_proxy_finalize_request(p, NGX_HTTP_INTERNAL_SERVER_ERROR); } - ctx->sendfile = r->sendfile; - ctx->copy_chain = 1; - ctx->pool = r->pool; - ctx->bufs.num = 1; - ctx->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module; - ctx->output_filter = (ngx_output_chain_filter_pt) ngx_write_chain; + out_ctx->output_ctx = write_ctx; + write_ctx->pool = r->pool; + write_ctx->last = &write_ctx->out; ngx_http_proxy_send_request(p); } @@ -418,15 +438,19 @@ static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p) int rc; ngx_chain_t *cl; ngx_connection_t *c; + ngx_chain_write_ctx_t *ctx; c = p->upstream.connection; for ( ;; ) { if (c) { - p->output_chain_ctx->output_ctx = c; + p->action = "sending request to upstream"; + ctx = p->output_chain_ctx->output_ctx; + ctx->connection = c; rc = ngx_output_chain(p->output_chain_ctx, - p->request->request_hunks); + !p->request_sent ? p->request->request_hunks: + NULL); if (rc != NGX_ERROR) { p->request_sent = 1; @@ -438,8 +462,23 @@ static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p) if (rc == NGX_AGAIN) { ngx_add_timer(c->write, p->lcf->send_timeout); + if (ngx_handle_write_event(c->write, /* STUB: lowat */ 0) + == NGX_ERROR) + { + ngx_http_proxy_finalize_request(p, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + } else { - /* TODO: del event */ + + /* rc == NGX_OK */ + + if (ngx_handle_level_write_event(c->write) == NGX_ERROR) { + ngx_http_proxy_finalize_request(p, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } if (c->tcp_nopush) { if (ngx_tcp_push(c->fd) == NGX_ERROR) { @@ -462,6 +501,8 @@ static void ngx_http_proxy_send_request(ngx_http_proxy_ctx_t *p) } for ( ;; ) { + p->action = "connecting to upstream"; + rc = ngx_event_connect_peer(&p->upstream); if (rc == NGX_ERROR) { @@ -1245,6 +1286,9 @@ ngx_log_debug(p->request->connection->log, "FATAL ERROR IN NEXT UPSTREAM"); static void ngx_http_proxy_finalize_request(ngx_http_proxy_ctx_t *p, int rc) { + ngx_log_debug(p->request->connection->log, + "finalize http proxy request"); + if (p->upstream.connection) { ngx_http_proxy_close_connection(p->upstream.connection); p->upstream.connection = NULL; |