diff options
author | Igor Sysoev <igor@sysoev.ru> | 2004-12-02 18:40:46 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2004-12-02 18:40:46 +0000 |
commit | 42b12b34fa74c15cfb1746d71cde949f3d5807ef (patch) | |
tree | c44cd3f35d794e6e2be01d516e72737464f76fff /src/http/modules/proxy/ngx_http_proxy_handler.c | |
parent | 4e7b11b02bd42ed284a5f006a13b0635fc33d556 (diff) | |
download | nginx-42b12b34fa74c15cfb1746d71cde949f3d5807ef.tar.gz nginx-42b12b34fa74c15cfb1746d71cde949f3d5807ef.zip |
nginx-0.1.11-RELEASE importrelease-0.1.11
*) Feature: the worker_priority directive.
*) Change: both tcp_nopush and tcp_nodelay directives affect the
transferred response.
*) Bugfix: nginx did not call initgroups().
Thanks to Andrew Sitnikov and Andrei Nigmatulin.
*) Change: now the ngx_http_autoindex_module shows the file size in the
bytes.
*) Bugfix: the ngx_http_autoindex_module returned the 500 error if the
broken symlink was in a directory.
*) Bugfix: the files bigger than 4G could not be transferred using
sendfile.
*) Bugfix: if the backend was resolved to several backends and there
was an error while the response waiting then process may got caught
in an endless loop.
*) Bugfix: the worker process may exit with the "unknown cycle" message
when the /dev/poll method was used.
*) Bugfix: "close() channel failed" errors.
*) Bugfix: the autodetection of the "nobody" and "nogroup" groups.
*) Bugfix: the send_lowat directive did not work on Linux.
*) Bugfix: the segmentation fault occurred if there was no events
section in configuration.
*) Bugfix: nginx could not be built on OpenBSD.
*) Bugfix: the double slashes in "://" in the URI were converted to
":/".
Diffstat (limited to 'src/http/modules/proxy/ngx_http_proxy_handler.c')
-rw-r--r-- | src/http/modules/proxy/ngx_http_proxy_handler.c | 178 |
1 files changed, 122 insertions, 56 deletions
diff --git a/src/http/modules/proxy/ngx_http_proxy_handler.c b/src/http/modules/proxy/ngx_http_proxy_handler.c index 425a1a6af..651dfa67b 100644 --- a/src/http/modules/proxy/ngx_http_proxy_handler.c +++ b/src/http/modules/proxy/ngx_http_proxy_handler.c @@ -275,12 +275,9 @@ ngx_module_t ngx_http_proxy_module = { static ngx_http_log_op_name_t ngx_http_proxy_log_fmt_ops[] = { - { ngx_string("proxy"), /* STUB */ 100, - ngx_http_proxy_log_proxy_state }, - { ngx_string("proxy_cache_state"), sizeof("BYPASS") - 1, - ngx_http_proxy_log_cache_state }, - { ngx_string("proxy_reason"), sizeof("BPS") - 1, - ngx_http_proxy_log_reason }, + { ngx_string("proxy"), 0, ngx_http_proxy_log_proxy_state }, + { ngx_string("proxy_cache_state"), 0, ngx_http_proxy_log_cache_state }, + { ngx_string("proxy_reason"), 0, ngx_http_proxy_log_reason }, { ngx_null_string, 0, NULL } }; @@ -792,111 +789,180 @@ u_char *ngx_http_proxy_log_error(void *data, u_char *buf, size_t len) static u_char *ngx_http_proxy_log_proxy_state(ngx_http_request_t *r, u_char *buf, uintptr_t data) { - ngx_http_proxy_ctx_t *p; + ngx_uint_t i; + ngx_http_proxy_ctx_t *p; + ngx_http_proxy_state_t *state; p = ngx_http_get_module_err_ctx(r, ngx_http_proxy_module); if (p == NULL) { + if (buf == NULL) { + return (u_char *) 1; + } + *buf = '-'; return buf + 1; } - if (p->state->cache_state == 0) { - *buf++ = '-'; - } else { - buf = ngx_cpymem(buf, cache_states[p->state->cache_state - 1].data, - cache_states[p->state->cache_state - 1].len); + if (buf == NULL) { + /* find the request line length */ + return (u_char *) (uintptr_t) (p->states.nelts * /* STUB */ 100); } - *buf++ = '/'; - if (p->state->expired == 0) { - *buf++ = '-'; + i = 0; + state = p->states.elts; - } else { - buf = ngx_sprintf(buf, "%T", p->state->expired); - } + for ( ;; ) { + if (state[i].cache_state == 0) { + *buf++ = '-'; - *buf++ = '/'; + } else { + buf = ngx_cpymem(buf, cache_states[state[i].cache_state - 1].data, + cache_states[state[i].cache_state - 1].len); + } - if (p->state->bl_time == 0) { - *buf++ = '-'; + *buf++ = '/'; - } else { - buf = ngx_sprintf(buf, "%T", p->state->bl_time); - } + if (state[i].expired == 0) { + *buf++ = '-'; - *buf++ = '/'; + } else { + buf = ngx_sprintf(buf, "%T", state[i].expired); + } - *buf++ = '*'; + *buf++ = '/'; - *buf++ = ' '; + if (state[i].bl_time == 0) { + *buf++ = '-'; - if (p->state->status == 0) { - *buf++ = '-'; + } else { + buf = ngx_sprintf(buf, "%T", state[i].bl_time); + } - } else { - buf = ngx_sprintf(buf, "%ui", p->state->status); - } + *buf++ = '/'; - *buf++ = '/'; + *buf++ = '*'; - if (p->state->reason == 0) { - *buf++ = '-'; + *buf++ = ' '; - } else { - buf = ngx_cpymem(buf, cache_reasons[p->state->reason - 1].data, - cache_reasons[p->state->reason - 1].len); - } + if (state[i].status == 0) { + *buf++ = '-'; + + } else { + buf = ngx_sprintf(buf, "%ui", state[i].status); + } - *buf++ = '/'; + *buf++ = '/'; - if (p->state->reason < NGX_HTTP_PROXY_CACHE_XAE) { - *buf++ = '-'; + if (state[i].reason == 0) { + *buf++ = '-'; - } else { - buf = ngx_sprintf(buf, "%T", p->state->expires); - } + } else { + buf = ngx_cpymem(buf, cache_reasons[state[i].reason - 1].data, + cache_reasons[state[i].reason - 1].len); + } + + *buf++ = '/'; + + if (state[i].reason < NGX_HTTP_PROXY_CACHE_XAE) { + *buf++ = '-'; + + } else { + buf = ngx_sprintf(buf, "%T", state[i].expires); + } - *buf++ = ' '; - *buf++ = '*'; + *buf++ = ' '; + *buf++ = '*'; - return buf; + if (++i == p->states.nelts) { + return buf; + } + + *buf++ = ','; + *buf++ = ' '; + } } static u_char *ngx_http_proxy_log_cache_state(ngx_http_request_t *r, u_char *buf, uintptr_t data) { - ngx_http_proxy_ctx_t *p; + ngx_uint_t i; + ngx_http_proxy_ctx_t *p; + ngx_http_proxy_state_t *state; p = ngx_http_get_module_err_ctx(r, ngx_http_proxy_module); if (p == NULL || p->state->cache_state == 0) { + if (buf == NULL) { + return (u_char *) 1; + } + *buf = '-'; return buf + 1; } - return ngx_cpymem(buf, cache_states[p->state->cache_state - 1].data, - cache_states[p->state->cache_state - 1].len); + if (buf == NULL) { + /* find the request line length */ + return (u_char *) (p->states.nelts * sizeof("BYPASS") - 1); + } + + i = 0; + state = p->states.elts; + + for ( ;; ) { + buf = ngx_cpymem(buf, cache_states[state[i].cache_state - 1].data, + cache_states[state[i].cache_state - 1].len); + + if (++i == p->states.nelts) { + return buf; + } + + *buf++ = ','; + *buf++ = ' '; + } } static u_char *ngx_http_proxy_log_reason(ngx_http_request_t *r, u_char *buf, uintptr_t data) { - ngx_http_proxy_ctx_t *p; + ngx_uint_t i; + ngx_http_proxy_ctx_t *p; + ngx_http_proxy_state_t *state; p = ngx_http_get_module_err_ctx(r, ngx_http_proxy_module); if (p == NULL || p->state->reason == 0) { + if (buf == NULL) { + return (u_char *) 1; + } + *buf = '-'; return buf + 1; } - return ngx_cpymem(buf, cache_reasons[p->state->reason - 1].data, - cache_reasons[p->state->reason - 1].len); + if (buf == NULL) { + /* find the request line length */ + return (u_char *) (p->states.nelts * sizeof("BPS") - 1); + } + + i = 0; + state = p->states.elts; + + for ( ;; ) { + buf = ngx_cpymem(buf, cache_reasons[state[i].reason - 1].data, + cache_reasons[state[i].reason - 1].len); + + if (++i == p->states.nelts) { + return buf; + } + + *buf++ = ','; + *buf++ = ' '; + } } @@ -1387,9 +1453,8 @@ static char *ngx_http_proxy_parse_upstream(ngx_str_t *url, static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data) { - ssize_t *np = data; - #if (NGX_FREEBSD) + ssize_t *np = data; if (*np >= ngx_freebsd_net_inet_tcp_sendspace) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, @@ -1401,6 +1466,7 @@ static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data) } #elif !(NGX_HAVE_SO_SNDLOWAT) + ssize_t *np = data; ngx_conf_log_error(NGX_LOG_WARN, cf, 0, "\"proxy_send_lowat\" is not supported, ignored"); |