Mailing List Archive

[6843] cherokee/trunk: By default, do not use the GZip encoder with Internet Explorer clients
Revision: 6843
http://svn.cherokee-project.com/changeset/6843
Author: alo
Date: 2011-09-13 17:19:21 +0200 (Tue, 13 Sep 2011)
Log Message:
-----------
By default, do not use the GZip encoder with Internet Explorer clients
older than IE6 (MSIE [1-6]). #legacy

Modified Paths:
--------------
cherokee/trunk/cherokee/connection.c
cherokee/trunk/cherokee/encoder.c
cherokee/trunk/cherokee/encoder.h
cherokee/trunk/cherokee/encoder_deflate.c
cherokee/trunk/cherokee/encoder_deflate.h
cherokee/trunk/cherokee/encoder_gzip.c
cherokee/trunk/cherokee/encoder_gzip.h
cherokee/trunk/qa/Makefile.am

Added Paths:
-----------
cherokee/trunk/qa/288-GZip-IE16.py

Modified: cherokee/trunk/cherokee/connection.c
===================================================================
--- cherokee/trunk/cherokee/connection.c 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/cherokee/connection.c 2011-09-13 15:19:21 UTC (rev 6843)
@@ -1368,12 +1368,22 @@
/* Instance and initialize the encoder
*/
ret = conn->encoder_new_func ((void **)&conn->encoder, conn->encoder_props);
- if (unlikely (ret != ret_ok))
+ if (unlikely (ret != ret_ok)) {
+ ret = ret_error;
goto error;
+ }

ret = cherokee_encoder_init (conn->encoder, conn);
- if (unlikely (ret != ret_ok))
+ switch (ret) {
+ case ret_ok:
+ break;
+ case ret_deny:
+ /* Refuses to work. Eg: GZip for IE */
goto error;
+ default:
+ ret = ret_error;
+ goto error;
+ }

/* Update Front-Line cache
*/
@@ -1393,7 +1403,7 @@
cherokee_encoder_free (conn->encoder);
conn->encoder = NULL;
}
- return ret_error;
+ return ret;
}



Modified: cherokee/trunk/cherokee/encoder.c
===================================================================
--- cherokee/trunk/cherokee/encoder.c 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/cherokee/encoder.c 2011-09-13 15:19:21 UTC (rev 6843)
@@ -141,7 +141,7 @@
if (init_func == NULL)
return ret_error;

- return init_func (enc);
+ return init_func (enc, conn);
}



Modified: cherokee/trunk/cherokee/encoder.h
===================================================================
--- cherokee/trunk/cherokee/encoder.h 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/cherokee/encoder.h 2011-09-13 15:19:21 UTC (rev 6843)
@@ -48,7 +48,7 @@
typedef ret_t (* encoder_func_new_t) (void **encoder, void *props);
typedef ret_t (* encoder_func_free_t) (void *encoder);
typedef ret_t (* encoder_func_add_headers_t) (void *encoder, cherokee_buffer_t *buf);
-typedef ret_t (* encoder_func_init_t) (void *encoder);
+typedef ret_t (* encoder_func_init_t) (void *encoder, void *conn);
typedef ret_t (* encoder_func_encode_t) (void *encoder, cherokee_buffer_t *in, cherokee_buffer_t *out);
typedef ret_t (* encoder_func_flush_t) (void *encoder, cherokee_buffer_t *in, cherokee_buffer_t *out);
typedef ret_t (* encoder_func_configure_t) (cherokee_config_node_t *, cherokee_server_t *, cherokee_module_props_t **);

Modified: cherokee/trunk/cherokee/encoder_deflate.c
===================================================================
--- cherokee/trunk/cherokee/encoder_deflate.c 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/cherokee/encoder_deflate.c 2011-09-13 15:19:21 UTC (rev 6843)
@@ -160,11 +160,14 @@


