From 1173ac17eee9e8e1f94534f20ee9956680161c8e Mon Sep 17 00:00:00 2001 From: DennisOSRM Date: Fri, 20 Apr 2012 17:06:09 +0200 Subject: [PATCH] Fixed serious gzip compression mishap, removed linear complexity at string length, fixed initialization of zlib stream object --- Server/Connection.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Server/Connection.h b/Server/Connection.h index 344ff748a..cb6f414c2 100644 --- a/Server/Connection.h +++ b/Server/Connection.h @@ -79,7 +79,7 @@ private: compressionHeader.name = "Content-Encoding"; compressionHeader.value = "deflate"; reply.headers.insert(reply.headers.begin(), compressionHeader); //push_back(compressionHeader); - compressCharArray(reply.content.c_str(), strlen(reply.content.c_str()), compressed, compressionType); + compressCharArray(reply.content.c_str(), reply.content.length(), compressed, compressionType); reply.setSize(compressed.size()); outputBuffer = reply.HeaderstoBuffers(); outputBuffer.push_back(boost::asio::buffer(compressed)); @@ -89,7 +89,7 @@ private: compressionHeader.name = "Content-Encoding"; compressionHeader.value = "gzip"; reply.headers.insert(reply.headers.begin(), compressionHeader); - compressCharArray(reply.content.c_str(), strlen(reply.content.c_str()), compressed, compressionType); + compressCharArray(reply.content.c_str(), reply.content.length(), compressed, compressionType); reply.setSize(compressed.size()); outputBuffer = reply.HeaderstoBuffers(); outputBuffer.push_back(boost::asio::buffer(compressed)); @@ -126,8 +126,10 @@ private: unsigned char temp_buffer[BUFSIZE]; z_stream strm; - strm.zalloc = 0; - strm.zfree = 0; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.total_out = 0; strm.next_in = (unsigned char *)(in_data); strm.avail_in = in_data_size; strm.next_out = temp_buffer; @@ -143,11 +145,8 @@ private: * Big thanks to deusty who explains how to have gzip compression turned on by the right call to deflateInit2(): * http://deusty.blogspot.com/2007/07/gzip-compressiondecompression.html */ - deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY); + deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 9, Z_DEFAULT_STRATEGY); break; - case noCompression: - std::cerr << "[error] contradicting compression request" << std::endl; - return; } int deflate_res = Z_OK; @@ -159,7 +158,7 @@ private: } deflate_res = deflate(&strm, Z_FINISH); - } while (strm.avail_out == 0); + } while (deflate_res == Z_OK); assert(deflate_res == Z_STREAM_END); buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUFSIZE - strm.avail_out);