[PATCH] Mirror directive supports variable

Roman Arutyunyan arut at nginx.com
Mon Mar 30 12:36:11 UTC 2020


Hello,

On Fri, Mar 13, 2020 at 11:29:51PM +0800, 一江春水,向东流 wrote:
> # HG changeset patch
> # User agile6v <liuwei19 at xiaomi.com>
> # Date 1584110606 -28800
> #      Fri Mar 13 22:43:26 2020 +0800
> # Node ID e4a0277cab79865fde6fefeed9374154449e6948
> # Parent  4eb606b4a5b521603c23223cf8863f3999df743c
> mirror directive supports variable.
> 
> diff -r 4eb606b4a5b5 -r e4a0277cab79 src/http/modules/ngx_http_mirror_module.c
> --- a/src/http/modules/ngx_http_mirror_module.c    Tue Mar 03 18:04:21 2020 +0300
> +++ b/src/http/modules/ngx_http_mirror_module.c    Fri Mar 13 22:43:26 2020 +0800
> @@ -149,17 +149,28 @@
>  static ngx_int_t
>  ngx_http_mirror_handler_internal(ngx_http_request_t *r)
>  {
> -    ngx_str_t                   *name;
> +    ngx_str_t                    val;
>      ngx_uint_t                   i;
>      ngx_http_request_t          *sr;
>      ngx_http_mirror_loc_conf_t  *mlcf;
> +    ngx_http_complex_value_t    *pcv;
> 
>      mlcf = ngx_http_get_module_loc_conf(r, ngx_http_mirror_module);
> 
> -    name = mlcf->mirror->elts;
> +    pcv = mlcf->mirror->elts;
> 
>      for (i = 0; i < mlcf->mirror->nelts; i++) {
> -        if (ngx_http_subrequest(r, &name[i], &r->args, &sr, NULL,
> +        if (ngx_http_complex_value(r, &pcv[i], &val) != NGX_OK) {
> +            return NGX_HTTP_INTERNAL_SERVER_ERROR;
> +        }
> +
> +        if (val.len == 0
> +            || (val.len == 3 && ngx_strncmp(val.data, "off", 3) == 0))

There's one issue with this line which introduces inconsistency.
Currently specifying "off" disables inheriting mirrors on a certain level.
Also it cannot be specified together with other mirror directives.
But now, if "off" is evaluated from a complex value, the behavior is very
different, this mirror is just ignored in runtime, but other mirrors work fine.

> +        {
> +            continue;
> +        }
> +
> +        if (ngx_http_subrequest(r, &val, &r->args, &sr, NULL,
>                                  NGX_HTTP_SUBREQUEST_BACKGROUND)
>              != NGX_OK)
>          {
> @@ -208,9 +219,10 @@
>  static char *
>  ngx_http_mirror(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
>  {
> -    ngx_http_mirror_loc_conf_t *mlcf = conf;
> -
> -    ngx_str_t  *value, *s;
> +    ngx_http_mirror_loc_conf_t        *mlcf = conf;
> +    ngx_http_complex_value_t          *pcv, cv;
> +    ngx_http_compile_complex_value_t   ccv;
> +    ngx_str_t                         *value;
> 
>      value = cf->args->elts;
> 
> @@ -227,19 +239,30 @@
>          return "is duplicate";
>      }
> 
> +    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
> +
> +    ccv.cf = cf;
> +    ccv.value = &value[1];
> +    ccv.complex_value = &cv;
> +
> +    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
> +        return NGX_CONF_ERROR;
> +    }
> +
>      if (mlcf->mirror == NGX_CONF_UNSET_PTR) {
> -        mlcf->mirror = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t));
> +        mlcf->mirror = ngx_array_create(cf->pool, 4,
> +                                sizeof(ngx_http_complex_value_t));
>          if (mlcf->mirror == NULL) {
>              return NGX_CONF_ERROR;
>          }
>      }
> 
> -    s = ngx_array_push(mlcf->mirror);
> -    if (s == NULL) {
> +    pcv = ngx_array_push(mlcf->mirror);
> +    if (pcv == NULL) {
>          return NGX_CONF_ERROR;
>      }
> 
> -    *s = value[1];
> +    *pcv = cv;
> 
>      return NGX_CONF_OK;
>  }


> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel


-- 
Roman Arutyunyan


More information about the nginx-devel mailing list