aboutsummaryrefslogtreecommitdiff
path: root/src/http/ngx_http_core_module.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2011-08-04 14:50:59 +0000
committerIgor Sysoev <igor@sysoev.ru>2011-08-04 14:50:59 +0000
commit48d17bca947540c31c077051ab6d7073fd25c986 (patch)
tree8cd0b771e1ac1ad18e4c8e2beb167d9062ba484c /src/http/ngx_http_core_module.c
parentdfd81a23b2771fa8a9be37a2a911562826005124 (diff)
downloadnginx-48d17bca947540c31c077051ab6d7073fd25c986.tar.gz
nginx-48d17bca947540c31c077051ab6d7073fd25c986.zip
refactor gzip quantity introduced in r3981: it ignored "q=1.000"
Diffstat (limited to 'src/http/ngx_http_core_module.c')
-rw-r--r--src/http/ngx_http_core_module.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index 60aff8c3d..00692454c 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -71,6 +71,7 @@ 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 char *ngx_http_gzip_disable(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
#endif
@@ -2189,7 +2190,7 @@ ok:
/*
* 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 @@ ok:
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 @@ equal:
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') {
+ if (c >= '0' && c <= '9') {
+ q += c - '0';
n++;
- q++;
continue;
}
- if (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