Welcome! Log In Create A New Profile

Advanced

[PATCH] Http gunzip: additional configuration

Alon Blayer-Gat
November 27, 2016 07:30AM
Hi,

1) 'gunzip always' option will gunzip even if the client supports it.
2) 'gunzip types', like 'always' but only for file types specified
with 'gunzip_types <mime-types>'
3) Allow gunzip and gunzip_types directives within "if in location"
block (rewrite phase condition).

The suggested changes are needed, mainly, to allow dynamic
modification of compressed response (e.g. with the 'sub_filter'
module)
'types' and 'if in location' may allow a more selective operation.

Changes do not present any backward incompatibility.

Directives changes summary:

gunzip (on|types|always|off)

Context: http, server, location, if in location
Default: off

off
Disable gunzip
on
Enable gunzip for clients that doesn't support it.
always
Enable gunzip even if clients support it.
types
Enable gunzip for clients that doesn't support it. but for
mime types specified
by the gunzip_types directive.

gunzip_types mime-type ...;

Context: http, server, location, if in location
Default: gunzip_types text/html;


# HG changeset patch
# User Alon Blayer-Gat <Alon.BlayerGat@gmail.com>
# Date 1480245650 -7200
# Sun Nov 27 13:20:50 2016 +0200
# Node ID d7223bbfd5b3e631ee09f876150583d18bd2d092
# Parent 2c7a2d75938a31044552b0a6cd6edaebdaf0bd69
http gunzip: additional configurations

allow within 'if in location', gunzip 'always' or 'types' for mime-types

# HG changeset patch
# User Alon Blayer-Gat <Alon.BlayerGat@gmail.com>
# Date 1480245650 -7200
# Sun Nov 27 13:20:50 2016 +0200
# Node ID d7223bbfd5b3e631ee09f876150583d18bd2d092
# Parent 2c7a2d75938a31044552b0a6cd6edaebdaf0bd69
http gunzip: additional configurations

allow within 'if in location', gunzip 'always' or 'types' for mime-types

diff -r 2c7a2d75938a -r d7223bbfd5b3
src/http/modules/ngx_http_gunzip_filter_module.c
--- a/src/http/modules/ngx_http_gunzip_filter_module.c Mon Nov 21
16:49:19 2016 +0300
+++ b/src/http/modules/ngx_http_gunzip_filter_module.c Sun Nov 27
13:20:50 2016 +0200
@@ -13,9 +13,17 @@
#include <zlib.h>


+#define NGX_HTTP_GUNZIP_OFF 0
+#define NGX_HTTP_GUNZIP_ON 1
+#define NGX_HTTP_GUNZIP_ALWAYS 2
+#define NGX_HTTP_GUNZIP_TYPES 3
+
+
typedef struct {
- ngx_flag_t enable;
+ ngx_uint_t enable;
ngx_bufs_t bufs;
+ ngx_hash_t types;
+ ngx_array_t *types_keys;
} ngx_http_gunzip_conf_t;


@@ -62,14 +70,24 @@
void *parent, void *child);


+static ngx_conf_enum_t ngx_http_gunzip[] = {
+ { ngx_string("off"), NGX_HTTP_GUNZIP_OFF },
+ { ngx_string("on"), NGX_HTTP_GUNZIP_ON },
+ { ngx_string("always"), NGX_HTTP_GUNZIP_ALWAYS },
+ { ngx_string("types"), NGX_HTTP_GUNZIP_TYPES },
+ { ngx_null_string, 0 }
+};
+
+
static ngx_command_t ngx_http_gunzip_filter_commands[] = {

{ ngx_string("gunzip"),
- NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
- ngx_conf_set_flag_slot,
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+ |NGX_CONF_TAKE1,
+ ngx_conf_set_enum_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_gunzip_conf_t, enable),
- NULL },
+ &ngx_http_gunzip },

{ ngx_string("gunzip_buffers"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
@@ -78,6 +96,13 @@
offsetof(ngx_http_gunzip_conf_t, bufs),
NULL },

+ { ngx_string("gunzip_types"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
+ ngx_http_types_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_gunzip_conf_t, types_keys),
+ &ngx_http_html_default_types[0] },
+
ngx_null_command
};

@@ -126,10 +151,10 @@
conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module);

/* TODO support multiple content-codings */
- /* TODO always gunzip - due to configuration or module request */
+
/* TODO ignore content encoding? */

- if (!conf->enable
+ if (conf->enable == NGX_HTTP_GUNZIP_OFF
|| r->headers_out.content_encoding == NULL
|| r->headers_out.content_encoding->value.len != 4
|| ngx_strncasecmp(r->headers_out.content_encoding->value.data,
@@ -140,14 +165,22 @@

r->gzip_vary = 1;

- if (!r->gzip_tested) {
- if (ngx_http_gzip_ok(r) == NGX_OK) {
+ if (conf->enable == NGX_HTTP_GUNZIP_ON) {
+ if (!r->gzip_tested) {
+ if (ngx_http_gzip_ok(r) == NGX_OK) {
+ return ngx_http_next_header_filter(r);
+ }
+
+ } else if (r->gzip_ok) {
return ngx_http_next_header_filter(r);
}
-
- } else if (r->gzip_ok) {
- return ngx_http_next_header_filter(r);
}
+ else if (conf->enable == NGX_HTTP_GUNZIP_TYPES
+ && ngx_http_test_content_type(r, &conf->types) == NULL)
+ {
+ return ngx_http_next_header_filter(r);
+ }
+ /* else always gunzip - conf->enable == NGX_HTTP_GUNZIP_ALWAYS) */

ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gunzip_ctx_t));
if (ctx == NULL) {
@@ -651,9 +684,11 @@
* set by ngx_pcalloc():
*
* conf->bufs.num = 0;
+ * conf->types = { NULL };
+ * conf->types_keys = NULL;
*/

- conf->enable = NGX_CONF_UNSET;
+ conf->enable = NGX_CONF_UNSET_UINT;

return conf;
}
@@ -670,6 +705,14 @@
ngx_conf_merge_bufs_value(conf->bufs, prev->bufs,
(128 * 1024) / ngx_pagesize, ngx_pagesize);

+ if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types,
+ &prev->types_keys, &prev->types,
+ ngx_http_html_default_types)
+ != NGX_OK)
+ {
+ return NGX_CONF_ERROR;
+ }
+
return NGX_CONF_OK;
}

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[PATCH] Http gunzip: additional configuration

Alon Blayer-Gat 1163 November 27, 2016 07:30AM

Re: [PATCH] Http gunzip: additional configuration

Maxim Dounin 509 December 07, 2016 11:00AM

Re: [PATCH] Http gunzip: additional configuration

Alon Blayer-Gat 287 January 22, 2017 09:08AM

Re: [PATCH] Http gunzip: additional configuration

Alon Blayer-Gat 330 January 23, 2017 01:24AM

Re: [PATCH] Http gunzip: additional configuration

Maxim Dounin 608 January 26, 2017 09:02AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 300
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready