[PATCH 17 of 31] Gzip static: "always" parameter in "gzip_static" directive

Maxim Dounin mdounin at mdounin.ru
Tue Jun 28 14:32:02 MSD 2011


Hello!

On Mon, Jun 27, 2011 at 11:01:01AM -0700, Zhu Qun-Ying wrote:

> It would be more readable if numerical definition of off/on/always
> use enum type in stead of plain number directly,
> like:
> enum {
> 	NGX_HTTP_GZIP_STATIC_OFF,
> 	NGX_HTTP_GZIP_STATIC_ON,
> 	NGX_HTTP_GZIP_STATIC_ALWAYS,
> };
> 
> Do you think so?

nginx generally don't use enum's for this, but defines or bare 
numbers.  I was lazy and tried to minimize diffs, so used bare 
numbers.  Attached patch uses defines instead, it's probably 
results in more readable code.

Switching to enums may be somewhat beneficial, but it should be 
tested carefully on old-but-still-alive compilers (not sure what 
we still support though).  I suspect there may be problems with 
enum constants in static initializers (and with trailing comma, 
btw, it only appeared in C99).

Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1309255342 -14400
# Node ID ff0e12ab4a4f597e349ab4545e2f448f457bc279
# Parent  49f71170fdaab701888666047d93ca8f27072b6a
Gzip static: "always" parameter in "gzip_static" directive.

With "always" gzip static returns gzipped content in all cases, without
checking if client supports it.  It is usefull if you has no gunzipped files
on disk anyway.

diff --git a/src/http/modules/ngx_http_gzip_static_module.c b/src/http/modules/ngx_http_gzip_static_module.c
--- a/src/http/modules/ngx_http_gzip_static_module.c
+++ b/src/http/modules/ngx_http_gzip_static_module.c
@@ -9,8 +9,13 @@
 #include <ngx_http.h>
 
 
+#define NGX_HTTP_GZIP_STATIC_OFF     0
+#define NGX_HTTP_GZIP_STATIC_ON      1
+#define NGX_HTTP_GZIP_STATIC_ALWAYS  2
+
+
 typedef struct {
-    ngx_flag_t  enable;
+    ngx_uint_t  enable;
 } ngx_http_gzip_static_conf_t;
 
 
@@ -21,14 +26,22 @@ static char *ngx_http_gzip_static_merge_
 static ngx_int_t ngx_http_gzip_static_init(ngx_conf_t *cf);
 
 
+static ngx_conf_enum_t  ngx_http_gzip_static[] = {
+    { ngx_string("off"), NGX_HTTP_GZIP_STATIC_OFF },
+    { ngx_string("on"), NGX_HTTP_GZIP_STATIC_ON },
+    { ngx_string("always"), NGX_HTTP_GZIP_STATIC_ALWAYS },
+    { ngx_null_string, 0 }
+};
+
+
 static ngx_command_t  ngx_http_gzip_static_commands[] = {
 
     { ngx_string("gzip_static"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
+      ngx_conf_set_enum_slot,
       NGX_HTTP_LOC_CONF_OFFSET,
       offsetof(ngx_http_gzip_static_conf_t, enable),
-      NULL },
+      &ngx_http_gzip_static },
 
       ngx_null_command
 };
@@ -91,11 +104,17 @@ ngx_http_gzip_static_handler(ngx_http_re
 
     gzcf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_static_module);
 
-    if (!gzcf->enable) {
+    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) {
         return NGX_DECLINED;
     }
 
-    rc = ngx_http_gzip_ok(r);
+    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) {
+        rc = ngx_http_gzip_ok(r);
+
+    } else {
+        /* always */
+        rc = NGX_OK;
+    }
 
     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
 
@@ -160,10 +179,12 @@ ngx_http_gzip_static_handler(ngx_http_re
         return NGX_DECLINED;
     }
 
-    r->gzip_vary = 1;
+    if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) {
+        r->gzip_vary = 1;
 
-    if (rc != NGX_OK) {
-        return NGX_DECLINED;
+        if (rc != NGX_OK) {
+            return NGX_DECLINED;
+        }
     }
 
     ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "http static fd: %d", of.fd);
@@ -261,7 +282,7 @@ ngx_http_gzip_static_create_conf(ngx_con
         return NULL;
     }
 
-    conf->enable = NGX_CONF_UNSET;
+    conf->enable = NGX_CONF_UNSET_UINT;
 
     return conf;
 }
@@ -273,7 +294,8 @@ ngx_http_gzip_static_merge_conf(ngx_conf
     ngx_http_gzip_static_conf_t *prev = parent;
     ngx_http_gzip_static_conf_t *conf = child;
 
-    ngx_conf_merge_value(conf->enable, prev->enable, 0);
+    ngx_conf_merge_uint_value(conf->enable, prev->enable,
+                              NGX_HTTP_GZIP_STATIC_OFF);
 
     return NGX_CONF_OK;
 }


More information about the nginx-devel mailing list