21 static inline int DEFLATE_HEADER = 0;
22 static inline int GZIP_HEADER = 16;
32 ) : readSource(readSource) {
33 stream.zfree =
nullptr;
34 stream.zalloc =
nullptr;
35 stream.opaque =
nullptr;
41 15 | (gzip ? GZIP_HEADER : DEFLATE_HEADER),
45 throw std::runtime_error(
"Critical zlib init error");
58 size_t blocks = (size_t) std::ceil(
59 (
double) len / (
double) 16384
64 size_t overheadBytes = 5 * (blocks + 1);
66 std::vector<uint8_t> intermediateBuf;
68 intermediateBuf.resize(len - overheadBytes);
69 size_t readLen = readSource->getChunk(
70 intermediateBuf.size(),
71 intermediateBuf.data(),
75 stream.next_in = intermediateBuf.data();
76 stream.avail_in = readLen;
77 stream.next_out = buf;
78 stream.avail_out = len;
81 deflate(&stream, Z_FULL_FLUSH) != Z_OK
83 throw std::runtime_error(
"Failed to deflate");
85 size_t outputSize = len - stream.avail_out;