Fixed serious gzip compression mishap, removed linear complexity at

string length, fixed initialization of zlib stream object
This commit is contained in:
DennisOSRM 2012-04-20 17:06:09 +02:00
parent fed4a83a8f
commit 1173ac17ee

View File

@ -79,7 +79,7 @@ private:
compressionHeader.name = "Content-Encoding"; compressionHeader.name = "Content-Encoding";
compressionHeader.value = "deflate"; compressionHeader.value = "deflate";
reply.headers.insert(reply.headers.begin(), compressionHeader); //push_back(compressionHeader); 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()); reply.setSize(compressed.size());
outputBuffer = reply.HeaderstoBuffers(); outputBuffer = reply.HeaderstoBuffers();
outputBuffer.push_back(boost::asio::buffer(compressed)); outputBuffer.push_back(boost::asio::buffer(compressed));
@ -89,7 +89,7 @@ private:
compressionHeader.name = "Content-Encoding"; compressionHeader.name = "Content-Encoding";
compressionHeader.value = "gzip"; compressionHeader.value = "gzip";
reply.headers.insert(reply.headers.begin(), compressionHeader); 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()); reply.setSize(compressed.size());
outputBuffer = reply.HeaderstoBuffers(); outputBuffer = reply.HeaderstoBuffers();
outputBuffer.push_back(boost::asio::buffer(compressed)); outputBuffer.push_back(boost::asio::buffer(compressed));
@ -126,8 +126,10 @@ private:
unsigned char temp_buffer[BUFSIZE]; unsigned char temp_buffer[BUFSIZE];
z_stream strm; z_stream strm;
strm.zalloc = 0; strm.zalloc = Z_NULL;
strm.zfree = 0; strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = 0;
strm.next_in = (unsigned char *)(in_data); strm.next_in = (unsigned char *)(in_data);
strm.avail_in = in_data_size; strm.avail_in = in_data_size;
strm.next_out = temp_buffer; 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(): * 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 * 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; break;
case noCompression:
std::cerr << "[error] contradicting compression request" << std::endl;
return;
} }
int deflate_res = Z_OK; int deflate_res = Z_OK;
@ -159,7 +158,7 @@ private:
} }
deflate_res = deflate(&strm, Z_FINISH); deflate_res = deflate(&strm, Z_FINISH);
} while (strm.avail_out == 0); } while (deflate_res == Z_OK);
assert(deflate_res == Z_STREAM_END); assert(deflate_res == Z_STREAM_END);
buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUFSIZE - strm.avail_out); buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUFSIZE - strm.avail_out);