From 9f52ad4a45ee2a4b9df5f559838ab8a7ed33ac5d Mon Sep 17 00:00:00 2001 From: "agentzh (Yichun Zhang)" Date: Thu, 21 Mar 2013 18:03:56 -0700 Subject: [PATCH] applied the variables_in_redis_pass patch to ngx_redis 0.3.6 to allow use of nginx variables in the redis_pass directive. --- ..._redis-0.3.6-variables_in_redis_pass.patch | 190 ++++++++++++++++++ util/mirror-tarballs | 5 + util/ver | 2 +- 3 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 patches/ngx_http_redis-0.3.6-variables_in_redis_pass.patch diff --git a/patches/ngx_http_redis-0.3.6-variables_in_redis_pass.patch b/patches/ngx_http_redis-0.3.6-variables_in_redis_pass.patch new file mode 100644 index 0000000..e56c584 --- /dev/null +++ b/patches/ngx_http_redis-0.3.6-variables_in_redis_pass.patch @@ -0,0 +1,190 @@ +--- ngx_http_redis-0.3.6/ngx_http_redis_module.c 2013-03-21 17:51:09.224660165 -0700 ++++ ngx_http_redis-0.3.6-patched/ngx_http_redis_module.c 2013-03-21 17:50:51.928599875 -0700 +@@ -18,6 +18,8 @@ typedef struct { + ngx_int_t index; + ngx_int_t db; + ngx_uint_t gzip_flag; ++ ++ ngx_http_complex_value_t *complex_target; /* for redis_pass */ + } ngx_http_redis_loc_conf_t; + + +@@ -44,6 +46,9 @@ static char *ngx_http_redis_merge_loc_co + + static char *ngx_http_redis_pass(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); ++static ngx_http_upstream_srv_conf_t * ++ ngx_http_redis_upstream_add(ngx_http_request_t *r, ngx_url_t *url); ++ + + static ngx_conf_bitmask_t ngx_http_redis_next_upstream_masks[] = { + { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, +@@ -185,11 +190,43 @@ ngx_http_redis_handler(ngx_http_request_ + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + ++ rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module); ++ if (rlcf->complex_target) { ++ ngx_str_t target; ++ ngx_url_t url; ++ ++ /* variables used in the redis_pass directive */ ++ ++ if (ngx_http_complex_value(r, rlcf->complex_target, &target) ++ != NGX_OK) ++ { ++ return NGX_ERROR; ++ } ++ ++ if (target.len == 0) { ++ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, ++ "handler: empty \"redis_pass\" target"); ++ return NGX_HTTP_INTERNAL_SERVER_ERROR; ++ } ++ ++ url.host = target; ++ url.port = 0; ++ url.default_port = 6379; ++ url.no_resolve = 1; ++ ++ rlcf->upstream.upstream = ngx_http_redis_upstream_add(r, &url); ++ ++ if (rlcf->upstream.upstream == NULL) { ++ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, ++ "redis: upstream \"%V\" not found", &target); ++ ++ return NGX_HTTP_INTERNAL_SERVER_ERROR; ++ } ++ } ++ + #if defined nginx_version && nginx_version >= 8011 + if (ngx_http_upstream_create(r) != NGX_OK) { + #else +- rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module); +- + u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t)); + if (u == NULL) { + #endif +@@ -214,9 +251,7 @@ ngx_http_redis_handler(ngx_http_request_ + u->peer.log_error = NGX_ERROR_ERR; + #endif + +-#if defined nginx_version && nginx_version >= 8011 +- rlcf = ngx_http_get_module_loc_conf(r, ngx_http_redis_module); +-#else ++#if !defined(nginx_version) || nginx_version < 8011 + u->output.tag = (ngx_buf_tag_t) &ngx_http_redis_module; + #endif + +@@ -835,24 +870,15 @@ ngx_http_redis_pass(ngx_conf_t *cf, ngx_ + + ngx_str_t *value; + ngx_url_t u; ++ ngx_uint_t n; + ngx_http_core_loc_conf_t *clcf; + ++ ngx_http_compile_complex_value_t ccv; ++ + if (rlcf->upstream.upstream) { + return "is duplicate"; + } + +- value = cf->args->elts; +- +- ngx_memzero(&u, sizeof(ngx_url_t)); +- +- u.url = value[1]; +- u.no_resolve = 1; +- +- rlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); +- if (rlcf->upstream.upstream == NULL) { +- return NGX_CONF_ERROR; +- } +- + clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); + + clcf->handler = ngx_http_redis_handler; +@@ -869,6 +895,41 @@ ngx_http_redis_pass(ngx_conf_t *cf, ngx_ + + rlcf->db = ngx_http_get_variable_index(cf, &ngx_http_redis_db); + ++ value = cf->args->elts; ++ ++ n = ngx_http_script_variables_count(&value[1]); ++ if (n) { ++ rlcf->complex_target = ngx_palloc(cf->pool, ++ sizeof(ngx_http_complex_value_t)); ++ ++ if (rlcf->complex_target == NULL) { ++ return NGX_CONF_ERROR; ++ } ++ ++ ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); ++ ccv.cf = cf; ++ ccv.value = &value[1]; ++ ccv.complex_value = rlcf->complex_target; ++ ++ if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { ++ return NGX_CONF_ERROR; ++ } ++ ++ return NGX_CONF_OK; ++ } ++ ++ rlcf->complex_target = NULL; ++ ++ ngx_memzero(&u, sizeof(ngx_url_t)); ++ ++ u.url = value[1]; ++ u.no_resolve = 1; ++ ++ rlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); ++ if (rlcf->upstream.upstream == NULL) { ++ return NGX_CONF_ERROR; ++ } ++ + return NGX_CONF_OK; + } + +@@ -906,3 +967,41 @@ ngx_http_redis_add_variables(ngx_conf_t + + return NGX_OK; + } ++ ++ ++static ngx_http_upstream_srv_conf_t * ++ngx_http_redis_upstream_add(ngx_http_request_t *r, ngx_url_t *url) ++{ ++ ngx_http_upstream_main_conf_t *umcf; ++ ngx_http_upstream_srv_conf_t **uscfp; ++ ngx_uint_t i; ++ ++ umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); ++ ++ uscfp = umcf->upstreams.elts; ++ ++ for (i = 0; i < umcf->upstreams.nelts; i++) { ++ ++ if (uscfp[i]->host.len != url->host.len ++ || ngx_strncasecmp(uscfp[i]->host.data, url->host.data, ++ url->host.len) != 0) ++ { ++ continue; ++ } ++ ++ if (uscfp[i]->port != url->port) { ++ continue; ++ } ++ ++ if (uscfp[i]->default_port ++ && url->default_port ++ && uscfp[i]->default_port != url->default_port) ++ { ++ continue; ++ } ++ ++ return uscfp[i]; ++ } ++ ++ return NULL; ++} diff --git a/util/mirror-tarballs b/util/mirror-tarballs index 14f1344..6fd2ecb 100755 --- a/util/mirror-tarballs +++ b/util/mirror-tarballs @@ -281,6 +281,11 @@ $root/util/get-tarball "http://people.freebsd.org/~osa/ngx_http_redis-$ver.tar.g tar -xzf redis-nginx-module-$ver.tar.gz || exit 1 mv ngx_http_redis-* redis-nginx-module-$ver || exit 1 +cd redis-nginx-module-$ver +echo "applying ngx_http_redis-$ver-variables_in_redis_pass.patch" +patch -p1 < $root/patches/ngx_http_redis-$ver-variables_in_redis_pass.patch || exit 1 +cd .. + ################################# ver=1.0rc2 diff --git a/util/ver b/util/ver index 8762ba4..d0c60cf 100755 --- a/util/ver +++ b/util/ver @@ -2,7 +2,7 @@ #main_ver=1.3.11 main_ver=1.2.7 -minor_ver=3rc4 +minor_ver=3rc5 version=$main_ver.$minor_ver echo $version