Bug in supporting Quality zero (negate) parameter in Accept-Encoding
Igor Sysoev
igor at sysoev.ru
Thu Aug 4 15:05:24 UTC 2011
On Wed, Aug 03, 2011 at 02:17:15PM -0400, rburkat wrote:
> Hi Igor, thanks for the quick patch. This patch is different than the
> nginx-1.1.0 code. I assume the 1.1.0 code supersedes the patch as it
> was posted later. If not, disregard.
>
> The nginx-1.1.0 code has a bug in it. ( from a glance the patch would
> have been ok )
The attached patch for 1.1.0 should fix the bug.
It's already commited.
--
Igor Sysoev
-------------- next part --------------
Index: src/http/ngx_http_core_module.c
===================================================================
--- src/http/ngx_http_core_module.c (revision 3993)
+++ src/http/ngx_http_core_module.c (revision 3994)
@@ -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') {
+ 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
More information about the nginx
mailing list