*) Feature: nginx now logs the subrequest information to the error log.
*) Feature: the "proxy_next_upstream", "fastcgi_next_upstream", and
"memcached_next_upstream" directives support the "off" parameter.
*) Feature: the "debug_connection" directive supports the CIDR address
form.
*) Bugfix: if a response of proxied server or FastCGI server was
converted from UTF-8 or back, then it may be transferred incomplete.
*) Bugfix: the $upstream_response_time variable had the time of the
first request to a backend only.
*) Bugfix: nginx could not be built on amd64 platform; the bug had
appeared in 0.3.53.
done
ngx_all_objs=`echo $ngx_all_srcs \
- | sed -e "s/\([^ ]*\.\)cpp/$NGX_OBJS\/\1$ngx_objext/g" \
- -e "s/\([^ ]*\.\)cc/$NGX_OBJS\/\1$ngx_objext/g" \
- -e "s/\([^ ]*\.\)c/$NGX_OBJS\/\1$ngx_objext/g" \
- -e "s/\([^ ]*\.\)S/$NGX_OBJS\/\1$ngx_objext/g"`
+ | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \
+ -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \
+ -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \
+ -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"`
ngx_modules_c=`echo $NGX_MODULES_C | sed -e "s/\//$ngx_regex_dirsep/g"`
do
ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
ngx_obj=`echo $ngx_src \
- | sed -e "s/^\(.*\.\)cpp$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)cc$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)c$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)S$/$ngx_objs_dir\1$ngx_objext/g"`
+ | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`
cat << END >> $NGX_MAKEFILE
do
ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
ngx_obj=`echo $ngx_src \
- | sed -e "s/^\(.*\.\)cpp$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)cc$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)c$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)S$/$ngx_objs_dir\1$ngx_objext/g"`
+ | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`
cat << END >> $NGX_MAKEFILE
do
ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
ngx_obj=`echo $ngx_src \
- | sed -e "s/^\(.*\.\)cpp$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)cc$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)c$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)S$/$ngx_objs_dir\1$ngx_objext/g"`
+ | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`
cat << END >> $NGX_MAKEFILE
| sed -e "s/\//$ngx_regex_dirsep/g"`
ngx_obj=`echo $ngx_obj \
- | sed -e "s/^\(.*\.\)cpp$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)cc$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)c$/$ngx_objs_dir\1$ngx_objext/g" \
- -e "s/^\(.*\.\)S$/$ngx_objs_dir\1$ngx_objext/g"`
+ | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \
+ -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`
ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
# POSIX types
-NGX_INCLUDE_AUTO_CONFIG_H="#include \"../$NGX_AUTO_CONFIG_H\""
+case "$NGX_AUTO_CONFIG_H" in
+ /*)
+ NGX_INCLUDE_AUTO_CONFIG_H="#include \"$NGX_AUTO_CONFIG_H\""
+ ;;
+ *)
+ NGX_INCLUDE_AUTO_CONFIG_H="#include \"../$NGX_AUTO_CONFIG_H\""
+ ;;
+esac
ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef
<title lang="en">nginx changelog</title>
+<changes ver="0.3.54" date="11.07.2006">
+
+<change type="feature">
+<para lang="ru">
+nginx ÔÅÐÅÒØ ÚÁÐÉÓÙ×ÁÅÔ × ÌÏÇ ÉÎÆÏÒÍÁÃÉÀ Ï ÐÏÄÚÁÐÒÏÓÁÈ.
+</para>
+<para lang="en">
+nginx now logs the subrequest information to the error log.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+ÄÉÒÅËÔÉ×Ù proxy_next_upstream, fastcgi_next_upstream É memcached_next_upstream
+ÐÏÄÄÅÒÖÉ×ÁÀÔ ÐÁÒÁÍÅÔÒ off.
+</para>
+<para lang="en">
+the "proxy_next_upstream", "fastcgi_next_upstream",
+and "memcached_next_upstream" directives support the "off" parameter.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+ÄÉÒÅËÔÉ×Á debug_connection ÐÏÄÄÅÒÖÉ×ÁÅÔ ÚÁÐÉÓØ ÁÄÒÅÓÏ× × ÆÏÒÍÁÔÅ CIDR.
+</para>
+<para lang="en">
+the "debug_connection" directive supports the CIDR address form.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+ÐÒÉ ÐÅÒÅËÏÄÉÒÏ×ÁÎÉÉ ÏÔ×ÅÔÁ ÐÒÏËÓÉÒÏ×ÁÎÎÏÇÏ ÓÅÒ×ÅÒÁ ÉÌÉ ÓÅÒ×ÅÒÁ FastCGI
+× UTF-8 ÉÌÉ ÎÁÏÂÏÒÏÔ ÏÔ×ÅÔ ÍÏÇ ÐÅÒÅÄÁ×ÁÔØÓÑ ÎÅ ÐÏÌÎÏÓÔØÀ.
+</para>
+<para lang="en">
+if a response of proxied server or FastCGI server was converted from UTF-8
+or back, then it may be transferred incomplete.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+ÐÅÒÅÍÅÎÎÁÑ $upstream_response_time ÓÏÄÅÒÖÁÌÁ ×ÒÅÍÑ ÔÏÌØËÏ ÐÅÒ×ÏÇÏ
+ÏÂÒÁÝÅÎÉÑ Ë ÂÜËÅÎÄÕ.
+</para>
+<para lang="en">
+the $upstream_response_time variable had the time of the first
+request to a backend only.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+nginx ÎÅ ÓÏÂÉÒÁÌÓÑ ÎÁ ÐÌÁÔÆÏÒÍÅ amd64;
+ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ × 0.3.53.
+</para>
+<para lang="en">
+nginx could not be built on amd64 platform;
+bug appeared in 0.3.53.
+</para>
+</change>
+
+</changes>
+
+
<changes ver="0.3.53" date="07.07.2006">
<change type="change">
</para>
<para lang="en">
if a client was successfully authorized using "satisfy_any on", then anyway
-the "access forbidden by rule" message was written in the log.
+the message "access forbidden by rule" was written in the log.
</para>
</change>
#define _NGINX_H_INCLUDED_
-#define NGINX_VER "nginx/0.3.53"
+#define NGINX_VER "nginx/0.3.54"
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
#if (NGX_DEBUG)
ngx_event_conf_t *ecf = conf;
- in_addr_t *addr;
- ngx_str_t *value;
- struct hostent *h;
+ ngx_event_debug_t *dc;
+ ngx_str_t *value;
+ struct hostent *h;
+ ngx_inet_cidr_t in_cidr;
value = cf->args->elts;
/* AF_INET only */
- addr = ngx_array_push(&ecf->debug_connection);
- if (addr == NULL) {
+ dc = ngx_array_push(&ecf->debug_connection);
+ if (dc == NULL) {
return NGX_CONF_ERROR;
}
- *addr = inet_addr((char *) value[1].data);
+ dc->addr = inet_addr((char *) value[1].data);
- if (*addr != INADDR_NONE) {
+ if (dc->addr != INADDR_NONE) {
+ dc->mask = 0xffffffff;
+ return NGX_OK;
+ }
+
+ if (ngx_ptocidr(&value[1], &in_cidr) == NGX_OK) {
+ dc->mask = in_cidr.mask;
+ dc->addr = in_cidr.addr;
return NGX_OK;
}
return NGX_CONF_ERROR;
}
- *addr = *(in_addr_t *)(h->h_addr_list[0]);
+ dc->mask = 0xffffffff;
+ dc->addr = *(in_addr_t *)(h->h_addr_list[0]);
#else
#if (NGX_DEBUG)
if (ngx_array_init(&ecf->debug_connection, cycle->pool, 4,
- sizeof(in_addr_t)) == NGX_ERROR)
+ sizeof(ngx_event_debug_t)) == NGX_ERROR)
{
return NGX_CONF_ERROR;
}
};
+typedef struct {
+ in_addr_t mask;
+ in_addr_t addr;
+} ngx_event_debug_t;
+
+
typedef struct {
ngx_int_t (*add)(ngx_event_t *ev, int event, u_int flags);
ngx_int_t (*del)(ngx_event_t *ev, int event, u_int flags);
wev->own_lock = &c->lock;
#endif
- ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
- "accept: fd:%d c:%d", s, c->number);
-
if (ls->addr_ntop) {
c->addr_text.data = ngx_palloc(c->pool, ls->addr_text_max_len);
if (c->addr_text.data == NULL) {
#if (NGX_DEBUG)
{
- uint32_t *addr;
in_addr_t i;
+ ngx_event_debug_t *dc;
struct sockaddr_in *sin;
sin = (struct sockaddr_in *) sa;
- addr = ecf->debug_connection.elts;
+ dc = ecf->debug_connection.elts;
for (i = 0; i < ecf->debug_connection.nelts; i++) {
- if (addr[i] == sin->sin_addr.s_addr) {
+ if ((sin->sin_addr.s_addr & dc[i].mask) == dc[i].addr) {
log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;
break;
}
}
#endif
+ ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0,
+ "*%d accept: %V fd:%d", c->number, &c->addr_text, s);
+
if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {
if (ngx_add_conn(c) == NGX_ERROR) {
ngx_close_accepted_connection(c);
b = cl->buf;
if (ngx_buf_size(b) == 0) {
+
+ *ll = ngx_alloc_chain_link(r->pool);
+ if (*ll == NULL) {
+ return NGX_ERROR;
+ }
+
+ (*ll)->buf = b;
+ (*ll)->next = NULL;
+
+ ll = &(*ll)->next;
+
continue;
}
{ ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
{ ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
{ ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
+ { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
{ ngx_null_string, 0 }
};
|NGX_HTTP_UPSTREAM_FT_ERROR
|NGX_HTTP_UPSTREAM_FT_TIMEOUT));
+ if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
+ conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
+ |NGX_HTTP_UPSTREAM_FT_OFF;
+ }
+
ngx_conf_merge_uint_value(conf->upstream.max_fails,
prev->upstream.max_fails, 1);
{ ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
{ ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
{ ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
+ { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
{ ngx_null_string, 0 }
};
|NGX_HTTP_UPSTREAM_FT_ERROR
|NGX_HTTP_UPSTREAM_FT_TIMEOUT));
+ if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
+ conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
+ |NGX_HTTP_UPSTREAM_FT_OFF;
+ }
+
ngx_conf_merge_uint_value(conf->upstream.max_fails,
prev->upstream.max_fails, 1);
{ ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
{ ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
{ ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
+ { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
{ ngx_null_string, 0 }
};
|NGX_HTTP_UPSTREAM_FT_ERROR
|NGX_HTTP_UPSTREAM_FT_TIMEOUT));
+ if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
+ conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
+ |NGX_HTTP_UPSTREAM_FT_OFF;
+ }
+
ngx_conf_merge_uint_value(conf->upstream.max_fails,
prev->upstream.max_fails, 1);
typedef ngx_int_t (*ngx_http_header_handler_pt)(ngx_http_request_t *r,
ngx_table_elt_t *h, ngx_uint_t offset);
-typedef u_char *(*ngx_http_log_handler_pt)(ngx_http_request_t *r, u_char *buf,
- size_t len);
+typedef u_char *(*ngx_http_log_handler_pt)(ngx_http_request_t *r,
+ ngx_http_request_t *sr, u_char *buf, size_t len);
#if (NGX_HTTP_CACHE)
struct ngx_http_log_ctx_s {
ngx_str_t *client;
ngx_http_request_t *request;
+ ngx_http_request_t *current_request;
};
{
ngx_connection_t *c;
ngx_http_request_t *sr;
+ ngx_http_log_ctx_t *ctx;
ngx_http_core_srv_conf_t *cscf;
ngx_http_postponed_request_t *pr, *p;
r->postponed = pr;
}
+ ctx = c->log->data;
+ ctx->current_request = sr;
+
sr->internal = 1;
sr->fast_subrequest = 1;
{
ngx_int_t rc;
ngx_chain_t *out;
+ ngx_http_log_ctx_t *ctx;
ngx_http_postponed_request_t *pr;
for ( ;; ) {
"http postpone filter handle \"%V?%V\"",
&pr->request->uri, &pr->request->args);
+ ctx = r->connection->log->data;
+ ctx->current_request = pr->request;
+
if (!pr->request->done) {
r->connection->data = pr->request;
return NGX_AGAIN;
static void ngx_http_close_connection(ngx_connection_t *c);
static u_char *ngx_http_log_error(ngx_log_t *log, u_char *buf, size_t len);
-static u_char *ngx_http_log_error_handler(ngx_http_request_t *r, u_char *buf,
- size_t len);
+static u_char *ngx_http_log_error_handler(ngx_http_request_t *r,
+ ngx_http_request_t *sr, u_char *buf, size_t len);
#if (NGX_HTTP_SSL)
static void ngx_http_ssl_handshake(ngx_event_t *rev);
ctx->client = &c->addr_text;
ctx->request = NULL;
+ ctx->current_request = NULL;
c->log->connection = c->number;
c->log->handler = ngx_http_log_error;
ctx = c->log->data;
ctx->request = r;
+ ctx->current_request = r;
r->log_handler = ngx_http_log_error_handler;
#if (NGX_STAT_STUB)
ngx_int_t rc, rv;
ngx_connection_t *c;
ngx_http_request_t *r;
- ngx_http_log_ctx_t *ctx;
c = rev->data;
r = c->data;
}
if (rv == NGX_DECLINED) {
- ctx = c->log->data;
- ctx->request = r;
-
r->request_line.len = r->header_in->end - r->request_start;
r->request_line.data = r->request_start;
{
ngx_connection_t *c;
ngx_http_request_t *r;
+ ngx_http_log_ctx_t *ctx;
c = ev->data;
r = c->data;
+ ctx = c->log->data;
+ ctx->current_request = r;
+
if (ev->write) {
r->write_event_handler(r);
ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
{
ngx_http_request_t *pr;
+ ngx_http_log_ctx_t *ctx;
ngx_http_core_loc_conf_t *clcf;
if (rc == NGX_DONE) {
r->connection->data = pr;
}
+ ctx = r->connection->log->data;
+ ctx->current_request = pr;
+
if (pr->postponed) {
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
r = ctx->request;
if (r) {
- return r->log_handler(r, p, len);
+ return r->log_handler(r, ctx->current_request, p, len);
}
return p;
static u_char *
-ngx_http_log_error_handler(ngx_http_request_t *r, u_char *buf, size_t len)
+ngx_http_log_error_handler(ngx_http_request_t *r, ngx_http_request_t *sr,
+ u_char *buf, size_t len)
{
- u_char *p;
+ u_char *p;
+ ngx_http_upstream_t *u;
+ ngx_peer_connection_t *peer;
if (r->server_name.data) {
p = ngx_snprintf(buf, len, ", server: %V", &r->server_name);
}
}
+ if (r != sr) {
+ p = ngx_snprintf(buf, len, ", subrequest: \"%V\"", &sr->uri);
+ len -= p - buf;
+ buf = p;
+ }
+
+ u = sr->upstream;
+
+ if (u) {
+ peer = &u->peer;
+
+ p = ngx_snprintf(buf, len, ", upstream: \"%V%V%s%V\"",
+ &u->conf->schema,
+ &peer->peers->peer[peer->cur_peer].name,
+ peer->peers->peer[peer->cur_peer].uri_separator,
+ &u->uri);
+ len -= p - buf;
+ buf = p;
+ }
+
return ngx_http_log_error_info(r, buf, len);
}
rb->bufs->buf = b;
rb->bufs->next = NULL;
- if (preread >= r->headers_in.content_length_n) {
+ if ((off_t) preread >= r->headers_in.content_length_n) {
/* the whole request body was pre-read */
rb->rest = r->headers_in.content_length_n - preread;
- if (rb->rest <= (size_t) (b->end - b->last)) {
+ if (rb->rest <= (off_t) (b->end - b->last)) {
/* the whole request body may be placed in r->header_in */
size = rb->buf->end - rb->buf->last;
- if (size > rb->rest) {
+ if ((off_t) size > rb->rest) {
size = (size_t) rb->rest;
}
static u_char *ngx_http_upstream_log_response_time(ngx_http_request_t *r,
u_char *buf, ngx_http_log_op_t *op);
-static u_char *ngx_http_upstream_log_error(ngx_http_request_t *r, u_char *buf,
- size_t len);
-
static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf);
static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
void
ngx_http_upstream_init(ngx_http_request_t *r)
{
- ngx_time_t *tp;
ngx_connection_t *c;
ngx_http_cleanup_t *cln;
ngx_http_upstream_t *u;
}
u->peer.log = r->connection->log;
- u->saved_log_handler = r->log_handler;
- r->log_handler = ngx_http_upstream_log_error;
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
return;
}
- u->state = ngx_array_push(&u->states);
- if (u->state == NULL) {
- ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
- return;
- }
-
- ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
-
- tp = ngx_timeofday();
-
- u->state->response_time = tp->sec * 1000 + tp->msec;
-
cln = ngx_http_cleanup_add(r, 0);
if (cln == NULL) {
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)
{
ngx_int_t rc;
+ ngx_time_t *tp;
ngx_connection_t *c;
r->connection->log->action = "connecting to upstream";
r->connection->single_connection = 0;
+ if (u->state && u->state->response_time) {
+ tp = ngx_timeofday();
+ u->state->response_time = tp->sec * 1000 + tp->msec
+ - u->state->response_time;
+ }
+
+ u->state = ngx_array_push(&u->states);
+ if (u->state == NULL) {
+ ngx_http_upstream_finalize_request(r, u,
+ NGX_HTTP_INTERNAL_SERVER_ERROR);
+ return;
+ }
+
+ ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
+
+ tp = ngx_timeofday();
+ u->state->response_time = tp->sec * 1000 + tp->msec;
+
rc = ngx_event_connect_peer(&u->peer);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
#endif
- /* add one more state */
-
- u->state = ngx_array_push(&u->states);
- if (u->state == NULL) {
- return NGX_ERROR;
- }
-
- ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t));
-
return NGX_OK;
}
}
#endif
- r->log_handler = u->saved_log_handler;
-
if (rc == NGX_DECLINED) {
return;
}
}
-static u_char *
-ngx_http_upstream_log_error(ngx_http_request_t *r, u_char *buf, size_t len)
-{
- u_char *p;
- ngx_http_upstream_t *u;
- ngx_peer_connection_t *peer;
-
- u = r->upstream;
- peer = &u->peer;
-
- p = ngx_snprintf(buf, len,
- ", server: %V, URL: \"%V\","
- " upstream: \"%V%V%s%V\"",
- &r->server_name,
- &r->unparsed_uri,
- &u->conf->schema,
- &peer->peers->peer[peer->cur_peer].name,
- peer->peers->peer[peer->cur_peer].uri_separator,
- &u->uri);
- len -= p - buf;
- buf = p;
-
- return ngx_http_log_error_info(r, buf, len);
-}
-
-
static ngx_int_t
ngx_http_upstream_add_variables(ngx_conf_t *cf)
{
#include <ngx_http.h>
-#define NGX_HTTP_UPSTREAM_FT_ERROR 0x002
-#define NGX_HTTP_UPSTREAM_FT_TIMEOUT 0x004
-#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER 0x008
-#define NGX_HTTP_UPSTREAM_FT_HTTP_500 0x010
-#define NGX_HTTP_UPSTREAM_FT_HTTP_503 0x020
-#define NGX_HTTP_UPSTREAM_FT_HTTP_404 0x040
-#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x080
-#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x100
+#define NGX_HTTP_UPSTREAM_FT_ERROR 0x00000002
+#define NGX_HTTP_UPSTREAM_FT_TIMEOUT 0x00000004
+#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER 0x00000008
+#define NGX_HTTP_UPSTREAM_FT_HTTP_500 0x00000010
+#define NGX_HTTP_UPSTREAM_FT_HTTP_503 0x00000020
+#define NGX_HTTP_UPSTREAM_FT_HTTP_404 0x00000040
+#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x00000080
+#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x00000100
+#define NGX_HTTP_UPSTREAM_FT_OFF 0x80000000
#define NGX_HTTP_UPSTREAM_INVALID_HEADER 40
ngx_str_t method;
- ngx_http_log_handler_pt saved_log_handler;
-
ngx_http_upstream_state_t *state;
ngx_array_t states; /* of ngx_http_upstream_state_t */