changeset 8923:651cc905b7c2 quic

HTTP/3: $http3 variable. A new variable $http3 is added. The variable equals to "h3" for HTTP/3 connections, "hq" for hq connections and is an empty string otherwise. The variable $quic is eliminated. The new variable is similar to $http2 variable.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 01 Dec 2021 11:02:17 +0300
parents be08b858086a
children d6ef13c5fd8e
files README src/http/v3/ngx_http_v3_module.c
diffstat 2 files changed, 30 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/README
+++ b/README
@@ -141,7 +141,11 @@ 3. Configuration
         http3_push_preload
         http3_hq (requires NGX_HTTP_V3_HQ macro)
 
-    An additional variable is available: $quic.
+    In http, an additional variable is available: $http3.
+    The value of $http3 is "h3" for HTTP/3 connections,
+    "hq" for hq connections, or an empty string otherwise.
+
+    In stream, an additional variable is available: $quic.
     The value of $quic is "quic" if QUIC connection is used,
     or an empty string otherwise.
 
--- a/src/http/v3/ngx_http_v3_module.c
+++ b/src/http/v3/ngx_http_v3_module.c
@@ -10,7 +10,7 @@
 #include <ngx_http.h>
 
 
-static ngx_int_t ngx_http_v3_variable_quic(ngx_http_request_t *r,
+static ngx_int_t ngx_http_v3_variable(ngx_http_request_t *r,
     ngx_http_variable_value_t *v, uintptr_t data);
 static ngx_int_t ngx_http_v3_add_variables(ngx_conf_t *cf);
 static void *ngx_http_v3_create_srv_conf(ngx_conf_t *cf);
@@ -235,7 +235,7 @@ ngx_module_t  ngx_http_v3_module = {
 
 static ngx_http_variable_t  ngx_http_v3_vars[] = {
 
-    { ngx_string("quic"), NULL, ngx_http_v3_variable_quic, 0, 0, 0 },
+    { ngx_string("http3"), NULL, ngx_http_v3_variable, 0, 0, 0 },
 
       ngx_http_null_variable
 };
@@ -244,20 +244,38 @@ static ngx_str_t  ngx_http_quic_salt = n
 
 
 static ngx_int_t
-ngx_http_v3_variable_quic(ngx_http_request_t *r,
+ngx_http_v3_variable(ngx_http_request_t *r,
     ngx_http_variable_value_t *v, uintptr_t data)
 {
     if (r->connection->quic) {
+#if (NGX_HTTP_V3_HQ)
 
-        v->len = 4;
+        ngx_http_v3_srv_conf_t  *h3scf;
+
+        h3scf = ngx_http_get_module_srv_conf(r, ngx_http_v3_module);
+
+        if (h3scf->hq) {
+            v->len = sizeof("hq") - 1;
+            v->valid = 1;
+            v->no_cacheable = 0;
+            v->not_found = 0;
+            v->data = (u_char *) "hq";
+
+            return NGX_OK;
+        }
+
+#endif
+
+        v->len = sizeof("h3") - 1;
         v->valid = 1;
-        v->no_cacheable = 1;
+        v->no_cacheable = 0;
         v->not_found = 0;
-        v->data = (u_char *) "quic";
+        v->data = (u_char *) "h3";
+
         return NGX_OK;
     }
 
-    v->not_found = 1;
+    *v = ngx_http_variable_null_value;
 
     return NGX_OK;
 }