<pre style="font-family: Menlo; font-size: 9pt;"><span style="color:#808000;"># HG </span>changeset patch<br><span style="color:#808000;"># User </span>agile6v <liuwei19@xiaomi.com><br><span style="color:#808000;"># Date </span><span style="color:#0000ff;">1584110606 </span>-<span style="color:#0000ff;">28800<br></span><span style="color:#808000;">#      Fri </span>Mar <span style="color:#0000ff;">13 22</span>:<span style="color:#0000ff;">43</span>:<span style="color:#0000ff;">26 2020 </span>+0800<br><span style="color:#808000;"># Node </span>ID e4a0277cab79865fde6fefeed9374154449e6948<br><span style="color:#808000;"># Parent  </span>4eb606b4a5b521603c23223cf8863f3999df743c<br>mirror directive supports variable.<br><br>diff -r 4eb606b4a5b5 -r e4a0277cab79 src/http/modules/ngx_http_mirror_module.c<br>--- a/src/http/modules/ngx_http_mirror_module.c    Tue Mar <span style="color:#0000ff;">03 18</span>:<span style="color:#0000ff;">04</span>:<span style="color:#0000ff;">21 2020 </span>+<span style="color:#0000ff;">0300<br></span>+++ b/src/http/modules/ngx_http_mirror_module.c    Fri Mar <span style="color:#0000ff;">13 22</span>:<span style="color:#0000ff;">43</span>:<span style="color:#0000ff;">26 2020 </span>+0800<br>@@ -<span style="color:#0000ff;">149</span>,<span style="color:#0000ff;">17 </span>+<span style="color:#0000ff;">149</span>,<span style="color:#0000ff;">28 </span>@@<br> <span style="color:#000080;font-weight:bold;">static </span>ngx_int_t<br> ngx_http_mirror_handler_internal(ngx_http_request_t *r)<br> {<br>-    ngx_str_t                   *name;<br>+    ngx_str_t                    val;<br>     ngx_uint_t                   i;<br>     ngx_http_request_t          *sr;<br>     ngx_http_mirror_loc_conf_t  *mlcf;<br>+    ngx_http_complex_value_t    *pcv;<br><br>     mlcf = ngx_http_get_module_loc_conf(r, ngx_http_mirror_module);<br><br>-    name = mlcf->mirror->elts;<br>+    pcv = mlcf->mirror->elts;<br><br>     <span style="color:#000080;font-weight:bold;">for </span>(i = <span style="color:#0000ff;">0</span>; i < mlcf->mirror->nelts; i++) {<br>-        <span style="color:#000080;font-weight:bold;">if </span>(ngx_http_subrequest(r, &name[i], &r->args, &sr, NULL,<br>+        <span style="color:#000080;font-weight:bold;">if </span>(ngx_http_complex_value(r, &pcv[i], &val) != NGX_OK) {<br>+            <span style="color:#000080;font-weight:bold;">return </span>NGX_HTTP_INTERNAL_SERVER_ERROR;<br>+        }<br>+<br>+        <span style="color:#000080;font-weight:bold;">if </span>(val.len == <span style="color:#0000ff;">0<br></span>+            || (val.len == <span style="color:#0000ff;">3 </span>&& ngx_strncmp(val.data, <span style="color:#008000;font-weight:bold;">"off"</span>, <span style="color:#0000ff;">3</span>) == <span style="color:#0000ff;">0</span>))<br>+        {<br>+            <span style="color:#000080;font-weight:bold;">continue</span>;<br>+        }<br>+<br>+        <span style="color:#000080;font-weight:bold;">if </span>(ngx_http_subrequest(r, &val, &r->args, &sr, NULL,<br>                                 NGX_HTTP_SUBREQUEST_BACKGROUND)<br>             != NGX_OK)<br>         {<br>@@ -<span style="color:#0000ff;">208</span>,<span style="color:#0000ff;">9 </span>+<span style="color:#0000ff;">219</span>,<span style="color:#0000ff;">10 </span>@@<br> <span style="color:#000080;font-weight:bold;">static char </span>*<br> ngx_http_mirror(ngx_conf_t *cf, ngx_command_t *cmd, <span style="color:#000080;font-weight:bold;">void </span>*conf)<br> {<br>-    ngx_http_mirror_loc_conf_t *mlcf = conf;<br>-<br>-    ngx_str_t  *value, *s;<br>+    ngx_http_mirror_loc_conf_t        *mlcf = conf;<br>+    ngx_http_complex_value_t          *pcv, cv;<br>+    ngx_http_compile_complex_value_t   ccv;<br>+    ngx_str_t                         *value;<br><br>     value = cf->args->elts;<br><br>@@ -<span style="color:#0000ff;">227</span>,<span style="color:#0000ff;">19 </span>+<span style="color:#0000ff;">239</span>,<span style="color:#0000ff;">30 </span>@@<br>         <span style="color:#000080;font-weight:bold;">return </span><span style="color:#008000;font-weight:bold;">"is duplicate"</span>;<br>     }<br><br>+    ngx_memzero(&ccv, <span style="color:#000080;font-weight:bold;">sizeof</span>(ngx_http_compile_complex_value_t));<br>+<br>+    ccv.cf = cf;<br>+    ccv.value = &value[<span style="color:#0000ff;">1</span>];<br>+    ccv.complex_value = &cv;<br>+<br>+    <span style="color:#000080;font-weight:bold;">if </span>(ngx_http_compile_complex_value(&ccv) != NGX_OK) {<br>+        <span style="color:#000080;font-weight:bold;">return </span>NGX_CONF_ERROR;<br>+    }<br>+<br>     <span style="color:#000080;font-weight:bold;">if </span>(mlcf->mirror == NGX_CONF_UNSET_PTR) {<br>-        mlcf->mirror = ngx_array_create(cf->pool, <span style="color:#0000ff;">4</span>, <span style="color:#000080;font-weight:bold;">sizeof</span>(ngx_str_t));<br>+        mlcf->mirror = ngx_array_create(cf->pool, <span style="color:#0000ff;">4</span>,<br>+                                <span style="color:#000080;font-weight:bold;">sizeof</span>(ngx_http_complex_value_t));<br>         <span style="color:#000080;font-weight:bold;">if </span>(mlcf->mirror == NULL) {<br>             <span style="color:#000080;font-weight:bold;">return </span>NGX_CONF_ERROR;<br>         }<br>     }<br><br>-    s = ngx_array_push(mlcf->mirror);<br>-    <span style="color:#000080;font-weight:bold;">if </span>(s == NULL) {<br>+    pcv = ngx_array_push(mlcf->mirror);<br>+    <span style="color:#000080;font-weight:bold;">if </span>(pcv == NULL) {<br>         <span style="color:#000080;font-weight:bold;">return </span>NGX_CONF_ERROR;<br>     }<br><br>-    *s = value[<span style="color:#0000ff;">1</span>];<br>+    *pcv = cv;<br><br>     <span style="color:#000080;font-weight:bold;">return </span>NGX_CONF_OK;<br> }</pre>