# HG changeset patch # User Igor Sysoev # Date 1312469459 0 # Node ID f77ed914eb1da14a8fb5eaf6fbdd89ef43e9ebee # Parent a1dd9dc754ab7ee4411565a4b11bc1845cacf8fb refactor gzip quantity introduced in r3981: it ignored "q=1.000" diff -r a1dd9dc754ab -r f77ed914eb1d src/http/ngx_http_core_module.c --- a/src/http/ngx_http_core_module.c Thu Aug 04 11:12:30 2011 +0000 +++ b/src/http/ngx_http_core_module.c Thu Aug 04 14:50:59 2011 +0000 @@ -71,6 +71,7 @@ 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 char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); #endif @@ -2189,7 +2190,7 @@ /* * gzip is enabled for the following quantities: - * "gzip; q=0.001" ... "gzip; q=0.999", "gzip; q=1" + * "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 */ @@ -2197,8 +2198,7 @@ static ngx_int_t ngx_http_gzip_accept_encoding(ngx_str_t *ae) { - u_char c, *p, *start, *last; - ngx_uint_t n, q; + u_char *p, *start, *last; start = ae->data; last = start + ae->len; @@ -2255,56 +2255,65 @@ return NGX_DECLINED; } - c = *p++; - - if (c == '1') { - if (p == last || *p == ',' || *p == ' ') { - return NGX_OK; - } + if (ngx_http_gzip_quantity(p, last) == 0) { return NGX_DECLINED; } - if (c != '0') { - return NGX_DECLINED; + return NGX_OK; +} + + +ngx_uint_t +ngx_http_gzip_quantity(u_char *p, u_char *last) +{ + u_char c; + ngx_uint_t n, q; + + c = *p++; + + if (c != '0' && c != '1') { + return 0; } + q = (c - '0') * 100; + if (p == last) { - return NGX_DECLINED; + return q; } - if (*p++ != '.') { - return NGX_DECLINED; + c = *p++; + + if (c == ',' || c == ' ') { + return q; + } + + if (c != '.') { + return 0; } n = 0; - q = 0; while (p < last) { c = *p++; - if (c == ',') { + if (c == ',' || c == ' ') { break; } - if (c >= '1' && c <= '9') { - n++; - q++; - continue; - } - - if (c == '0') { + if (c >= '0' && c <= '9') { + q += c - '0'; n++; continue; } - return NGX_DECLINED; + return 0; } - if (n < 4 && q != 0) { - return NGX_OK; + if (q > 100 || n == 0 || n > 3) { + return 0; } - return NGX_DECLINED; + return q; } #endif