<div dir="ltr"><div style="text-align:start"><span style="color:rgb(0,0,0);line-height:20px;text-align:justify"><font face="monospace, monospace">Currently, there is no way way to control the scheme which will be used in nginx-issued redirects. This is a problem when the client is potentially using a different scheme than nginx due to a SSL terminating load balancer. As some client requests may have started over http and some over https, we'd like to way to dynamically set the proper client scheme.</font></span></div><div style="text-align:start"><span style="color:rgb(0,0,0);line-height:20px;text-align:justify"><font face="monospace, monospace"><br></font></span></div><div style="text-align:start"><span style="color:rgb(0,0,0);line-height:20px;text-align:justify"><font face="monospace, monospace">This is a patch which adds a directive `</font></span><font color="#000000" face="monospace, monospace"><span style="line-height:20px">client_scheme_in_redirect` to complement `server_name_in_redirect` and `port_</span></font><span style="color:rgb(0,0,0);font-family:monospace,monospace;line-height:20px">in_redirect`.</span></div><div style="text-align:start"><span style="color:rgb(0,0,0);font-family:monospace,monospace;line-height:20px"><br></span></div><div style="text-align:start"><span style="color:rgb(0,0,0);font-family:monospace,monospace;line-height:20px">A suggested documentation block is included in the commit.</span></div><div style="text-align:start"><span style="color:rgb(0,0,0);font-family:monospace,monospace;line-height:20px"><br></span></div><div style="text-align:start"><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"># HG changeset patch</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"># User Kyle Ibrahim <<a href="mailto:kibrahim@getpantheon.com">kibrahim@getpantheon.com</a>></span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"># Date 1426414581 25200</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">#      Sun Mar 15 03:16:21 2015 -0700</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"># Node ID 9785f13c006025f180b354bdeac2de5d8cc9af8e</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"># Parent  79b473d5381d85f79ab71b7aa85ecf9be1caf9fb</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">Added support for client_scheme_in_redirect directive</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"><br></span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">Syntax: client_scheme_in_redirect scheme;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">Default: --</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">Context: http, server, location</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"><br></span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">The client_scheme_in_redirect directive defines the scheme in redirects issued by nginx. When not specified, the scheme will be https if the current connection is</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">over ssl and http otherwise. The scheme value can contain variables.</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"><br></span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">diff -r 79b473d5381d -r 9785f13c0060 contrib/vim/syntax/nginx.vim</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">--- a/contrib/vim/syntax/nginx.vim<span class="" style="white-space:pre">  </span>Fri Mar 13 16:43:01 2015 +0300</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+++ b/contrib/vim/syntax/nginx.vim<span class="" style="white-space:pre">        </span>Sun Mar 15 03:16:21 2015 -0700</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -96,6 +96,7 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> syn keyword ngxDirective client_header_buffer_size</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> syn keyword ngxDirective client_header_timeout</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> syn keyword ngxDirective client_max_body_size</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+syn keyword ngxDirective client_scheme_in_redirect</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> syn keyword ngxDirective connection_pool_size</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> syn keyword ngxDirective create_full_put_path</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> syn keyword ngxDirective daemon</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">diff -r 79b473d5381d -r 9785f13c0060 src/http/ngx_http_core_module.c</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">--- a/src/http/ngx_http_core_module.c<span class="" style="white-space:pre"> </span>Fri Mar 13 16:43:01 2015 +0300</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+++ b/src/http/ngx_http_core_module.c<span class="" style="white-space:pre">     </span>Sun Mar 15 03:16:21 2015 -0700</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -72,6 +72,8 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     void *conf);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     void *conf);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+static char *ngx_http_client_scheme_in_redirect(ngx_conf_t *cf,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_command_t *cmd, void *conf);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> #if (NGX_HTTP_GZIP)</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -560,6 +562,13 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">       offsetof(ngx_http_core_loc_conf_t, reset_timedout_connection),</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">       NULL },</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    { ngx_string("client_scheme_in_redirect"),</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+      ngx_http_client_scheme_in_redirect,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+      NGX_HTTP_LOC_CONF_OFFSET,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+      0,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+      NULL },</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     { ngx_string("server_name_in_redirect"),</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">       ngx_conf_set_flag_slot,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -3642,6 +3651,7 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     clcf->lingering_timeout = NGX_CONF_UNSET_MSEC;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     clcf->resolver_timeout = NGX_CONF_UNSET_MSEC;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     clcf->reset_timedout_connection = NGX_CONF_UNSET;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    clcf->client_scheme_in_redirect = NGX_CONF_UNSET_PTR;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     clcf->server_name_in_redirect = NGX_CONF_UNSET;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     clcf->port_in_redirect = NGX_CONF_UNSET;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     clcf->msie_padding = NGX_CONF_UNSET;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -3898,6 +3908,8 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_conf_merge_value(conf->reset_timedout_connection,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">                               prev->reset_timedout_connection, 0);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_conf_merge_ptr_value(conf->client_scheme_in_redirect,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+                              prev->client_scheme_in_redirect, NULL);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_conf_merge_value(conf->server_name_in_redirect,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">                               prev->server_name_in_redirect, 0);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_conf_merge_value(conf->port_in_redirect, prev->port_in_redirect, 1);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -5066,6 +5078,38 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     return NGX_CONF_OK;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+static char *</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+ngx_http_client_scheme_in_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+{</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_http_core_loc_conf_t *clcf = conf;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_str_t                         *value;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_http_compile_complex_value_t   ccv;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    if (clcf->client_scheme_in_redirect != NGX_CONF_UNSET_PTR) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        return "is duplicate";</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    value = cf->args->elts;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    <a href="http://ccv.cf">ccv.cf</a> = cf;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ccv.value = &value[1];</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ccv.complex_value = ngx_palloc(cf->pool,</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+                                   sizeof(ngx_http_complex_value_t));</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    if (ccv.complex_value == NULL) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        return NGX_CONF_ERROR;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        return NGX_CONF_ERROR;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    clcf->client_scheme_in_redirect = ccv.complex_value;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    return NGX_CONF_OK;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+}</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> #if (NGX_HTTP_GZIP)</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">diff -r 79b473d5381d -r 9785f13c0060 src/http/ngx_http_core_module.h</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">--- a/src/http/ngx_http_core_module.h<span class="" style="white-space:pre">      </span>Fri Mar 13 16:43:01 2015 +0300</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+++ b/src/http/ngx_http_core_module.h<span class="" style="white-space:pre">     </span>Sun Mar 15 03:16:21 2015 -0700</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -399,6 +399,7 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_flag_t    tcp_nopush;              /* tcp_nopush */</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_flag_t    tcp_nodelay;             /* tcp_nodelay */</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_flag_t    reset_timedout_connection; /* reset_timedout_connection */</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_http_complex_value_t    *client_scheme_in_redirect; /* client_scheme_in_redirect */</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_flag_t    server_name_in_redirect; /* server_name_in_redirect */</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_flag_t    port_in_redirect;        /* port_in_redirect */</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_flag_t    msie_padding;            /* msie_padding */</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">diff -r 79b473d5381d -r 9785f13c0060 src/http/ngx_http_header_filter_module.c</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">--- a/src/http/ngx_http_header_filter_module.c<span class="" style="white-space:pre">      </span>Fri Mar 13 16:43:01 2015 +0300</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+++ b/src/http/ngx_http_header_filter_module.c<span class="" style="white-space:pre">    </span>Sun Mar 15 03:16:21 2015 -0700</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -152,7 +152,7 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     u_char                    *p;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     size_t                     len;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-    ngx_str_t                  host, *status_line;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_str_t                  client_scheme, host, *status_line;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_buf_t                 *b;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_uint_t                 status, i, port;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_chain_t                out;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -317,6 +317,15 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         r->headers_out.location->hash = 0;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        if (clcf->client_scheme_in_redirect) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            if (ngx_http_complex_value(r, clcf->client_scheme_in_redirect, &client_scheme) != NGX_OK) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+                return NGX_ERROR;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            ngx_str_null(&client_scheme);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         if (clcf->server_name_in_redirect) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">             cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">             host = cscf->server_name;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -352,7 +361,12 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">             break;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-        len += sizeof("Location: https://") - 1</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        if (client_scheme.len) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            len += client_scheme.len;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            len += sizeof("https") - 1;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        len += sizeof("Location: ://") - 1</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">                + host.len</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">                + r->headers_out.location->value.len + 2;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -374,6 +388,7 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        ngx_str_null(&client_scheme);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         ngx_str_null(&host);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         port = 0;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -521,14 +536,19 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         p = b->last + sizeof("Location: ") - 1;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-        b->last = ngx_cpymem(b->last, "Location: http",</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-                             sizeof("Location: http") - 1);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        b->last = ngx_cpymem(b->last, "Location: ",</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+                             sizeof("Location: ") - 1);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        if (client_scheme.len) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            b->last = ngx_copy(b->last, client_scheme.data, client_scheme.len);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            b->last = ngx_cpymem(b->last, "http", sizeof("http") - 1);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> #if (NGX_HTTP_SSL)</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-        if (c->ssl) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-            *b->last++ ='s';</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            if (c->ssl) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+                *b->last++ ='s';</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+#endif</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-#endif</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         *b->last++ = ':'; *b->last++ = '/'; *b->last++ = '/';</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         b->last = ngx_copy(b->last, host.data, host.len);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">diff -r 79b473d5381d -r 9785f13c0060 src/http/ngx_http_spdy_filter_module.c</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">--- a/src/http/ngx_http_spdy_filter_module.c<span class="" style="white-space:pre">   </span>Fri Mar 13 16:43:01 2015 +0300</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+++ b/src/http/ngx_http_spdy_filter_module.c<span class="" style="white-space:pre">      </span>Sun Mar 15 03:16:21 2015 -0700</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -99,7 +99,7 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     size_t                        len;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     u_char                       *p, *buf, *last;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_buf_t                    *b;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-    ngx_str_t                     host;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+    ngx_str_t                     client_scheme, host;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_uint_t                    i, j, count, port;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_chain_t                  *cl;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     ngx_list_part_t              *part, *pt;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -217,6 +217,15 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         r->headers_out.location->hash = 0;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        if (clcf->client_scheme_in_redirect) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            if (ngx_http_complex_value(r, clcf->client_scheme_in_redirect, &client_scheme) != NGX_OK) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+                return NGX_ERROR;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            ngx_str_null(&client_scheme);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         if (clcf->server_name_in_redirect) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">             cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">             host = cscf->server_name;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -252,8 +261,14 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">             break;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        if (client_scheme.len) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            len += client_scheme.len;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            len += ngx_http_spdy_nv_vsize("https");</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         len += ngx_http_spdy_nv_nsize("location")</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-               + ngx_http_spdy_nv_vsize("https://")</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+               + ngx_http_spdy_nv_vsize("://")</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">                + host.len</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">                + r->headers_out.location->value.len;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -275,6 +290,7 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        ngx_str_null(&client_scheme);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         ngx_str_null(&host);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         port = 0;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">     }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">@@ -411,13 +427,16 @@</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         p = last + NGX_SPDY_NV_VLEN_SIZE;</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-        last = ngx_cpymem(p, "http", sizeof("http") - 1);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        if (client_scheme.len) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            last = ngx_cpymem(p, client_scheme.data, client_scheme.len);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+        } else {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            last = ngx_cpymem(p, "http", sizeof("http") - 1);</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> #if (NGX_HTTP_SSL)</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-        if (c->ssl) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-            *last++ ='s';</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            if (c->ssl) {</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+                *last++ ='s';</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+            }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">+#endif</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         }</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">-#endif</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px">         *last++ = ':'; *last++ = '/'; *last++ = '/';</span></font></div><div style><font color="#000000" face="monospace, monospace"><span style="line-height:20px"> </span></font></div><div style="color:rgb(0,0,0);font-family:monospace,monospace;line-height:20px"><br></div></div></div>