# HG changeset patch # User Igor Sysoev # Date 1142370000 -10800 # Node ID 1b490fc19afa940e4e233c5389f8c30afe40ae09 # Parent d4717557d48da18643bfe4b9f61625812eb65c22 nginx 0.3.33 *) Feature: the "http_503" parameter of the "proxy_next_upstream" or "fastcgi_next_upstream" directives. *) Bugfix: ngx_http_perl_module did not work with inlined in the configuration code, if it was not started with the "sub" word. *) Bugfix: in the "post_action" directive. diff --git a/CHANGES b/CHANGES --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,14 @@ + +Changes with nginx 0.3.33 15 Mar 2006 + + *) Feature: the "http_503" parameter of the "proxy_next_upstream" or + "fastcgi_next_upstream" directives. + + *) Bugfix: ngx_http_perl_module did not work with inlined in the + configuration code, if it was not started with the "sub" word. + + *) Bugfix: in the "post_action" directive. + Changes with nginx 0.3.32 11 Mar 2006 diff --git a/CHANGES.ru b/CHANGES.ru --- a/CHANGES.ru +++ b/CHANGES.ru @@ -1,3 +1,14 @@ + +Изменения в nginx 0.3.33 15.03.2006 + + *) Добавление: параметр http_503 в директивах proxy_next_upstream или + fastcgi_next_upstream. + + *) Исправление: ngx_http_perl_module не работал со встроенным в + конфигурацинный файл кодом, если он не начинался сразу же с "sub". + + *) Исправление: в директиве post_action. + Изменения в nginx 0.3.32 11.03.2006 diff --git a/auto/os/features b/auto/os/features --- a/auto/os/features +++ b/auto/os/features @@ -120,8 +120,8 @@ if test -z "$NGX_KQUEUE_CHECKED"; then if [ "$NGX_SYSTEM" = "Darwin" ]; then - ngx_feature="MacOSX 64-bit kqueue millisecond timeout bug" - ngx_feature_name= + ngx_feature="Darwin 64-bit kqueue millisecond timeout bug" + ngx_feature_name=NGX_DARWIN_KEVENT_BUG ngx_feature_run=bug ngx_feature_incs="#include #include " @@ -144,30 +144,11 @@ if test -z "$NGX_KQUEUE_CHECKED"; then if (tv.tv_sec * 1000000 + tv.tv_usec < 900000) return 1;" . auto/feature - - ngx_macosx_kevent_bug=$ngx_found fi fi fi -if [ ".$ngx_macosx_kevent_bug" = .yes ]; then - - cat << END >> $NGX_AUTO_CONFIG_H - -#define NGX_MACOSX_KEVENT_BUG_SHIFT << 32 - -END - -else - cat << END >> $NGX_AUTO_CONFIG_H - -#define NGX_MACOSX_KEVENT_BUG_SHIFT - -END -fi - - if [ "$NGX_SYSTEM" = "NetBSD" ]; then # NetBSD 2.0 incompatibly defines kevent.udata as "intptr_t" diff --git a/src/core/nginx.h b/src/core/nginx.h --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -8,7 +8,7 @@ #define _NGINX_H_INCLUDED_ -#define NGINX_VER "nginx/0.3.32" +#define NGINX_VER "nginx/0.3.33" #define NGINX_VAR "NGINX" #define NGX_OLDPID_EXT ".oldbin" diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h --- a/src/core/ngx_conf_file.h +++ b/src/core/ngx_conf_file.h @@ -282,7 +282,7 @@ char *ngx_conf_check_num_bounds(ngx_conf #define ngx_conf_merge_str_value(conf, prev, default) \ if (conf.data == NULL) { \ - if (prev.data) { \ + if (prev.data) { \ conf.len = prev.len; \ conf.data = prev.data; \ } else { \ diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -491,16 +491,19 @@ ngx_kqueue_process_events(ngx_cycle_t *c } else { + ts.tv_sec = timer / 1000; + ts.tv_nsec = (timer % 1000) * 1000000; + /* - * 64-bit MacOSX kernel has the bug: kernel level ts.tv_nsec is + * 64-bit Darwin kernel has the bug: kernel level ts.tv_nsec is * the int32_t while user level ts.tv_nsec is the long (64-bit), * so on the big endian PowerPC all nanoseconds are lost. - * NGX_MACOSX_KEVENT_BUG_SHIFT on these machines is "<< 32". */ - ts.tv_sec = timer / 1000; - ts.tv_nsec = (long) ((timer % 1000) * 1000000) - NGX_MACOSX_KEVENT_BUG_SHIFT; +#if (NGX_DARWIN_KEVENT_BUG) + ts.tv_nsec <<= 32; +#endif + tp = &ts; } diff --git a/src/http/modules/ngx_http_fastcgi_module.c b/src/http/modules/ngx_http_fastcgi_module.c --- a/src/http/modules/ngx_http_fastcgi_module.c +++ b/src/http/modules/ngx_http_fastcgi_module.c @@ -161,6 +161,7 @@ static ngx_conf_bitmask_t ngx_http_fast { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, { 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_null_string, 0 } }; diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c --- a/src/http/modules/ngx_http_proxy_module.c +++ b/src/http/modules/ngx_http_proxy_module.c @@ -121,6 +121,7 @@ static ngx_conf_bitmask_t ngx_http_prox { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, { 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_null_string, 0 } }; diff --git a/src/http/modules/perl/ngx_http_perl_module.c b/src/http/modules/perl/ngx_http_perl_module.c --- a/src/http/modules/perl/ngx_http_perl_module.c +++ b/src/http/modules/perl/ngx_http_perl_module.c @@ -692,10 +692,18 @@ ngx_http_perl_call_handler(pTHX_ ngx_htt static void ngx_http_perl_eval_anon_sub(pTHX_ ngx_str_t *handler, SV **sv) { - if (ngx_strncmp(handler->data, "sub ", 4) == 0 - || ngx_strncmp(handler->data, "use ", 4) == 0) + u_char *p; + + for (p = handler->data; *p; p++) { + if (*p != ' ' && *p != '\t' && *p != CR && *p != LF) { + break; + } + } + + if (ngx_strncmp(p, "sub ", 4) == 0 + || ngx_strncmp(p, "use ", 4) == 0) { - *sv = eval_pv((char *) handler->data, FALSE); + *sv = eval_pv((char *) p, FALSE); return; } diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c --- a/src/http/ngx_http_core_module.c +++ b/src/http/ngx_http_core_module.c @@ -1003,12 +1003,9 @@ u_char * ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *path, size_t reserved) { - u_char *last; - size_t alias, len; - ngx_http_script_code_pt code; - ngx_http_script_engine_t e; - ngx_http_core_loc_conf_t *clcf; - ngx_http_script_len_code_pt lcode; + u_char *last; + size_t alias; + ngx_http_core_loc_conf_t *clcf; clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); @@ -1021,11 +1018,13 @@ ngx_http_map_uri_to_path(ngx_http_reques return NULL; } + reserved += r->uri.len - alias + 1; + if (clcf->root_lengths == NULL) { r->root_length = clcf->root.len; - path->len = clcf->root.len + r->uri.len - alias + 1 + reserved; + path->len = clcf->root.len + reserved; path->data = ngx_palloc(r->pool, path->len); if (path->data == NULL) { @@ -1033,43 +1032,18 @@ ngx_http_map_uri_to_path(ngx_http_reques } last = ngx_copy(path->data, clcf->root.data, clcf->root.len); - last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1); - - return last; - } - - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = clcf->root_lengths->elts; - e.request = r; - e.flushed = 1; - - len = 0; - - while (*(uintptr_t *) e.ip) { - lcode = *(ngx_http_script_len_code_pt *) e.ip; - len += lcode(&e); + + } else { + last = ngx_http_script_run(r, path, clcf->root_lengths->elts, reserved, + clcf->root_values->elts); + if (last == NULL) { + return NULL; + } + + r->root_length = path->len - reserved; } - r->root_length = len; - - len += r->uri.len - alias + 1 + reserved; - - path->len = len; - path->data = ngx_palloc(r->pool, len); - if (path->data == NULL) { - return NULL; - } - - e.ip = clcf->root_values->elts; - e.pos = path->data; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - - last = ngx_cpystrn(e.pos, r->uri.data + alias, r->uri.len - alias + 1); + last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1); return last; } diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c --- a/src/http/ngx_http_parse.c +++ b/src/http/ngx_http_parse.c @@ -682,6 +682,8 @@ ngx_http_parse_header_line(ngx_http_requ /* end of header line */ case sw_almost_done: switch (ch) { + case CR: + break; case LF: goto done; default: diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -2249,6 +2249,9 @@ ngx_http_post_action(ngx_http_request_t return NGX_DECLINED; } + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "post action: \"%V\"", &clcf->post_action); + r->http_version = NGX_HTTP_VERSION_9; r->header_only = 1; diff --git a/src/http/ngx_http_script.c b/src/http/ngx_http_script.c --- a/src/http/ngx_http_script.c +++ b/src/http/ngx_http_script.c @@ -294,6 +294,44 @@ invalid_variable: } +u_char * +ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value, + void *code_lengths, size_t len, void *code_values) +{ + ngx_http_script_code_pt code; + ngx_http_script_len_code_pt lcode; + ngx_http_script_engine_t e; + + ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); + + e.ip = code_lengths; + e.request = r; + e.flushed = 1; + + while (*(uintptr_t *) e.ip) { + lcode = *(ngx_http_script_len_code_pt *) e.ip; + len += lcode(&e); + } + + + value->len = len; + value->data = ngx_palloc(r->pool, len); + if (value->data == NULL) { + return NULL; + } + + e.ip = code_values; + e.pos = value->data; + + while (*(uintptr_t *) e.ip) { + code = *(ngx_http_script_code_pt *) e.ip; + code((ngx_http_script_engine_t *) &e); + } + + return e.pos; +} + + void ngx_http_script_flush_no_cachable_variables(ngx_http_request_t *r, ngx_array_t *indices) diff --git a/src/http/ngx_http_script.h b/src/http/ngx_http_script.h --- a/src/http/ngx_http_script.h +++ b/src/http/ngx_http_script.h @@ -152,6 +152,8 @@ typedef struct { ngx_uint_t ngx_http_script_variables_count(ngx_str_t *value); ngx_int_t ngx_http_script_compile(ngx_http_script_compile_t *sc); +u_char *ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value, + void *code_lengths, size_t reserved, void *code_values); void ngx_http_script_flush_no_cachable_variables(ngx_http_request_t *r, ngx_array_t *indices); diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -1947,7 +1947,11 @@ ngx_http_upstream_finalize_request(ngx_h r->connection->log->action = "sending to client"; - if (rc == 0 && r == r->main) { + if (rc == 0 + && r == r->main + /* not a post_action */ + && !(r->http_version == NGX_HTTP_VERSION_9 && r->header_only)) + { rc = ngx_http_send_special(r, NGX_HTTP_LAST); } diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h --- a/src/http/ngx_http_upstream.h +++ b/src/http/ngx_http_upstream.h @@ -16,13 +16,14 @@ #include -#define NGX_HTTP_UPSTREAM_FT_ERROR 0x02 -#define NGX_HTTP_UPSTREAM_FT_TIMEOUT 0x04 -#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER 0x08 -#define NGX_HTTP_UPSTREAM_FT_HTTP_500 0x10 -#define NGX_HTTP_UPSTREAM_FT_HTTP_404 0x20 -#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x40 -#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x80 +#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_INVALID_HEADER 40