diff options
-rw-r--r-- | CHANGES | 12 | ||||
-rw-r--r-- | CHANGES.ru | 15 | ||||
-rw-r--r-- | src/core/nginx.h | 2 | ||||
-rw-r--r-- | src/http/modules/ngx_http_proxy_module.c | 8 | ||||
-rw-r--r-- | src/http/modules/ngx_http_ssi_filter_module.c | 96 | ||||
-rw-r--r-- | src/http/modules/ngx_http_ssi_filter_module.h | 5 | ||||
-rw-r--r-- | src/http/ngx_http.c | 6 | ||||
-rw-r--r-- | src/http/ngx_http_core_module.c | 21 | ||||
-rw-r--r-- | src/http/ngx_http_core_module.h | 2 | ||||
-rw-r--r-- | src/os/unix/ngx_readv_chain.c | 2 | ||||
-rw-r--r-- | src/os/unix/ngx_recv.c | 2 |
11 files changed, 113 insertions, 58 deletions
@@ -1,4 +1,14 @@ +Changes with nginx 0.3.26 03 Feb 2006 + + *) Change: the "optimize_host_names" directive was renamed to the + "optimize_server_names". + + *) Bugfix: if in the "proxy_pass" directive was no the URI part, then + the main request URI was transferred to a backend while proxying the + SSI subrequest. + + Changes with nginx 0.3.25 01 Feb 2006 *) Bugfix: the segmentation fault was occurred on start or while @@ -13,7 +23,7 @@ Changes with nginx 0.3.24 01 Feb 2006 *) Bugfix: now a response generated by the "post_action" directive is not transferred to a client. - *) Bugfix: the memory leaks were occuring if many log files were used. + *) Bugfix: the memory leaks were occurring if many log files were used. *) Bugfix: the first "proxy_redirect" directive was working inside one location. diff --git a/CHANGES.ru b/CHANGES.ru index 255dd7d9b..b541fc4d5 100644 --- a/CHANGES.ru +++ b/CHANGES.ru @@ -1,4 +1,13 @@ +Изменения в nginx 0.3.26 03.02.2006 + + *) Изменение: директива optimize_host_names переименована в + optimize_server_names. + + *) Исправление: при проксировании подзапроса в SSI бэкенду передавался + URI основного запроса, если в директиве proxy_pass отсутствовал URI. + + Изменения в nginx 0.3.25 01.02.2006 *) Исправление: при неверной конфигурации на старте или во время @@ -16,11 +25,11 @@ *) Исправление: при использовании большого количества лог-файлов происходила утечка памяти. - *) Исправление: внтури одного location работала только первая директива + *) Исправление: внутри одного location работала только первая директива proxy_redirect. *) Исправление: на 64-битных платформах при старте мог произойти - segmentation fault, если использовалось большое количиство имён в + segmentation fault, если использовалось большое количество имён в директивах server_name; ошибка появилась в 0.3.18. @@ -52,7 +61,7 @@ *) Добавление: модуль ngx_http_perl_module. *) Изменение: директива valid_referers разрешает использовать рефереры - cовсем без URI. + совсем без URI. Изменения в nginx 0.3.20 11.01.2006 diff --git a/src/core/nginx.h b/src/core/nginx.h index 66df80dff..c8ddddbd9 100644 --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -8,7 +8,7 @@ #define _NGINX_H_INCLUDED_ -#define NGINX_VER "nginx/0.3.25" +#define NGINX_VER "nginx/0.3.26" #define NGINX_VAR "NGINX" #define NGX_OLDPID_EXT ".oldbin" diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c index c85f587f6..579da9465 100644 --- a/src/http/modules/ngx_http_proxy_module.c +++ b/src/http/modules/ngx_http_proxy_module.c @@ -442,7 +442,7 @@ static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r) { size_t len, loc_len, body_len; - ngx_uint_t i, key; + ngx_uint_t i, key, unparsed_uri; uintptr_t escape; ngx_buf_t *b; ngx_str_t *hh, method; @@ -488,10 +488,12 @@ ngx_http_proxy_create_request(ngx_http_request_t *r) loc_len = r->valid_location ? u->conf->location.len : 0; - if (u->conf->uri.len == 0 && r->valid_unparsed_uri) { + if (u->conf->uri.len == 0 && r->valid_unparsed_uri && r == r->main) { + unparsed_uri = 1; len += r->unparsed_uri.len; } else { + unparsed_uri = 0; if (r->quoted_uri) { escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len, r->uri.len - loc_len, NGX_ESCAPE_URI); @@ -581,7 +583,7 @@ ngx_http_proxy_create_request(ngx_http_request_t *r) u->uri.data = b->last; - if (u->conf->uri.len == 0 && r->valid_unparsed_uri) { + if (unparsed_uri) { b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len); } else { diff --git a/src/http/modules/ngx_http_ssi_filter_module.c b/src/http/modules/ngx_http_ssi_filter_module.c index 66b2b96dc..4ec674971 100644 --- a/src/http/modules/ngx_http_ssi_filter_module.c +++ b/src/http/modules/ngx_http_ssi_filter_module.c @@ -761,7 +761,7 @@ ngx_http_ssi_output(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) { - u_char *p, *last, *copy_end, ch; + u_char *p, *value, *last, *copy_end, ch; size_t looked; ngx_http_ssi_state_e state; @@ -914,12 +914,13 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) default: ctx->command.len = 1; ctx->command.data = ngx_palloc(r->pool, - NGX_HTTP_SSI_COMMAND_LEN + 1); + NGX_HTTP_SSI_COMMAND_LEN); if (ctx->command.data == NULL) { return NGX_ERROR; } ctx->command.data[0] = ch; + ctx->key = 0; ctx->key = ngx_hash(ctx->key, ch); @@ -944,17 +945,17 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) break; default: - ctx->command.data[ctx->command.len++] = ch; - ctx->key = ngx_hash(ctx->key, ch); - if (ctx->command.len == NGX_HTTP_SSI_COMMAND_LEN) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "the \"%V\" SSI command is too long", - &ctx->command); + "the \"%V%c...\" SSI command is too long", + &ctx->command, ch); state = ssi_error_state; break; } + + ctx->command.data[ctx->command.len++] = ch; + ctx->key = ngx_hash(ctx->key, ch); } break; @@ -979,7 +980,7 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) ctx->param->key.len = 1; ctx->param->key.data = ngx_palloc(r->pool, - NGX_HTTP_SSI_PARAM_LEN + 1); + NGX_HTTP_SSI_PARAM_LEN); if (ctx->param->key.data == NULL) { return NGX_ERROR; } @@ -987,10 +988,16 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) ctx->param->key.data[0] = ch; ctx->param->value.len = 0; - ctx->param->value.data = ngx_palloc(r->pool, - ctx->value_len + 1); - if (ctx->param->value.data == NULL) { - return NGX_ERROR; + + if (ctx->value_buf == NULL) { + ctx->param->value.data = ngx_palloc(r->pool, + ctx->value_len); + if (ctx->param->value.data == NULL) { + return NGX_ERROR; + } + + } else { + ctx->param->value.data = ctx->value_buf; } state = ssi_param_state; @@ -1022,16 +1029,16 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) break; default: - ctx->param->key.data[ctx->param->key.len++] = ch; - if (ctx->param->key.len == NGX_HTTP_SSI_PARAM_LEN) { state = ssi_error_state; ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long \"%V\" parameter in " + "too long \"%V%c...\" parameter in " "\"%V\" SSI command", - &ctx->param->key, &ctx->command); + &ctx->param->key, ch, &ctx->command); break; } + + ctx->param->key.data[ctx->param->key.len++] = ch; } break; @@ -1109,17 +1116,17 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) /* fall through */ default: - ctx->param->value.data[ctx->param->value.len++] = ch; - if (ctx->param->value.len == ctx->value_len) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long \"%V\" value of \"%V\" parameter " - "in \"%V\" SSI command", - &ctx->param->value, &ctx->param->key, + "too long \"%V%c...\" value of \"%V\" " + "parameter in \"%V\" SSI command", + &ctx->param->value, ch, &ctx->param->key, &ctx->command); state = ssi_error_state; break; } + + ctx->param->value.data[ctx->param->value.len++] = ch; } break; @@ -1137,17 +1144,17 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) /* fall through */ default: - ctx->param->value.data[ctx->param->value.len++] = ch; - if (ctx->param->value.len == ctx->value_len) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long \"%V\" value of \"%V\" parameter " - "in \"%V\" SSI command", - &ctx->param->value, &ctx->param->key, + "too long \"%V%c...\" value of \"%V\" " + "parameter in \"%V\" SSI command", + &ctx->param->value, ch, &ctx->param->key, &ctx->command); state = ssi_error_state; break; } + + ctx->param->value.data[ctx->param->value.len++] = ch; } break; @@ -1169,23 +1176,38 @@ ngx_http_ssi_parse(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx) break; } - ctx->param->value.data[ctx->param->value.len++] = ch; - if (ctx->param->value.len == ctx->value_len) { - if (ctx->param->value.len == ctx->value_len) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long \"%V\" value of \"%V\" parameter " - "in \"%V\" SSI command", - &ctx->param->value, &ctx->param->key, - &ctx->command); - state = ssi_error_state; - break; - } + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + "too long \"%V%c...\" value of \"%V\" " + "parameter in \"%V\" SSI command", + &ctx->param->value, ch, &ctx->param->key, + &ctx->command); + state = ssi_error_state; + break; } + ctx->param->value.data[ctx->param->value.len++] = ch; + break; case ssi_postparam_state: + + if (ctx->param->value.len < ctx->value_len / 2) { + value = ngx_palloc(r->pool, ctx->param->value.len); + if (value == NULL) { + return NGX_ERROR; + } + + ngx_memcpy(value, ctx->param->value.data, + ctx->param->value.len); + + ctx->value_buf = ctx->param->value.data; + ctx->param->value.data = value; + + } else { + ctx->value_buf = NULL; + } + switch (ch) { case ' ': case CR: diff --git a/src/http/modules/ngx_http_ssi_filter_module.h b/src/http/modules/ngx_http_ssi_filter_module.h index bd736480b..5337e942a 100644 --- a/src/http/modules/ngx_http_ssi_filter_module.h +++ b/src/http/modules/ngx_http_ssi_filter_module.h @@ -15,8 +15,8 @@ #define NGX_HTTP_SSI_MAX_PARAMS 16 -#define NGX_HTTP_SSI_COMMAND_LEN 31 -#define NGX_HTTP_SSI_PARAM_LEN 31 +#define NGX_HTTP_SSI_COMMAND_LEN 32 +#define NGX_HTTP_SSI_PARAM_LEN 32 #define NGX_HTTP_SSI_PARAMS_N 4 @@ -56,6 +56,7 @@ typedef struct { ngx_uint_t output; /* unsigned output:1; */ + void *value_buf; ngx_str_t timefmt; ngx_str_t errmsg; } ngx_http_ssi_ctx_t; diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c index 61f9430fd..6211f0e1e 100644 --- a/src/http/ngx_http.c +++ b/src/http/ngx_http.c @@ -535,7 +535,7 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) * check whether all name-based servers have the same configuraiton * as the default server, * or some servers restrict the host names, - * or some servers disable optimizing the host names + * or some servers disable optimizing the server names */ in_addr = in_port[p].addrs.elts; @@ -545,7 +545,7 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) for (s = 0; s < in_addr[a].names.nelts; s++) { if (in_addr[a].core_srv_conf != name[s].core_srv_conf - || name[s].core_srv_conf->optimize_host_names == 0 + || name[s].core_srv_conf->optimize_server_names == 0 || name[s].core_srv_conf->restrict_host_names != NGX_HTTP_RESTRICT_HOST_OFF) { @@ -557,7 +557,7 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) * if all name-based servers have the same configuration * as the default server, * and no servers restrict the host names, - * and no servers disable optimizing the host names + * and no servers disable optimizing the server names * then we do not need to check them at run-time at all */ diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c index 2784921f2..89f846c97 100644 --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c @@ -62,6 +62,10 @@ static char *ngx_http_core_lowat_check(ngx_conf_t *cf, void *post, void *data); static ngx_conf_post_t ngx_http_core_lowat_post = { ngx_http_core_lowat_check }; +static ngx_conf_deprecated_t ngx_conf_deprecated_optimize_host_names = { + ngx_conf_deprecated, "optimize_host_names", "optimize_server_names" +}; + static ngx_conf_enum_t ngx_http_restrict_host_names[] = { { ngx_string("off"), NGX_HTTP_RESTRICT_HOST_OFF }, @@ -136,13 +140,20 @@ static ngx_command_t ngx_http_core_commands[] = { offsetof(ngx_http_core_srv_conf_t, restrict_host_names), &ngx_http_restrict_host_names }, - { ngx_string("optimize_host_names"), + { ngx_string("optimize_server_names"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, ngx_conf_set_flag_slot, NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_core_srv_conf_t, optimize_host_names), + offsetof(ngx_http_core_srv_conf_t, optimize_server_names), NULL }, + { ngx_string("optimize_host_names"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_HTTP_SRV_CONF_OFFSET, + offsetof(ngx_http_core_srv_conf_t, optimize_server_names), + &ngx_conf_deprecated_optimize_host_names }, + { ngx_string("ignore_invalid_headers"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, ngx_conf_set_flag_slot, @@ -1840,7 +1851,7 @@ ngx_http_core_create_srv_conf(ngx_conf_t *cf) cscf->client_header_timeout = NGX_CONF_UNSET_MSEC; cscf->client_header_buffer_size = NGX_CONF_UNSET_SIZE; cscf->restrict_host_names = NGX_CONF_UNSET_UINT; - cscf->optimize_host_names = NGX_CONF_UNSET; + cscf->optimize_server_names = NGX_CONF_UNSET; cscf->ignore_invalid_headers = NGX_CONF_UNSET; return cscf; @@ -1928,8 +1939,8 @@ ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) ngx_conf_merge_unsigned_value(conf->restrict_host_names, prev->restrict_host_names, 0); - ngx_conf_merge_value(conf->optimize_host_names, - prev->optimize_host_names, 1); + ngx_conf_merge_value(conf->optimize_server_names, + prev->optimize_server_names, 1); ngx_conf_merge_value(conf->ignore_invalid_headers, prev->ignore_invalid_headers, 1); diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h index 48cbc4217..438228950 100644 --- a/src/http/ngx_http_core_module.h +++ b/src/http/ngx_http_core_module.h @@ -109,7 +109,7 @@ typedef struct { ngx_uint_t restrict_host_names; - ngx_flag_t optimize_host_names; + ngx_flag_t optimize_server_names; ngx_flag_t ignore_invalid_headers; } ngx_http_core_srv_conf_t; diff --git a/src/os/unix/ngx_readv_chain.c b/src/os/unix/ngx_readv_chain.c index 5c2bb5af8..2e621d8bb 100644 --- a/src/os/unix/ngx_readv_chain.c +++ b/src/os/unix/ngx_readv_chain.c @@ -119,7 +119,7 @@ ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain) */ ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "recv() returned 0 while kevent() reported " + "readv() returned 0 while kevent() reported " "%d available bytes", rev->available); rev->eof = 1; diff --git a/src/os/unix/ngx_recv.c b/src/os/unix/ngx_recv.c index a8a351a80..f38730ec3 100644 --- a/src/os/unix/ngx_recv.c +++ b/src/os/unix/ngx_recv.c @@ -78,7 +78,7 @@ ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) */ ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "recv() returned 0 while keevnt() reported " + "recv() returned 0 while kevent() reported " "%d available bytes", rev->available); rev->eof = 1; |