
cherokee at cherokee-project
Sep 13, 2011, 8:19 AM
Views: 100
Permalink
|
|
[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 .
|