ret_t
-cherokee_encoder_deflate_init (cherokee_encoder_deflate_t *encoder)
+cherokee_encoder_deflate_init (cherokee_encoder_deflate_t *encoder,
+ cherokee_connection_t *conn)
{
int err;
z_stream *z = &encoder->stream;

+ UNUSED (conn);
+
/* Set the workspace
*/
z->workspace = encoder->workspace;

Modified: cherokee/trunk/cherokee/encoder_deflate.h
===================================================================
--- cherokee/trunk/cherokee/encoder_deflate.h 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/cherokee/encoder_deflate.h 2011-09-13 15:19:21 UTC (rev 6843)
@@ -30,6 +30,7 @@
#include "zlib/zlib.h"
#include "module.h"
#include "encoder.h"
+#include "connection.h"
#include "plugin_loader.h"

/* Data types
@@ -63,7 +64,7 @@
ret_t cherokee_encoder_deflate_free (cherokee_encoder_deflate_t *encoder);

ret_t cherokee_encoder_deflate_add_headers (cherokee_encoder_deflate_t *encoder, cherokee_buffer_t *buf);
-ret_t cherokee_encoder_deflate_init (cherokee_encoder_deflate_t *encoder);
+ret_t cherokee_encoder_deflate_init (cherokee_encoder_deflate_t *encoder, cherokee_connection_t *conn);
ret_t cherokee_encoder_deflate_encode (cherokee_encoder_deflate_t *encoder, cherokee_buffer_t *in, cherokee_buffer_t *out);
ret_t cherokee_encoder_deflate_flush (cherokee_encoder_deflate_t *encoder, cherokee_buffer_t *in, cherokee_buffer_t *out);


Modified: cherokee/trunk/cherokee/encoder_gzip.c
===================================================================
--- cherokee/trunk/cherokee/encoder_gzip.c 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/cherokee/encoder_gzip.c 2011-09-13 15:19:21 UTC (rev 6843)
@@ -27,9 +27,13 @@
#include "crc32.h"
#include "encoder_gzip.h"
#include "plugin_loader.h"
+#include "connection-protected.h"
+#include "header.h"
#include "util.h"

+#define ENTRIES "encoder,gzip"

+
/* Plug-in initialization
*/
PLUGIN_INFO_ENCODER_EASIEST_INIT (gzip);
@@ -92,6 +96,8 @@
MODULE_PROPS_FREE(props_free));

n->compression_level = Z_DEFAULT_COMPRESSION;
+ n->disable_old_IE = true;
+
*_props = MODULE_PROPS(n);
}

@@ -105,6 +111,12 @@
if (unlikely (ret != ret_ok)) {
return ret_error;
}
+
+ } else if (equal_buf_str (&subconf->key, "disable_old_IE")) {
+ ret = cherokee_atob (subconf->val.buf, &props->disable_old_IE);
+ if (unlikely (ret != ret_ok)) {
+ return ret_error;
+ }
}
}

@@ -197,13 +209,58 @@
return "unknown";
}

