]> git.kaiwu.me - nginx.git/commitdiff
Added r->schema.
authorRuslan Ermilov <ru@nginx.com>
Thu, 7 Jun 2018 17:01:41 +0000 (20:01 +0300)
committerRuslan Ermilov <ru@nginx.com>
Thu, 7 Jun 2018 17:01:41 +0000 (20:01 +0300)
For HTTP/1, it keeps scheme from the absolute form of URI.
For HTTP/2, the :scheme request pseudo-header field value.

src/http/ngx_http_core_module.c
src/http/ngx_http_request.c
src/http/ngx_http_request.h
src/http/v2/ngx_http_v2.c

index 2d8fdb88ea52c3273e8f2910d8e2351bdb488e54..c57ec00ce7ebc91f3d47071e640640cad078baac 100644 (file)
@@ -2318,6 +2318,7 @@ ngx_http_subrequest(ngx_http_request_t *r,
     sr->unparsed_uri = r->unparsed_uri;
     sr->method_name = ngx_http_core_get_method;
     sr->http_protocol = r->http_protocol;
+    sr->schema = r->schema;
 
     ngx_http_set_exten(sr);
 
index 210994b6f5648eaaae85909f8f17e7308805cbea..0432c91b27617e1a08db9979cec66437687ba700 100644 (file)
@@ -987,6 +987,11 @@ ngx_http_process_request_line(ngx_event_t *rev)
                 return;
             }
 
+            if (r->schema_end) {
+                r->schema.len = r->schema_end - r->schema_start;
+                r->schema.data = r->schema_start;
+            }
+
             if (r->host_end) {
 
                 host.len = r->host_end - r->host_start;
index 39baa0f0ccf7ea5ec53f0721a49e7dbcb4cd2539..6bfff96ef8b444d8d0b16acf13164503470fb997 100644 (file)
@@ -412,6 +412,7 @@ struct ngx_http_request_s {
 
     ngx_str_t                         method_name;
     ngx_str_t                         http_protocol;
+    ngx_str_t                         schema;
 
     ngx_chain_t                      *out;
     ngx_http_request_t               *main;
index a35140cf697ef24e41059db81d1a04151023139c..d3fdf05e3bec8d53919f9262f8a99032148b1996 100644 (file)
@@ -2616,16 +2616,14 @@ ngx_http_v2_push_stream(ngx_http_v2_stream_t *parent, ngx_str_t *path)
     r->method_name = ngx_http_core_get_method;
     r->method = NGX_HTTP_GET;
 
-    r->schema_start = (u_char *) "https";
-
 #if (NGX_HTTP_SSL)
     if (fc->ssl) {
-        r->schema_end = r->schema_start + 5;
+        ngx_str_set(&r->schema, "https");
 
     } else
 #endif
     {
-        r->schema_end = r->schema_start + 4;
+        ngx_str_set(&r->schema, "http");
     }
 
     value.data = ngx_pstrdup(pool, path);
@@ -3477,7 +3475,7 @@ ngx_http_v2_parse_scheme(ngx_http_request_t *r, ngx_str_t *value)
     u_char      c, ch;
     ngx_uint_t  i;
 
-    if (r->schema_start) {
+    if (r->schema.len) {
         ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                       "client sent duplicate :scheme header");
 
@@ -3511,8 +3509,7 @@ ngx_http_v2_parse_scheme(ngx_http_request_t *r, ngx_str_t *value)
         return NGX_DECLINED;
     }
 
-    r->schema_start = value->data;
-    r->schema_end = value->data + value->len;
+    r->schema = *value;
 
     return NGX_OK;
 }
@@ -3575,14 +3572,14 @@ ngx_http_v2_construct_request_line(ngx_http_request_t *r)
     static const u_char ending[] = " HTTP/2.0";
 
     if (r->method_name.len == 0
-        || r->schema_start == NULL
+        || r->schema.len == 0
         || r->unparsed_uri.len == 0)
     {
         if (r->method_name.len == 0) {
             ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                           "client sent no :method header");
 
-        } else if (r->schema_start == NULL) {
+        } else if (r->schema.len == 0) {
             ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                           "client sent no :scheme header");