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 | 156 |
1 files changed, 110 insertions, 46 deletions
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c index baecb2531..962dcbfbd 100644 --- a/src/http/modules/proxy/ngx_http_proxy_handler.c +++ b/src/http/modules/proxy/ngx_http_proxy_handler.c @@ -8,6 +8,10 @@ +static void ngx_http_proxy_send_request(ngx_event_t *wev); +static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf); + + static ngx_command_t ngx_http_proxy_commands[] = { ngx_null_command }; @@ -20,12 +24,11 @@ ngx_http_module_t ngx_http_proxy_module_ctx = { NULL, /* create server configuration */ NULL, /* merge server configuration */ + ngx_http_proxy_create_loc_conf, /* create location configration */ #if 0 - ngx_http_proxy_create_conf, /* create location configration */ ngx_http_proxy_merge_conf /* merge location configration */ #endif - NULL, NULL }; @@ -46,24 +49,25 @@ static int ngx_http_proxy_handler(ngx_http_request_t *r) { - int rc; - ngx_http_proxy_ctx_t *p; - ngx_peer_connection_t *pc; - + int rc; + ngx_http_proxy_ctx_t *p; + ngx_http_proxy_loc_conf_t *lcf; ngx_http_create_ctx(r, p, ngx_http_proxy_module, sizeof(ngx_http_proxy_ctx_t), NGX_HTTP_INTERNAL_SERVER_ERROR); - - p->action = "connecting to upstream"; - p->request = r; - + p->lcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); #if 0 - pc->peers = lcf->peers; + create_request; #endif + p->action = "connecting to upstream"; + p->request = r; + p->upstream.peers = p->lcf->peers; + + /* TODO: change log->data, how to restore log->data ? */ p->upstream.log = r->connection->log; do { @@ -74,56 +78,89 @@ int ngx_http_proxy_handler(ngx_http_request_t *r) } if (rc == NGX_OK) { - send_proxy_request(p); - return NGX_OK; + ngx_http_proxy_send_request(p->upstream.connection->write); + /* ??? */ return NGX_OK; } - if (rc == NGX_AGAIN && p->upstream.connection) { - return NGX_OK; + if (rc == NGX_AGAIN) { + /* ??? */ return NGX_OK; } + /* rc == NGX_CONNECT_FAILED */ + + ngx_event_connect_peer_failed(&p->upstream); + } while (p->upstream.tries); return NGX_HTTP_BAD_GATEWAY; } -#if 0 - -ngx_http_proxy_connect() - do { - ngx_event_connect_peer() - if error - return error - if ok - return ok - if again - return again - - /* next */ - while (tries) -} +static void ngx_http_proxy_send_request(ngx_event_t *wev) +{ + int rc; + ngx_chain_t *chain; + ngx_connection_t *c; + ngx_http_proxy_ctx_t *p; + c = wev->data; + p = c->data; -ngx_http_proxy_send_request(ngx_event_t *wev) for ( ;; ) { - send - if ok - ??? - if again - return - if error - close - ngx_http_proxy_connect() - if ok - continue - if error - return - if again - return - } + chain = ngx_write_chain(c, p->request_hunks); + if (chain == (ngx_chain_t *) -1) { + ngx_http_proxy_close_connection(c); + + do { + rc = ngx_event_connect_peer(&p->upstream); + + if (rc == NGX_OK) { +#if 0 + copy chain and hunks p->request_hunks from p->initial_request_hunks; #endif + c = p->connection; + wev = c->write; + + break; + } + + if (rc == NGX_ERROR) { + ngx_http_finalize_request(p->request, + NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + if (rc == NGX_AGAIN) { + return; + } + + /* rc == NGX_CONNECT_FAILED */ + + ngx_event_connect_peer_failed(&p->upstream); + + } while (p->upstream.tries); + + return; + + } else { + p->request_hunks = chain; + + ngx_del_timer(wev); + + if (chain) { + ngx_add_timer(wev, p->lcf->send_timeout); + wev->timer_set = 1; + + } else { + wev->timer_set = 0; + /* TODO: del event */ + } + + return; + } + } +} static size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len) @@ -137,3 +174,30 @@ static size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len) p->request->connection->addr_text.data, p->request->unparsed_uri.data); } + + +static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf) +{ + ngx_http_proxy_loc_conf_t *conf; + + ngx_test_null(conf, + ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t)), + NGX_CONF_ERROR); + + /* STUB */ + ngx_test_null(conf->peers, ngx_pcalloc(cf->pool, sizeof(ngx_peers_t)), + NGX_CONF_ERROR); + + conf->peers->number = 1; + conf->peers->peers[0].addr = inet_addr("127.0.0.1"); + conf->peers->peers[0].host.data = "localhost"; + conf->peers->peers[0].host.len = sizeof("localhost") - 1; + conf->peers->peers[0].port = htons(9000); + conf->peers->peers[0].addr_port_text.data = "127.0.0.1:9000"; + conf->peers->peers[0].addr_port_text.len = sizeof("127.0.0.1:9000") - 1; + + conf->send_timeout = 30000; + /* */ + + return conf; +} |