Fixed whitespaces. It seems that patch over trunk and over 1.11.10 tag differ only in dates and hashes.
# HG changeset patch # User Evgenii Kliuchnikov <[email protected]> # Date 1487932524 -3600 # Fri Feb 24 11:35:24 2017 +0100 # Node ID 662115ad250f48cfdd7963de40bfe7c7c8ae8ba3 # Parent 1ad0999a7ded3d4fb01c7acf8ff57c80b643da7e Add brotli static serving support (ontoZZ 1.11.10) Both .gz and .br static content is served by ngx_http_gzip_static_modile, but have separate configuration. diff -r 1ad0999a7ded -r 662115ad250f contrib/vim/syntax/nginx.vim --- a/contrib/vim/syntax/nginx.vim Tue Feb 14 18:36:04 2017 +0300 +++ b/contrib/vim/syntax/nginx.vim Fri Feb 24 11:35:24 2017 +0100 @@ -86,6 +86,7 @@ syn keyword ngxDirective autoindex syn keyword ngxDirective autoindex_exact_size syn keyword ngxDirective autoindex_localtime +syn keyword ngxDirective brotli_static syn keyword ngxDirective charset syn keyword ngxDirective charset_types syn keyword ngxDirective chunked_transfer_encoding diff -r 1ad0999a7ded -r 662115ad250f src/http/modules/ngx_http_gzip_static_module.c --- a/src/http/modules/ngx_http_gzip_static_module.c Tue Feb 14 18:36:04 2017 +0300 +++ b/src/http/modules/ngx_http_gzip_static_module.c Fri Feb 24 11:35:24 2017 +0100 @@ -16,10 +16,14 @@ typedef struct { - ngx_uint_t enable; + ngx_uint_t enable_gzip; + ngx_uint_t enable_brotli; } ngx_http_gzip_static_conf_t; +static ngx_int_t ngx_http_gzip_static_serve_file(ngx_http_request_t *r, + ngx_uint_t enable, ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, + ngx_str_t *encoding); static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r); static void *ngx_http_gzip_static_create_conf(ngx_conf_t *cf); static char *ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void *parent, @@ -41,7 +45,14 @@ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, ngx_conf_set_enum_slot, NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_static_conf_t, enable), + offsetof(ngx_http_gzip_static_conf_t, enable_gzip), + &ngx_http_gzip_static }, + + { ngx_string("brotli_static"), + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_conf_set_enum_slot, + NGX_HTTP_LOC_CONF_OFFSET, + offsetof(ngx_http_gzip_static_conf_t, enable_brotli), &ngx_http_gzip_static }, ngx_null_command @@ -79,19 +90,14 @@ }; +static ngx_str_t encoding_gzip = ngx_string("gzip"); +static ngx_str_t encoding_brotli = ngx_string("br"); + + static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r) { - u_char *p; - size_t root; - ngx_str_t path; ngx_int_t rc; - ngx_uint_t level; - ngx_log_t *log; - ngx_buf_t *b; - ngx_chain_t out; - ngx_table_elt_t *h; - ngx_open_file_info_t of; ngx_http_core_loc_conf_t *clcf; ngx_http_gzip_static_conf_t *gzcf; @@ -105,19 +111,56 @@ gzcf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_static_module); - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) { + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_OFF + && gzcf->enable_brotli == NGX_HTTP_GZIP_STATIC_OFF) { return NGX_DECLINED; } - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { - rc = ngx_http_gzip_ok(r); + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - } else { - /* always */ - rc = NGX_OK; + rc = NGX_DECLINED; + if (gzcf->enable_gzip != NGX_HTTP_GZIP_STATIC_OFF) { + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { + rc = ngx_http_gzip_ok(r); + } else { + /* always */ + rc = NGX_OK; + } + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_gzip, rc, clcf, + &encoding_gzip); } - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); + if (gzcf->enable_brotli != NGX_HTTP_GZIP_STATIC_OFF && rc == NGX_DECLINED) { + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { + rc = ngx_http_gzip_ok(r); + } else { + /* always */ + rc = NGX_OK; + } + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_brotli, rc, clcf, + &encoding_brotli); + } + + return rc; +} + + +static ngx_int_t +ngx_http_gzip_static_serve_file(ngx_http_request_t *r, ngx_uint_t enable, + ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, ngx_str_t *encoding) +{ + u_char *p; + size_t root; + ngx_str_t path; + ngx_int_t rc; + ngx_uint_t level; + ngx_log_t *log; + ngx_buf_t *b; + ngx_chain_t out; + ngx_table_elt_t *h; + ngx_open_file_info_t of; + + rc = ok; if (!clcf->gzip_vary && rc != NGX_OK) { return NGX_DECLINED; @@ -125,14 +168,14 @@ log = r->connection->log; - p = ngx_http_map_uri_to_path(r, &path, &root, sizeof(".gz") - 1); + p = ngx_http_map_uri_to_path(r, &path, &root, 4 - 1); if (p == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } *p++ = '.'; - *p++ = 'g'; - *p++ = 'z'; + *p++ = encoding->data[0]; + *p++ = encoding->data[1]; *p = '\0'; path.len = p - path.data; @@ -188,7 +231,7 @@ return NGX_DECLINED; } - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { + if (enable == NGX_HTTP_GZIP_STATIC_ON) { r->gzip_vary = 1; if (rc != NGX_OK) { @@ -243,7 +286,7 @@ h->hash = 1; ngx_str_set(&h->key, "Content-Encoding"); - ngx_str_set(&h->value, "gzip"); + h->value = *encoding; r->headers_out.content_encoding = h; /* we need to allocate all before the header would be sent */ @@ -293,7 +336,8 @@ return NULL; } - conf->enable = NGX_CONF_UNSET_UINT; + conf->enable_gzip = NGX_CONF_UNSET_UINT; + conf->enable_brotli = NGX_CONF_UNSET_UINT; return conf; } @@ -305,7 +349,9 @@ ngx_http_gzip_static_conf_t *prev = parent; ngx_http_gzip_static_conf_t *conf = child; - ngx_conf_merge_uint_value(conf->enable, prev->enable, + ngx_conf_merge_uint_value(conf->enable_gzip, prev->enable_gzip, + NGX_HTTP_GZIP_STATIC_OFF); + ngx_conf_merge_uint_value(conf->enable_brotli, prev->enable_brotli, NGX_HTTP_GZIP_STATIC_OFF); return NGX_CONF_OK; diff -r 1ad0999a7ded -r 662115ad250f src/http/ngx_http_core_module.c --- a/src/http/ngx_http_core_module.c Tue Feb 14 18:36:04 2017 +0300 +++ b/src/http/ngx_http_core_module.c Fri Feb 24 11:35:24 2017 +0100 @@ -74,8 +74,8 @@ static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); #if (NGX_HTTP_GZIP) -static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae); -static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last); +static ngx_int_t ngx_http_accept_encoding(ngx_str_t *ae, char *e, size_t n); +static ngx_uint_t ngx_http_encoding_quantity(u_char *p, u_char *last); static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); #endif @@ -2170,7 +2170,7 @@ */ if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0 - && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK) + && ngx_http_accept_encoding(&ae->value, "gzip", 4) != NGX_OK) { return NGX_DECLINED; } @@ -2297,15 +2297,42 @@ } +ngx_int_t +ngx_http_brotli_ok(ngx_http_request_t *r) +{ + ngx_table_elt_t *ae; + + if (r != r->main) { + return NGX_DECLINED; + } + + ae = r->headers_in.accept_encoding; + if (ae == NULL) { + return NGX_DECLINED; + } + + if (ae->value.len < sizeof("br") - 1) { + return NGX_DECLINED; + } + + if (ngx_http_accept_encoding(&ae->value, "br", 2) != NGX_OK) + { + return NGX_DECLINED; + } + + return NGX_OK; +} + + /* - * gzip is enabled for the following quantities: + * encoding is enabled for the following quantities: * "gzip; q=0.001" ... "gzip; q=1.000" - * gzip is disabled for the following quantities: - * "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases + * encoding is disabled for the following quantities: + * "br; q=0" ... "br; q=0.000", and for any invalid cases */ static ngx_int_t -ngx_http_gzip_accept_encoding(ngx_str_t *ae) +ngx_http_accept_encoding(ngx_str_t *ae, char *e, size_t n) { u_char *p, *start, *last; @@ -2313,7 +2340,7 @@ last = start + ae->len; for ( ;; ) { - p = ngx_strcasestrn(start, "gzip", 4 - 1); + p = ngx_strcasestrn(start, e, n - 1); if (p == NULL) { return NGX_DECLINED; } @@ -2322,10 +2349,10 @@ break; } - start = p + 4; - } - - p += 4; + start = p + n; + } + + p += n; while (p < last) { switch (*p++) { @@ -2364,7 +2391,7 @@ return NGX_DECLINED; } - if (ngx_http_gzip_quantity(p, last) == 0) { + if (ngx_http_encoding_quantity(p, last) == 0) { return NGX_DECLINED; } @@ -2373,7 +2400,7 @@ static ngx_uint_t -ngx_http_gzip_quantity(u_char *p, u_char *last) +ngx_http_encoding_quantity(u_char *p, u_char *last) { u_char c; ngx_uint_t n, q; diff -r 1ad0999a7ded -r 662115ad250f src/http/ngx_http_core_module.h --- a/src/http/ngx_http_core_module.h Tue Feb 14 18:36:04 2017 +0300 +++ b/src/http/ngx_http_core_module.h Fri Feb 24 11:35:24 2017 +0100 @@ -504,6 +504,7 @@ ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r); #if (NGX_HTTP_GZIP) ngx_int_t ngx_http_gzip_ok(ngx_http_request_t *r); +ngx_int_t ngx_http_brotli_ok(ngx_http_request_t *r); #endif On 24 February 2017 at 12:01, Eugene Kluchnikov <[email protected]> wrote: > Easily =) > > > # HG changeset patch > # User Evgenii Kliuchnikov <[email protected]> > # Date 1487932524 -3600 > # Fri Feb 24 11:35:24 2017 +0100 > # Node ID e1f5e06ade015f9855a6f683817cde7bb0f243a3 > # Parent 1ad0999a7ded3d4fb01c7acf8ff57c80b643da7e > Add brotli static (over nginx-1.11.10) > > diff -r 1ad0999a7ded -r e1f5e06ade01 contrib/vim/syntax/nginx.vim > --- a/contrib/vim/syntax/nginx.vim Tue Feb 14 18:36:04 2017 +0300 > +++ b/contrib/vim/syntax/nginx.vim Fri Feb 24 11:35:24 2017 +0100 > @@ -86,6 +86,7 @@ > syn keyword ngxDirective autoindex > syn keyword ngxDirective autoindex_exact_size > syn keyword ngxDirective autoindex_localtime > +syn keyword ngxDirective brotli_static > syn keyword ngxDirective charset > syn keyword ngxDirective charset_types > syn keyword ngxDirective chunked_transfer_encoding > diff -r 1ad0999a7ded -r e1f5e06ade01 src/http/modules/ngx_http_ > gzip_static_module.c > --- a/src/http/modules/ngx_http_gzip_static_module.c Tue Feb 14 18:36:04 > 2017 +0300 > +++ b/src/http/modules/ngx_http_gzip_static_module.c Fri Feb 24 11:35:24 > 2017 +0100 > @@ -16,10 +16,13 @@ > > > typedef struct { > - ngx_uint_t enable; > + ngx_uint_t enable_gzip; > + ngx_uint_t enable_brotli; > } ngx_http_gzip_static_conf_t; > > - > +static ngx_int_t ngx_http_gzip_static_serve_file(ngx_http_request_t *r, > + ngx_uint_t enable, ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, > + ngx_str_t *encoding); > static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r); > static void *ngx_http_gzip_static_create_conf(ngx_conf_t *cf); > static char *ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void > *parent, > @@ -41,7 +44,14 @@ > NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF| > NGX_CONF_TAKE1, > ngx_conf_set_enum_slot, > NGX_HTTP_LOC_CONF_OFFSET, > - offsetof(ngx_http_gzip_static_conf_t, enable), > + offsetof(ngx_http_gzip_static_conf_t, enable_gzip), > + &ngx_http_gzip_static }, > + > + { ngx_string("brotli_static"), > + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF| > NGX_CONF_TAKE1, > + ngx_conf_set_enum_slot, > + NGX_HTTP_LOC_CONF_OFFSET, > + offsetof(ngx_http_gzip_static_conf_t, enable_brotli), > &ngx_http_gzip_static }, > > ngx_null_command > @@ -79,19 +89,14 @@ > }; > > > +static ngx_str_t encoding_gzip = ngx_string("gzip"); > +static ngx_str_t encoding_brotli = ngx_string("br"); > + > + > static ngx_int_t > ngx_http_gzip_static_handler(ngx_http_request_t *r) > { > - u_char *p; > - size_t root; > - ngx_str_t path; > ngx_int_t rc; > - ngx_uint_t level; > - ngx_log_t *log; > - ngx_buf_t *b; > - ngx_chain_t out; > - ngx_table_elt_t *h; > - ngx_open_file_info_t of; > ngx_http_core_loc_conf_t *clcf; > ngx_http_gzip_static_conf_t *gzcf; > > @@ -105,19 +110,56 @@ > > gzcf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_static_module); > > - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) { > + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_OFF > + && gzcf->enable_brotli == NGX_HTTP_GZIP_STATIC_OFF) { > return NGX_DECLINED; > } > > - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { > - rc = ngx_http_gzip_ok(r); > + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); > > - } else { > - /* always */ > - rc = NGX_OK; > + rc = NGX_DECLINED; > + if (gzcf->enable_gzip != NGX_HTTP_GZIP_STATIC_OFF) { > + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { > + rc = ngx_http_gzip_ok(r); > + } else { > + /* always */ > + rc = NGX_OK; > + } > + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_gzip, rc, > clcf, > + &encoding_gzip); > } > > - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); > + if (gzcf->enable_brotli != NGX_HTTP_GZIP_STATIC_OFF && rc == > NGX_DECLINED) { > + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { > + rc = ngx_http_gzip_ok(r); > + } else { > + /* always */ > + rc = NGX_OK; > + } > + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_brotli, rc, > clcf, > + &encoding_brotli); > + } > + > + return rc; > +} > + > + > +static ngx_int_t > +ngx_http_gzip_static_serve_file(ngx_http_request_t *r, ngx_uint_t enable, > + ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, ngx_str_t *encoding) > +{ > + u_char *p; > + size_t root; > + ngx_str_t path; > + ngx_int_t rc; > + ngx_uint_t level; > + ngx_log_t *log; > + ngx_buf_t *b; > + ngx_chain_t out; > + ngx_table_elt_t *h; > + ngx_open_file_info_t of; > + > + rc = ok; > > if (!clcf->gzip_vary && rc != NGX_OK) { > return NGX_DECLINED; > @@ -125,14 +167,14 @@ > > log = r->connection->log; > > - p = ngx_http_map_uri_to_path(r, &path, &root, sizeof(".gz") - 1); > + p = ngx_http_map_uri_to_path(r, &path, &root, 4 - 1); > if (p == NULL) { > return NGX_HTTP_INTERNAL_SERVER_ERROR; > } > > *p++ = '.'; > - *p++ = 'g'; > - *p++ = 'z'; > + *p++ = encoding->data[0]; > + *p++ = encoding->data[1]; > *p = '\0'; > > path.len = p - path.data; > @@ -188,7 +230,7 @@ > return NGX_DECLINED; > } > > - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { > + if (enable == NGX_HTTP_GZIP_STATIC_ON) { > r->gzip_vary = 1; > > if (rc != NGX_OK) { > @@ -243,7 +285,7 @@ > > h->hash = 1; > ngx_str_set(&h->key, "Content-Encoding"); > - ngx_str_set(&h->value, "gzip"); > + h->value = *encoding; > r->headers_out.content_encoding = h; > > /* we need to allocate all before the header would be sent */ > @@ -293,7 +335,8 @@ > return NULL; > } > > - conf->enable = NGX_CONF_UNSET_UINT; > + conf->enable_gzip = NGX_CONF_UNSET_UINT; > + conf->enable_brotli = NGX_CONF_UNSET_UINT; > > return conf; > } > @@ -305,7 +348,9 @@ > ngx_http_gzip_static_conf_t *prev = parent; > ngx_http_gzip_static_conf_t *conf = child; > > - ngx_conf_merge_uint_value(conf->enable, prev->enable, > + ngx_conf_merge_uint_value(conf->enable_gzip, prev->enable_gzip, > + NGX_HTTP_GZIP_STATIC_OFF); > + ngx_conf_merge_uint_value(conf->enable_brotli, prev->enable_brotli, > NGX_HTTP_GZIP_STATIC_OFF); > > return NGX_CONF_OK; > diff -r 1ad0999a7ded -r e1f5e06ade01 src/http/ngx_http_core_module.c > --- a/src/http/ngx_http_core_module.c Tue Feb 14 18:36:04 2017 +0300 > +++ b/src/http/ngx_http_core_module.c Fri Feb 24 11:35:24 2017 +0100 > @@ -74,8 +74,8 @@ > static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, > void *conf); > #if (NGX_HTTP_GZIP) > -static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae); > -static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last); > +static ngx_int_t ngx_http_accept_encoding(ngx_str_t *ae, char *e, size_t > n); > +static ngx_uint_t ngx_http_encoding_quantity(u_char *p, u_char *last); > static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, > void *conf); > #endif > @@ -2170,7 +2170,7 @@ > */ > > if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0 > - && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK) > + && ngx_http_accept_encoding(&ae->value, "gzip", 4) != NGX_OK) > { > return NGX_DECLINED; > } > @@ -2297,15 +2297,42 @@ > } > > > +ngx_int_t > +ngx_http_brotli_ok(ngx_http_request_t *r) > +{ > + ngx_table_elt_t *ae; > + > + if (r != r->main) { > + return NGX_DECLINED; > + } > + > + ae = r->headers_in.accept_encoding; > + if (ae == NULL) { > + return NGX_DECLINED; > + } > + > + if (ae->value.len < sizeof("br") - 1) { > + return NGX_DECLINED; > + } > + > + if (ngx_http_accept_encoding(&ae->value, "br", 2) != NGX_OK) > + { > + return NGX_DECLINED; > + } > + > + return NGX_OK; > +} > + > + > /* > - * gzip is enabled for the following quantities: > - * "gzip; q=0.001" ... "gzip; q=1.000" > - * gzip is disabled for the following quantities: > - * "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases > + * encoding is enabled for the following quantities: > + * "gzip; q=0.001" ... "gzip; q=1.000" > + * encoding is disabled for the following quantities: > + * "br; q=0" ... "br; q=0.000", and for any invalid cases > */ > > static ngx_int_t > -ngx_http_gzip_accept_encoding(ngx_str_t *ae) > +ngx_http_accept_encoding(ngx_str_t *ae, char *e, size_t n) > { > u_char *p, *start, *last; > > @@ -2313,7 +2340,7 @@ > last = start + ae->len; > > for ( ;; ) { > - p = ngx_strcasestrn(start, "gzip", 4 - 1); > + p = ngx_strcasestrn(start, e, n - 1); > if (p == NULL) { > return NGX_DECLINED; > } > @@ -2322,10 +2349,10 @@ > break; > } > > - start = p + 4; > - } > - > - p += 4; > + start = p + n; > + } > + > + p += n; > > while (p < last) { > switch (*p++) { > @@ -2364,7 +2391,7 @@ > return NGX_DECLINED; > } > > - if (ngx_http_gzip_quantity(p, last) == 0) { > + if (ngx_http_encoding_quantity(p, last) == 0) { > return NGX_DECLINED; > } > > @@ -2373,7 +2400,7 @@ > > > static ngx_uint_t > -ngx_http_gzip_quantity(u_char *p, u_char *last) > +ngx_http_encoding_quantity(u_char *p, u_char *last) > { > u_char c; > ngx_uint_t n, q; > diff -r 1ad0999a7ded -r e1f5e06ade01 src/http/ngx_http_core_module.h > --- a/src/http/ngx_http_core_module.h Tue Feb 14 18:36:04 2017 +0300 > +++ b/src/http/ngx_http_core_module.h Fri Feb 24 11:35:24 2017 +0100 > @@ -504,6 +504,7 @@ > ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r); > #if (NGX_HTTP_GZIP) > ngx_int_t ngx_http_gzip_ok(ngx_http_request_t *r); > +ngx_int_t ngx_http_brotli_ok(ngx_http_request_t *r); > #endif > > > > > > > On 24 February 2017 at 09:05, Ryan <[email protected]> wrote: > >> Do you have a brotli patch that applies cleanly with nginx-1.11.10. I'm >> getting many patch fails. >> >> On Fri, Feb 24, 2017 at 8:03 AM, Eugene Kluchnikov <[email protected]> >> wrote: >> >>> # HG changeset patch >>> # User Evgenii Kliuchnikov <[email protected]> >>> # Date 1487764873 -3600 >>> # Wed Feb 22 13:01:13 2017 +0100 >>> # Node ID c230f3874e060ccb14d7560233f2c70a910640a1 >>> # Parent 87cf6ddb41c216876d13cffa5e637a61b159362c >>> Add brotli static serving support. >>> >>> Both .gz and .br static content is served by >>> ngx_http_gzip_static_modile, but have separate configuration. >>> >>> diff -r 87cf6ddb41c2 -r c230f3874e06 contrib/vim/syntax/nginx.vim >>> --- a/contrib/vim/syntax/nginx.vim Fri Feb 17 17:01:27 2017 +0300 >>> +++ b/contrib/vim/syntax/nginx.vim Wed Feb 22 13:01:13 2017 +0100 >>> @@ -86,6 +86,7 @@ >>> syn keyword ngxDirective autoindex >>> syn keyword ngxDirective autoindex_exact_size >>> syn keyword ngxDirective autoindex_localtime >>> +syn keyword ngxDirective brotli_static >>> syn keyword ngxDirective charset >>> syn keyword ngxDirective charset_types >>> syn keyword ngxDirective chunked_transfer_encoding >>> diff -r 87cf6ddb41c2 -r c230f3874e06 src/http/modules/ngx_http_gzip >>> _static_module.c >>> --- a/src/http/modules/ngx_http_gzip_static_module.c Fri Feb 17 >>> 17:01:27 2017 +0300 >>> +++ b/src/http/modules/ngx_http_gzip_static_module.c Wed Feb 22 >>> 13:01:13 2017 +0100 >>> @@ -16,10 +16,14 @@ >>> >>> >>> typedef struct { >>> - ngx_uint_t enable; >>> + ngx_uint_t enable_gzip; >>> + ngx_uint_t enable_brotli; >>> } ngx_http_gzip_static_conf_t; >>> >>> >>> +static ngx_int_t ngx_http_gzip_static_serve_file(ngx_http_request_t *r, >>> + ngx_uint_t enable, ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, >>> + ngx_str_t *encoding); >>> static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r); >>> static void *ngx_http_gzip_static_create_conf(ngx_conf_t *cf); >>> static char *ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void >>> *parent, >>> @@ -41,7 +45,14 @@ >>> NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_ >>> CONF_TAKE1, >>> ngx_conf_set_enum_slot, >>> NGX_HTTP_LOC_CONF_OFFSET, >>> - offsetof(ngx_http_gzip_static_conf_t, enable), >>> + offsetof(ngx_http_gzip_static_conf_t, enable_gzip), >>> + &ngx_http_gzip_static }, >>> + >>> + { ngx_string("brotli_static"), >>> + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_ >>> CONF_TAKE1, >>> + ngx_conf_set_enum_slot, >>> + NGX_HTTP_LOC_CONF_OFFSET, >>> + offsetof(ngx_http_gzip_static_conf_t, enable_brotli), >>> &ngx_http_gzip_static }, >>> >>> ngx_null_command >>> @@ -79,19 +90,14 @@ >>> }; >>> >>> >>> +static ngx_str_t encoding_gzip = ngx_string("gzip"); >>> +static ngx_str_t encoding_brotli = ngx_string("br"); >>> + >>> + >>> static ngx_int_t >>> ngx_http_gzip_static_handler(ngx_http_request_t *r) >>> { >>> - u_char *p; >>> - size_t root; >>> - ngx_str_t path; >>> ngx_int_t rc; >>> - ngx_uint_t level; >>> - ngx_log_t *log; >>> - ngx_buf_t *b; >>> - ngx_chain_t out; >>> - ngx_table_elt_t *h; >>> - ngx_open_file_info_t of; >>> ngx_http_core_loc_conf_t *clcf; >>> ngx_http_gzip_static_conf_t *gzcf; >>> >>> @@ -105,19 +111,56 @@ >>> >>> gzcf = ngx_http_get_module_loc_conf(r, >>> ngx_http_gzip_static_module); >>> >>> - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) { >>> + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_OFF && >>> + gzcf->enable_brotli == NGX_HTTP_GZIP_STATIC_OFF) { >>> return NGX_DECLINED; >>> } >>> >>> - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { >>> - rc = ngx_http_gzip_ok(r); >>> + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); >>> >>> - } else { >>> - /* always */ >>> - rc = NGX_OK; >>> + rc = NGX_DECLINED; >>> + if (gzcf->enable_gzip != NGX_HTTP_GZIP_STATIC_OFF) { >>> + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { >>> + rc = ngx_http_gzip_ok(r); >>> + } else { >>> + /* always */ >>> + rc = NGX_OK; >>> + } >>> + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_gzip, rc, >>> clcf, >>> + &encoding_gzip); >>> } >>> >>> - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); >>> + if (gzcf->enable_brotli != NGX_HTTP_GZIP_STATIC_OFF && rc == >>> NGX_DECLINED) { >>> + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { >>> + rc = ngx_http_gzip_ok(r); >>> + } else { >>> + /* always */ >>> + rc = NGX_OK; >>> + } >>> + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_brotli, >>> rc, clcf, >>> + &encoding_brotli); >>> + } >>> + >>> + return rc; >>> +} >>> + >>> + >>> +static ngx_int_t >>> +ngx_http_gzip_static_serve_file(ngx_http_request_t *r, ngx_uint_t >>> enable, >>> + ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, ngx_str_t *encoding) >>> +{ >>> + u_char *p; >>> + size_t root; >>> + ngx_str_t path; >>> + ngx_int_t rc; >>> + ngx_uint_t level; >>> + ngx_log_t *log; >>> + ngx_buf_t *b; >>> + ngx_chain_t out; >>> + ngx_table_elt_t *h; >>> + ngx_open_file_info_t of; >>> + >>> + rc = ok; >>> >>> if (!clcf->gzip_vary && rc != NGX_OK) { >>> return NGX_DECLINED; >>> @@ -125,14 +168,14 @@ >>> >>> log = r->connection->log; >>> >>> - p = ngx_http_map_uri_to_path(r, &path, &root, sizeof(".gz") - 1); >>> + p = ngx_http_map_uri_to_path(r, &path, &root, 4 - 1); >>> if (p == NULL) { >>> return NGX_HTTP_INTERNAL_SERVER_ERROR; >>> } >>> >>> *p++ = '.'; >>> - *p++ = 'g'; >>> - *p++ = 'z'; >>> + *p++ = encoding->data[0]; >>> + *p++ = encoding->data[1]; >>> *p = '\0'; >>> >>> path.len = p - path.data; >>> @@ -188,7 +231,7 @@ >>> return NGX_DECLINED; >>> } >>> >>> - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { >>> + if (enable == NGX_HTTP_GZIP_STATIC_ON) { >>> r->gzip_vary = 1; >>> >>> if (rc != NGX_OK) { >>> @@ -243,7 +286,7 @@ >>> >>> h->hash = 1; >>> ngx_str_set(&h->key, "Content-Encoding"); >>> - ngx_str_set(&h->value, "gzip"); >>> + h->value = *encoding; >>> r->headers_out.content_encoding = h; >>> >>> /* we need to allocate all before the header would be sent */ >>> @@ -293,7 +336,8 @@ >>> return NULL; >>> } >>> >>> - conf->enable = NGX_CONF_UNSET_UINT; >>> + conf->enable_gzip = NGX_CONF_UNSET_UINT; >>> + conf->enable_brotli = NGX_CONF_UNSET_UINT; >>> >>> return conf; >>> } >>> @@ -305,7 +349,9 @@ >>> ngx_http_gzip_static_conf_t *prev = parent; >>> ngx_http_gzip_static_conf_t *conf = child; >>> >>> - ngx_conf_merge_uint_value(conf->enable, prev->enable, >>> + ngx_conf_merge_uint_value(conf->enable_gzip, prev->enable_gzip, >>> + NGX_HTTP_GZIP_STATIC_OFF); >>> + ngx_conf_merge_uint_value(conf->enable_brotli, prev->enable_brotli, >>> NGX_HTTP_GZIP_STATIC_OFF); >>> >>> return NGX_CONF_OK; >>> diff -r 87cf6ddb41c2 -r c230f3874e06 src/http/ngx_http_core_module.c >>> --- a/src/http/ngx_http_core_module.c Fri Feb 17 17:01:27 2017 +0300 >>> +++ b/src/http/ngx_http_core_module.c Wed Feb 22 13:01:13 2017 +0100 >>> @@ -74,8 +74,8 @@ >>> static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, >>> void *conf); >>> #if (NGX_HTTP_GZIP) >>> -static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae); >>> -static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last); >>> +static ngx_int_t ngx_http_accept_encoding(ngx_str_t *ae, char *e, >>> size_t n); >>> +static ngx_uint_t ngx_http_encoding_quantity(u_char *p, u_char *last); >>> static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, >>> void *conf); >>> #endif >>> @@ -2170,7 +2170,7 @@ >>> */ >>> >>> if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0 >>> - && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK) >>> + && ngx_http_accept_encoding(&ae->value, "gzip", 4) != NGX_OK) >>> { >>> return NGX_DECLINED; >>> } >>> @@ -2297,15 +2297,42 @@ >>> } >>> >>> >>> +ngx_int_t >>> +ngx_http_brotli_ok(ngx_http_request_t *r) >>> +{ >>> + ngx_table_elt_t *ae; >>> + >>> + if (r != r->main) { >>> + return NGX_DECLINED; >>> + } >>> + >>> + ae = r->headers_in.accept_encoding; >>> + if (ae == NULL) { >>> + return NGX_DECLINED; >>> + } >>> + >>> + if (ae->value.len < sizeof("br") - 1) { >>> + return NGX_DECLINED; >>> + } >>> + >>> + if (ngx_http_accept_encoding(&ae->value, "br", 2) != NGX_OK) >>> + { >>> + return NGX_DECLINED; >>> + } >>> + >>> + return NGX_OK; >>> +} >>> + >>> + >>> /* >>> - * gzip is enabled for the following quantities: >>> + * encoding is enabled for the following quantities: >>> * "gzip; q=0.001" ... "gzip; q=1.000" >>> - * gzip is disabled for the following quantities: >>> - * "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases >>> + * encoding is disabled for the following quantities: >>> + * "br; q=0" ... "br; q=0.000", and for any invalid cases >>> */ >>> >>> static ngx_int_t >>> -ngx_http_gzip_accept_encoding(ngx_str_t *ae) >>> +ngx_http_accept_encoding(ngx_str_t *ae, char *e, size_t n) >>> { >>> u_char *p, *start, *last; >>> >>> @@ -2313,7 +2340,7 @@ >>> last = start + ae->len; >>> >>> for ( ;; ) { >>> - p = ngx_strcasestrn(start, "gzip", 4 - 1); >>> + p = ngx_strcasestrn(start, e, n - 1); >>> if (p == NULL) { >>> return NGX_DECLINED; >>> } >>> @@ -2322,10 +2349,10 @@ >>> break; >>> } >>> >>> - start = p + 4; >>> - } >>> - >>> - p += 4; >>> + start = p + n; >>> + } >>> + >>> + p += n; >>> >>> while (p < last) { >>> switch (*p++) { >>> @@ -2364,7 +2391,7 @@ >>> return NGX_DECLINED; >>> } >>> >>> - if (ngx_http_gzip_quantity(p, last) == 0) { >>> + if (ngx_http_encoding_quantity(p, last) == 0) { >>> return NGX_DECLINED; >>> } >>> >>> @@ -2373,7 +2400,7 @@ >>> >>> >>> static ngx_uint_t >>> -ngx_http_gzip_quantity(u_char *p, u_char *last) >>> +ngx_http_encoding_quantity(u_char *p, u_char *last) >>> { >>> u_char c; >>> ngx_uint_t n, q; >>> diff -r 87cf6ddb41c2 -r c230f3874e06 src/http/ngx_http_core_module.h >>> --- a/src/http/ngx_http_core_module.h Fri Feb 17 17:01:27 2017 +0300 >>> +++ b/src/http/ngx_http_core_module.h Wed Feb 22 13:01:13 2017 +0100 >>> @@ -504,6 +504,7 @@ >>> ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r); >>> #if (NGX_HTTP_GZIP) >>> ngx_int_t ngx_http_gzip_ok(ngx_http_request_t *r); >>> +ngx_int_t ngx_http_brotli_ok(ngx_http_request_t *r); >>> #endif >>> >>> >>> >>> >>> >>> Fixed "Content-Encoding" value. >>> >>> On 23 February 2017 at 13:11, Eugene Kluchnikov <[email protected]> >>> wrote: >>> >>>> # HG changeset patch >>>> # User Evgenii Kliuchnikov <[email protected]> >>>> # Date 1487764873 -3600 >>>> # Wed Feb 22 13:01:13 2017 +0100 >>>> # Node ID 96939e63f30579f2f32e843d217bd46fa6086bb4 >>>> # Parent 87cf6ddb41c216876d13cffa5e637a61b159362c >>>> Add brotli static serving support. >>>> >>>> Both .gz and .br static content is served by >>>> ngx_http_gzip_static_modile, but have separate configuration. >>>> >>>> diff -r 87cf6ddb41c2 -r 96939e63f305 contrib/vim/syntax/nginx.vim >>>> --- a/contrib/vim/syntax/nginx.vim Fri Feb 17 17:01:27 2017 +0300 >>>> +++ b/contrib/vim/syntax/nginx.vim Wed Feb 22 13:01:13 2017 +0100 >>>> @@ -86,6 +86,7 @@ >>>> syn keyword ngxDirective autoindex >>>> syn keyword ngxDirective autoindex_exact_size >>>> syn keyword ngxDirective autoindex_localtime >>>> +syn keyword ngxDirective brotli_static >>>> syn keyword ngxDirective charset >>>> syn keyword ngxDirective charset_types >>>> syn keyword ngxDirective chunked_transfer_encoding >>>> diff -r 87cf6ddb41c2 -r 96939e63f305 src/http/modules/ngx_http_gzip >>>> _static_module.c >>>> --- a/src/http/modules/ngx_http_gzip_static_module.c Fri Feb 17 >>>> 17:01:27 2017 +0300 >>>> +++ b/src/http/modules/ngx_http_gzip_static_module.c Wed Feb 22 >>>> 13:01:13 2017 +0100 >>>> @@ -16,10 +16,14 @@ >>>> >>>> >>>> typedef struct { >>>> - ngx_uint_t enable; >>>> + ngx_uint_t enable_gzip; >>>> + ngx_uint_t enable_brotli; >>>> } ngx_http_gzip_static_conf_t; >>>> >>>> >>>> +static ngx_int_t ngx_http_gzip_static_serve_file(ngx_http_request_t >>>> *r, >>>> + ngx_uint_t enable, ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, >>>> + ngx_str_t *encoding); >>>> static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r); >>>> static void *ngx_http_gzip_static_create_conf(ngx_conf_t *cf); >>>> static char *ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void >>>> *parent, >>>> @@ -41,7 +45,14 @@ >>>> NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_ >>>> CONF_TAKE1, >>>> ngx_conf_set_enum_slot, >>>> NGX_HTTP_LOC_CONF_OFFSET, >>>> - offsetof(ngx_http_gzip_static_conf_t, enable), >>>> + offsetof(ngx_http_gzip_static_conf_t, enable_gzip), >>>> + &ngx_http_gzip_static }, >>>> + >>>> + { ngx_string("brotli_static"), >>>> + NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_ >>>> CONF_TAKE1, >>>> + ngx_conf_set_enum_slot, >>>> + NGX_HTTP_LOC_CONF_OFFSET, >>>> + offsetof(ngx_http_gzip_static_conf_t, enable_brotli), >>>> &ngx_http_gzip_static }, >>>> >>>> ngx_null_command >>>> @@ -79,19 +90,13 @@ >>>> }; >>>> >>>> >>>> +static ngx_str_t encoding_gzip = ngx_string("gzip"); >>>> +static ngx_str_t encoding_brotli = ngx_string("brotli"); >>>> + >>>> static ngx_int_t >>>> ngx_http_gzip_static_handler(ngx_http_request_t *r) >>>> { >>>> - u_char *p; >>>> - size_t root; >>>> - ngx_str_t path; >>>> ngx_int_t rc; >>>> - ngx_uint_t level; >>>> - ngx_log_t *log; >>>> - ngx_buf_t *b; >>>> - ngx_chain_t out; >>>> - ngx_table_elt_t *h; >>>> - ngx_open_file_info_t of; >>>> ngx_http_core_loc_conf_t *clcf; >>>> ngx_http_gzip_static_conf_t *gzcf; >>>> >>>> @@ -105,19 +110,56 @@ >>>> >>>> gzcf = ngx_http_get_module_loc_conf(r, >>>> ngx_http_gzip_static_module); >>>> >>>> - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) { >>>> + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_OFF && >>>> + gzcf->enable_brotli == NGX_HTTP_GZIP_STATIC_OFF) { >>>> return NGX_DECLINED; >>>> } >>>> >>>> - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { >>>> - rc = ngx_http_gzip_ok(r); >>>> + clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); >>>> >>>> - } else { >>>> - /* always */ >>>> - rc = NGX_OK; >>>> + rc = NGX_DECLINED; >>>> + if (gzcf->enable_gzip != NGX_HTTP_GZIP_STATIC_OFF) { >>>> + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { >>>> + rc = ngx_http_gzip_ok(r); >>>> + } else { >>>> + /* always */ >>>> + rc = NGX_OK; >>>> + } >>>> + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_gzip, >>>> rc, clcf, >>>> + &encoding_gzip); >>>> } >>>> >>>> - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); >>>> + if (gzcf->enable_brotli != NGX_HTTP_GZIP_STATIC_OFF && rc == >>>> NGX_DECLINED) { >>>> + if (gzcf->enable_gzip == NGX_HTTP_GZIP_STATIC_ON) { >>>> + rc = ngx_http_gzip_ok(r); >>>> + } else { >>>> + /* always */ >>>> + rc = NGX_OK; >>>> + } >>>> + rc = ngx_http_gzip_static_serve_file(r, gzcf->enable_brotli, >>>> rc, clcf, >>>> + &encoding_brotli); >>>> + } >>>> + >>>> + return rc; >>>> +} >>>> + >>>> + >>>> +static ngx_int_t >>>> +ngx_http_gzip_static_serve_file(ngx_http_request_t *r, ngx_uint_t >>>> enable, >>>> + ngx_uint_t ok, ngx_http_core_loc_conf_t *clcf, ngx_str_t *encoding) >>>> +{ >>>> + u_char *p; >>>> + size_t root; >>>> + ngx_str_t path; >>>> + ngx_int_t rc; >>>> + ngx_uint_t level; >>>> + ngx_log_t *log; >>>> + ngx_buf_t *b; >>>> + ngx_chain_t out; >>>> + ngx_table_elt_t *h; >>>> + ngx_open_file_info_t of; >>>> + >>>> + rc = ok; >>>> >>>> if (!clcf->gzip_vary && rc != NGX_OK) { >>>> return NGX_DECLINED; >>>> @@ -125,14 +167,14 @@ >>>> >>>> log = r->connection->log; >>>> >>>> - p = ngx_http_map_uri_to_path(r, &path, &root, sizeof(".gz") - 1); >>>> + p = ngx_http_map_uri_to_path(r, &path, &root, 4 - 1); >>>> if (p == NULL) { >>>> return NGX_HTTP_INTERNAL_SERVER_ERROR; >>>> } >>>> >>>> *p++ = '.'; >>>> - *p++ = 'g'; >>>> - *p++ = 'z'; >>>> + *p++ = encoding->data[0]; >>>> + *p++ = encoding->data[1]; >>>> *p = '\0'; >>>> >>>> path.len = p - path.data; >>>> @@ -188,7 +230,7 @@ >>>> return NGX_DECLINED; >>>> } >>>> >>>> - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { >>>> + if (enable == NGX_HTTP_GZIP_STATIC_ON) { >>>> r->gzip_vary = 1; >>>> >>>> if (rc != NGX_OK) { >>>> @@ -243,7 +285,7 @@ >>>> >>>> h->hash = 1; >>>> ngx_str_set(&h->key, "Content-Encoding"); >>>> - ngx_str_set(&h->value, "gzip"); >>>> + h->value = *encoding; >>>> r->headers_out.content_encoding = h; >>>> >>>> /* we need to allocate all before the header would be sent */ >>>> @@ -293,7 +335,8 @@ >>>> return NULL; >>>> } >>>> >>>> - conf->enable = NGX_CONF_UNSET_UINT; >>>> + conf->enable_gzip = NGX_CONF_UNSET_UINT; >>>> + conf->enable_brotli = NGX_CONF_UNSET_UINT; >>>> >>>> return conf; >>>> } >>>> @@ -305,7 +348,9 @@ >>>> ngx_http_gzip_static_conf_t *prev = parent; >>>> ngx_http_gzip_static_conf_t *conf = child; >>>> >>>> - ngx_conf_merge_uint_value(conf->enable, prev->enable, >>>> + ngx_conf_merge_uint_value(conf->enable_gzip, prev->enable_gzip, >>>> + NGX_HTTP_GZIP_STATIC_OFF); >>>> + ngx_conf_merge_uint_value(conf->enable_brotli, >>>> prev->enable_brotli, >>>> NGX_HTTP_GZIP_STATIC_OFF); >>>> >>>> return NGX_CONF_OK; >>>> diff -r 87cf6ddb41c2 -r 96939e63f305 src/http/ngx_http_core_module.c >>>> --- a/src/http/ngx_http_core_module.c Fri Feb 17 17:01:27 2017 +0300 >>>> +++ b/src/http/ngx_http_core_module.c Wed Feb 22 13:01:13 2017 +0100 >>>> @@ -74,8 +74,8 @@ >>>> static char *ngx_http_core_resolver(ngx_conf_t *cf, ngx_command_t >>>> *cmd, >>>> void *conf); >>>> #if (NGX_HTTP_GZIP) >>>> -static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae); >>>> -static ngx_uint_t ngx_http_gzip_quantity(u_char *p, u_char *last); >>>> +static ngx_int_t ngx_http_accept_encoding(ngx_str_t *ae, char *e, >>>> size_t n); >>>> +static ngx_uint_t ngx_http_encoding_quantity(u_char *p, u_char *last); >>>> static char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, >>>> void *conf); >>>> #endif >>>> @@ -2170,7 +2170,7 @@ >>>> */ >>>> >>>> if (ngx_memcmp(ae->value.data, "gzip,", 5) != 0 >>>> - && ngx_http_gzip_accept_encoding(&ae->value) != NGX_OK) >>>> + && ngx_http_accept_encoding(&ae->value, "gzip", 4) != NGX_OK) >>>> { >>>> return NGX_DECLINED; >>>> } >>>> @@ -2297,15 +2297,42 @@ >>>> } >>>> >>>> >>>> +ngx_int_t >>>> +ngx_http_brotli_ok(ngx_http_request_t *r) >>>> +{ >>>> + ngx_table_elt_t *ae; >>>> + >>>> + if (r != r->main) { >>>> + return NGX_DECLINED; >>>> + } >>>> + >>>> + ae = r->headers_in.accept_encoding; >>>> + if (ae == NULL) { >>>> + return NGX_DECLINED; >>>> + } >>>> + >>>> + if (ae->value.len < sizeof("br") - 1) { >>>> + return NGX_DECLINED; >>>> + } >>>> + >>>> + if (ngx_http_accept_encoding(&ae->value, "br", 2) != NGX_OK) >>>> + { >>>> + return NGX_DECLINED; >>>> + } >>>> + >>>> + return NGX_OK; >>>> +} >>>> + >>>> + >>>> /* >>>> - * gzip is enabled for the following quantities: >>>> + * encoding is enabled for the following quantities: >>>> * "gzip; q=0.001" ... "gzip; q=1.000" >>>> - * gzip is disabled for the following quantities: >>>> - * "gzip; q=0" ... "gzip; q=0.000", and for any invalid cases >>>> + * encoding is disabled for the following quantities: >>>> + * "br; q=0" ... "br; q=0.000", and for any invalid cases >>>> */ >>>> >>>> static ngx_int_t >>>> -ngx_http_gzip_accept_encoding(ngx_str_t *ae) >>>> +ngx_http_accept_encoding(ngx_str_t *ae, char *e, size_t n) >>>> { >>>> u_char *p, *start, *last; >>>> >>>> @@ -2313,7 +2340,7 @@ >>>> last = start + ae->len; >>>> >>>> for ( ;; ) { >>>> - p = ngx_strcasestrn(start, "gzip", 4 - 1); >>>> + p = ngx_strcasestrn(start, e, n - 1); >>>> if (p == NULL) { >>>> return NGX_DECLINED; >>>> } >>>> @@ -2322,10 +2349,10 @@ >>>> break; >>>> } >>>> >>>> - start = p + 4; >>>> - } >>>> - >>>> - p += 4; >>>> + start = p + n; >>>> + } >>>> + >>>> + p += n; >>>> >>>> while (p < last) { >>>> switch (*p++) { >>>> @@ -2364,7 +2391,7 @@ >>>> return NGX_DECLINED; >>>> } >>>> >>>> - if (ngx_http_gzip_quantity(p, last) == 0) { >>>> + if (ngx_http_encoding_quantity(p, last) == 0) { >>>> return NGX_DECLINED; >>>> } >>>> >>>> @@ -2373,7 +2400,7 @@ >>>> >>>> >>>> static ngx_uint_t >>>> -ngx_http_gzip_quantity(u_char *p, u_char *last) >>>> +ngx_http_encoding_quantity(u_char *p, u_char *last) >>>> { >>>> u_char c; >>>> ngx_uint_t n, q; >>>> diff -r 87cf6ddb41c2 -r 96939e63f305 src/http/ngx_http_core_module.h >>>> --- a/src/http/ngx_http_core_module.h Fri Feb 17 17:01:27 2017 +0300 >>>> +++ b/src/http/ngx_http_core_module.h Wed Feb 22 13:01:13 2017 +0100 >>>> @@ -504,6 +504,7 @@ >>>> ngx_int_t ngx_http_auth_basic_user(ngx_http_request_t *r); >>>> #if (NGX_HTTP_GZIP) >>>> ngx_int_t ngx_http_gzip_ok(ngx_http_request_t *r); >>>> +ngx_int_t ngx_http_brotli_ok(ngx_http_request_t *r); >>>> #endif >>>> >>>> >>>> >>>> >>>> >>>> >>>> Take 2 - modify ngx_http_gzip_static_modile to serve both .gz and .br. >>>> >>>> >>>> On 22 February 2017 at 16:10, Eugene Kluchnikov <[email protected]> >>>> wrote: >>>> >>>>> Yup. Going to try to create a "combined" module soon =) >>>>> >>>>> On 22 February 2017 at 15:40, Valentin V. Bartenev <[email protected]> >>>>> wrote: >>>>>> >>>>>> At the first glance, the differences are really small and >>>>>> such functionality can be combined in one module. >>>>>> >>>>> >>> >>> >>> -- >>> С наилучшими пожеланиями, Евгений Ключников >>> WBR, Eugene Kluchnikov >>> >>> _______________________________________________ >>> nginx-devel mailing list >>> [email protected] >>> http://mailman.nginx.org/mailman/listinfo/nginx-devel >>> >> >> > > > -- > С наилучшими пожеланиями, Евгений Ключников > WBR, Eugene Kluchnikov > -- С наилучшими пожеланиями, Евгений Ключников WBR, Eugene Kluchnikov
_______________________________________________ nginx-devel mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-devel
