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
_______________________________________________ nginx-devel mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-devel
