mirror of
				https://github.com/openresty/openresty.git
				synced 2024-10-13 00:29:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			191 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| --- 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;
 | |
| +}
 |