void HttpOutput::Answer(const void* buffer, size_t length) { if (length == 0) { AnswerEmpty(); return; } HttpCompression compression = GetPreferredCompression(length); if (compression == HttpCompression_None) { stateMachine_.SetContentLength(length); stateMachine_.SendBody(buffer, length); return; } std::string compressed, encoding; switch (compression) { case HttpCompression_Deflate: { encoding = "deflate"; ZlibCompressor compressor; // Do not prefix the buffer with its uncompressed size, to be compatible with "deflate" compressor.SetPrefixWithUncompressedSize(false); compressor.Compress(compressed, buffer, length); break; } case HttpCompression_Gzip: { encoding = "gzip"; GzipCompressor compressor; compressor.Compress(compressed, buffer, length); break; } default: throw OrthancException(ErrorCode_InternalError); } LOG(TRACE) << "Compressing a HTTP answer using " << encoding; // The body is empty, do not use HTTP compression if (compressed.size() == 0) { AnswerEmpty(); } else { stateMachine_.AddHeader("Content-Encoding", encoding); stateMachine_.SetContentLength(compressed.size()); stateMachine_.SendBody(compressed.c_str(), compressed.size()); } stateMachine_.CloseBody(); }
TEST(Zlib, Empty) { std::string s = ""; std::string compressed; ZlibCompressor c; c.Compress(compressed, s); std::string uncompressed; c.Uncompress(uncompressed, compressed); ASSERT_EQ(0u, uncompressed.size()); }
TEST(Zlib, DISABLED_Corrupted) // Disabled because it may result in a crash { std::string s = Toolbox::GenerateUuid(); s = s + s + s + s; std::string compressed; ZlibCompressor c; c.Compress(compressed, s); compressed[compressed.size() - 1] = 'a'; std::string u; ASSERT_THROW(c.Uncompress(u, compressed), OrthancException); }
TEST(Zlib, Level) { std::string s = Toolbox::GenerateUuid(); s = s + s + s + s; std::string compressed, compressed2; ZlibCompressor c; c.SetCompressionLevel(9); c.Compress(compressed, s); c.SetCompressionLevel(0); c.Compress(compressed2, s); ASSERT_TRUE(compressed.size() < compressed2.size()); }
TEST(Zlib, Basic) { std::string s = Toolbox::GenerateUuid(); s = s + s + s + s; std::string compressed, compressed2; ZlibCompressor c; ASSERT_TRUE(c.HasPrefixWithUncompressedSize()); IBufferCompressor::Compress(compressed, c, s); std::string uncompressed; IBufferCompressor::Uncompress(uncompressed, c, compressed); ASSERT_EQ(s.size(), uncompressed.size()); ASSERT_EQ(0, memcmp(&s[0], &uncompressed[0], s.size())); }
TEST(Zlib, Basic) { std::string s = Toolbox::GenerateUuid(); s = s + s + s + s; std::string compressed; ZlibCompressor c; c.Compress(compressed, s); std::string uncompressed; c.Uncompress(uncompressed, compressed); ASSERT_EQ(s.size(), uncompressed.size()); ASSERT_EQ(0, memcmp(&s[0], &uncompressed[0], s.size())); }
TEST(Zlib, Empty) { std::string s = ""; std::vector<uint8_t> v, vv; std::string compressed, compressed2; ZlibCompressor c; c.Compress(compressed, s); c.Compress(compressed2, v); ASSERT_EQ(compressed, compressed2); std::string uncompressed; c.Uncompress(uncompressed, compressed); ASSERT_EQ(0u, uncompressed.size()); StringToVector(vv, compressed); c.Uncompress(uncompressed, vv); ASSERT_EQ(0u, uncompressed.size()); }
char *readCompressedFile(std::string path, unsigned long *size_ret) { unsigned long size = 0; char *buf = readFile(path, &size); if(!buf) return NULL; ZlibCompressor z; // allocates with new[] by default z.init(buf, size, ByteBuffer::TAKE_OVER); z.Compressed(true); z.Decompress(); if(!z.Compressed()) { if (size_ret) *size_ret = z.size(); z.wpos(z.size()); z << '\0'; // be sure the buffer is null-terminated buf = (char*)z.ptr(); z._setPtr(NULL); return buf; } return NULL; }
TEST(Zlib, Basic) { std::string s = Toolbox::GenerateUuid(); s = s + s + s + s; std::string compressed, compressed2; ZlibCompressor c; c.Compress(compressed, s); std::vector<uint8_t> v, vv; StringToVector(v, s); c.Compress(compressed2, v); ASSERT_EQ(compressed, compressed2); std::string uncompressed; c.Uncompress(uncompressed, compressed); ASSERT_EQ(s.size(), uncompressed.size()); ASSERT_EQ(0, memcmp(&s[0], &uncompressed[0], s.size())); StringToVector(vv, compressed); c.Uncompress(uncompressed, vv); ASSERT_EQ(s.size(), uncompressed.size()); ASSERT_EQ(0, memcmp(&s[0], &uncompressed[0], s.size())); }