diff src/http/v2/ngx_http_v2_module.c @ 9121:262c01782566

HTTP/2: removed server push (ticket #2432). Although it has better implementation status than HTTP/3 server push, it remains of limited use, with adoption numbers seen as negligible. Per IETF 102 materials, server push was used only in 0.04% of sessions. It was considered to be "difficult to use effectively" in RFC 9113. Its use is further limited by badly matching to fetch/cache/connection models in browsers, see related discussions linked from [1]. Server push was disabled in Chrome 106 [2]. The http2_push, http2_push_preload, and http2_max_concurrent_pushes directives are made obsolete. In particular, this essentially reverts 7201:641306096f5b and 7207:3d2b0b02bd3d. [1] https://jakearchibald.com/2017/h2-push-tougher-than-i-thought/ [2] https://chromestatus.com/feature/6302414934114304
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 08 Jun 2023 16:56:46 +0400
parents 08ef02ad5c54
children ea1f29c2010c
line wrap: on
line diff
--- a/src/http/v2/ngx_http_v2_module.c
+++ b/src/http/v2/ngx_http_v2_module.c
@@ -27,8 +27,6 @@ static void *ngx_http_v2_create_loc_conf
 static char *ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent,
     void *child);
 
-static char *ngx_http_v2_push(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-
 static char *ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post,
     void *data);
 static char *ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data);
@@ -105,9 +103,9 @@ static ngx_command_t  ngx_http_v2_comman
 
     { ngx_string("http2_max_concurrent_pushes"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_num_slot,
-      NGX_HTTP_SRV_CONF_OFFSET,
-      offsetof(ngx_http_v2_srv_conf_t, concurrent_pushes),
+      ngx_http_v2_obsolete,
+      0,
+      0,
       NULL },
 
     { ngx_string("http2_max_requests"),
@@ -168,15 +166,15 @@ static ngx_command_t  ngx_http_v2_comman
 
     { ngx_string("http2_push_preload"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_v2_loc_conf_t, push_preload),
+      ngx_http_v2_obsolete,
+      0,
+      0,
       NULL },
 
     { ngx_string("http2_push"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-      ngx_http_v2_push,
-      NGX_HTTP_LOC_CONF_OFFSET,
+      ngx_http_v2_obsolete,
+      0,
       0,
       NULL },
 
@@ -326,7 +324,6 @@ ngx_http_v2_create_srv_conf(ngx_conf_t *
     h2scf->pool_size = NGX_CONF_UNSET_SIZE;
 
     h2scf->concurrent_streams = NGX_CONF_UNSET_UINT;
-    h2scf->concurrent_pushes = NGX_CONF_UNSET_UINT;
 
     h2scf->preread_size = NGX_CONF_UNSET_SIZE;
 
@@ -348,8 +345,6 @@ ngx_http_v2_merge_srv_conf(ngx_conf_t *c
 
     ngx_conf_merge_uint_value(conf->concurrent_streams,
                               prev->concurrent_streams, 128);
-    ngx_conf_merge_uint_value(conf->concurrent_pushes,
-                              prev->concurrent_pushes, 10);
 
     ngx_conf_merge_size_value(conf->preread_size, prev->preread_size, 65536);
 
@@ -370,17 +365,8 @@ ngx_http_v2_create_loc_conf(ngx_conf_t *
         return NULL;
     }
 
-    /*
-     * set by ngx_pcalloc():
-     *
-     *     h2lcf->pushes = NULL;
-     */
-
     h2lcf->chunk_size = NGX_CONF_UNSET_SIZE;
 
-    h2lcf->push_preload = NGX_CONF_UNSET;
-    h2lcf->push = NGX_CONF_UNSET;
-
     return h2lcf;
 }
 
@@ -393,72 +379,6 @@ ngx_http_v2_merge_loc_conf(ngx_conf_t *c
 
     ngx_conf_merge_size_value(conf->chunk_size, prev->chunk_size, 8 * 1024);
 
-    ngx_conf_merge_value(conf->push, prev->push, 1);
-
-    if (conf->push && conf->pushes == NULL) {
-        conf->pushes = prev->pushes;
-    }
-
-    ngx_conf_merge_value(conf->push_preload, prev->push_preload, 0);
-
-    return NGX_CONF_OK;
-}
-
-
-static char *
-ngx_http_v2_push(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    ngx_http_v2_loc_conf_t *h2lcf = conf;
-
-    ngx_str_t                         *value;
-    ngx_http_complex_value_t          *cv;
-    ngx_http_compile_complex_value_t   ccv;
-
-    value = cf->args->elts;
-
-    if (ngx_strcmp(value[1].data, "off") == 0) {
-
-        if (h2lcf->pushes) {
-            return "\"off\" parameter cannot be used with URI";
-        }
-
-        if (h2lcf->push == 0) {
-            return "is duplicate";
-        }
-
-        h2lcf->push = 0;
-        return NGX_CONF_OK;
-    }
-
-    if (h2lcf->push == 0) {
-        return "URI cannot be used with \"off\" parameter";
-    }
-
-    h2lcf->push = 1;
-
-    if (h2lcf->pushes == NULL) {
-        h2lcf->pushes = ngx_array_create(cf->pool, 1,
-                                         sizeof(ngx_http_complex_value_t));
-        if (h2lcf->pushes == NULL) {
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    cv = ngx_array_push(h2lcf->pushes);
-    if (cv == NULL) {
-        return NGX_CONF_ERROR;
-    }
-
-    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;
-    }
-
     return NGX_CONF_OK;
 }
 
@@ -562,10 +482,17 @@ ngx_http_v2_obsolete(ngx_conf_t *cf, ngx
 {
     ngx_conf_deprecated_t  *d = cmd->post;
 
-    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
-                       "the \"%s\" directive is obsolete, "
-                       "use the \"%s\" directive instead",
-                       d->old_name, d->new_name);
+    if (d) {
+        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
+                           "the \"%s\" directive is obsolete, "
+                           "use the \"%s\" directive instead",
+                           d->old_name, d->new_name);
+
+    } else {
+        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
+                           "the \"%V\" directive is obsolete, ignored",
+                           &cmd->name);
+    }
 
     return NGX_CONF_OK;
 }