+static cherokee_boolean_t
+is_user_agent_IE_16 (cherokee_connection_t *conn)
+{
+ ret_t ret;
+ char tmp;
+ char *m;
+ char *ref = NULL;
+ cuint_t ref_len = 0;

+ ret = cherokee_header_get_known (&conn->header, header_user_agent, &ref, &ref_len);
+ if ((ret != ret_ok) || (ref == NULL) || (ref_len <= 7))
+ return false;
+
+ /* Set EOL boundary */
+ tmp = ref[ref_len];
+ ref[ref_len] = '\0';
+
+ /* MSIE [1-6] */
+ m = strcasestr (ref, "MSIE ");
+ if (m == NULL)
+ goto not_found;
+
+ if ((m[5] >= '1') && (m[5] <= '6'))
+ goto found;
+
+ /* Clean up */
+not_found:
+ ref[ref_len] = tmp;
+ return false;
+
+found:
+ ref[ref_len] = tmp;
+ return true;
+}
+
+
ret_t
-cherokee_encoder_gzip_init (cherokee_encoder_gzip_t *encoder)
+cherokee_encoder_gzip_init (cherokee_encoder_gzip_t *encoder,
+ cherokee_connection_t *conn)
{
int err;
- z_stream *z = &encoder->stream;
+ z_stream *z = &encoder->stream;

+ /* Disable GZip for IE 1-6 clients
+ */
+ if (likely (ENC_GZIP_PROP(encoder)->disable_old_IE)) {
+ if (is_user_agent_IE_16 (conn)) {
+ TRACE (ENTRIES, "Disabling encoder: %s\n", "MSIE [1-6] detected\n");
+ return ret_deny;
+ }
+ }
+
/* Set the workspace
*/
z->workspace = encoder->workspace;

Modified: cherokee/trunk/cherokee/encoder_gzip.h
===================================================================
--- cherokee/trunk/cherokee/encoder_gzip.h 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/cherokee/encoder_gzip.h 2011-09-13 15:19:21 UTC (rev 6843)
@@ -30,6 +30,7 @@
#include "zlib/zlib.h"
#include "module.h"
#include "encoder.h"
+#include "connection.h"
#include "plugin_loader.h"

/* Data types
@@ -37,6 +38,7 @@
typedef struct {
cherokee_encoder_props_t base;
int compression_level;
+ cherokee_boolean_t disable_old_IE;
} cherokee_encoder_gzip_props_t;


@@ -65,7 +67,7 @@
ret_t cherokee_encoder_gzip_free (cherokee_encoder_gzip_t *encoder);

ret_t cherokee_encoder_gzip_add_headers (cherokee_encoder_gzip_t *encoder, cherokee_buffer_t *buf);
-ret_t cherokee_encoder_gzip_init (cherokee_encoder_gzip_t *encoder);
+ret_t cherokee_encoder_gzip_init (cherokee_encoder_gzip_t *encoder, cherokee_connection_t *conn);
ret_t cherokee_encoder_gzip_encode (cherokee_encoder_gzip_t *encoder, cherokee_buffer_t *in, cherokee_buffer_t *out);
ret_t cherokee_encoder_gzip_flush (cherokee_encoder_gzip_t *encoder, cherokee_buffer_t *in, cherokee_buffer_t *out);


Added: cherokee/trunk/qa/288-GZip-IE16.py
===================================================================
--- cherokee/trunk/qa/288-GZip-IE16.py (rev 0)
+++ cherokee/trunk/qa/288-GZip-IE16.py 2011-09-13 15:19:21 UTC (rev 6843)
@@ -0,0 +1,34 @@
+from base import *
+from util import *
+
+from cStringIO import StringIO
+from gzip import GzipFile
+
+WEB_DIR = "gzip_EI16_1"
+MAGIC = "Random text follows: " + str_random (10 * 1024)
+AGENT = "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Win 9x 4.90)"
+
+CONF = """
+vserver!1!rule!2880!match = directory
+vserver!1!rule!2880!match!directory = /%(WEB_DIR)s
+vserver!1!rule!2880!handler = file
+vserver!1!rule!2880!encoder!gzip = 1
+""" %(globals())
+
+
+class Test (TestBase):
+ def __init__ (self):
+ TestBase.__init__ (self, __file__)
+ self.name = "GZip from IE [1-6]"
+
+ self.request = "GET /%(WEB_DIR)s/file.txt HTTP/1.0\r\n" %(globals()) +\
+ "User-Agent: %(AGENT)s\r\n" %(globals()) + \
+ "Accept-Encoding: gzip\r\n"
+ self.conf = CONF
+ self.expected_error = 200
+ self.expected_content = MAGIC
+
+ def Prepare (self, www):
+ d = self.Mkdir (www, WEB_DIR)
+ self.WriteFile (d, "file.txt", 0444, MAGIC)
+

Modified: cherokee/trunk/qa/Makefile.am
===================================================================
--- cherokee/trunk/qa/Makefile.am 2011-09-11 12:17:40 UTC (rev 6842)
+++ cherokee/trunk/qa/Makefile.am 2011-09-13 15:19:21 UTC (rev 6843)
@@ -308,7 +308,8 @@
284-SSI-include-recursive.py \
285-Flcache-overwrite.py \
286-CGI-Permissions.py \
-287-rule-inheritance.py
+287-rule-inheritance.py \
+288-GZip-IE16.py

test:
python -m compileall .