mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 08:14:15 +00:00
don't invoke gzip for decompression if no compression
This commit is contained in:
parent
9fb59e128b
commit
3db4421aa7
@ -32,18 +32,34 @@ namespace data
|
|||||||
|
|
||||||
size_t GzipInflator::Inflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen)
|
size_t GzipInflator::Inflate (const uint8_t * in, size_t inLen, uint8_t * out, size_t outLen)
|
||||||
{
|
{
|
||||||
if (m_IsDirty) inflateReset (&m_Inflator);
|
if (inLen < 23) return 0;
|
||||||
m_IsDirty = true;
|
if (in[10] == 0x01) // non compressed
|
||||||
m_Inflator.next_in = const_cast<uint8_t *>(in);
|
{
|
||||||
m_Inflator.avail_in = inLen;
|
size_t len = bufle16toh (in + 11);
|
||||||
m_Inflator.next_out = out;
|
if (len + 23 < inLen)
|
||||||
m_Inflator.avail_out = outLen;
|
{
|
||||||
int err;
|
LogPrint (eLogError, "Gzip: Incorrect length");
|
||||||
if ((err = inflate (&m_Inflator, Z_NO_FLUSH)) == Z_STREAM_END)
|
return 0;
|
||||||
return outLen - m_Inflator.avail_out;
|
}
|
||||||
// else
|
if (len > outLen) len = outLen;
|
||||||
LogPrint (eLogError, "Gzip: Inflate error ", err);
|
memcpy (out, in + 15, len);
|
||||||
return 0;
|
return len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_IsDirty) inflateReset (&m_Inflator);
|
||||||
|
m_IsDirty = true;
|
||||||
|
m_Inflator.next_in = const_cast<uint8_t *>(in);
|
||||||
|
m_Inflator.avail_in = inLen;
|
||||||
|
m_Inflator.next_out = out;
|
||||||
|
m_Inflator.avail_out = outLen;
|
||||||
|
int err;
|
||||||
|
if ((err = inflate (&m_Inflator, Z_NO_FLUSH)) == Z_STREAM_END)
|
||||||
|
return outLen - m_Inflator.avail_out;
|
||||||
|
// else
|
||||||
|
LogPrint (eLogError, "Gzip: Inflate error ", err);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GzipInflator::Inflate (const uint8_t * in, size_t inLen, std::ostream& os)
|
void GzipInflator::Inflate (const uint8_t * in, size_t inLen, std::ostream& os)
|
||||||
@ -148,7 +164,7 @@ namespace data
|
|||||||
|
|
||||||
size_t GzipNoCompression (const uint8_t * in, uint16_t inLen, uint8_t * out, size_t outLen)
|
size_t GzipNoCompression (const uint8_t * in, uint16_t inLen, uint8_t * out, size_t outLen)
|
||||||
{
|
{
|
||||||
static const uint8_t gzipHeader[11] = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0x01 };
|
static const uint8_t gzipHeader[11] = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x01 };
|
||||||
if (outLen < (size_t)inLen + 23) return 0;
|
if (outLen < (size_t)inLen + 23) return 0;
|
||||||
memcpy (out, gzipHeader, 11);
|
memcpy (out, gzipHeader, 11);
|
||||||
htole16buf (out + 11, inLen);
|
htole16buf (out + 11, inLen);
|
||||||
|
@ -128,5 +128,20 @@ inline void htole64buf(void *buf, uint64_t big64)
|
|||||||
htobuf64(buf, htole64(big64));
|
htobuf64(buf, htole64(big64));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline uint16_t bufle16toh(const void *buf)
|
||||||
|
{
|
||||||
|
return le16toh(buf16toh(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint32_t bufle32toh(const void *buf)
|
||||||
|
{
|
||||||
|
return le32toh(buf32toh(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint64_t bufle64toh(const void *buf)
|
||||||
|
{
|
||||||
|
return le64toh(buf64toh(buf));
|
||||||
|
}
|
||||||
|
|
||||||
#endif // I2PENDIAN_H__
|
#endif // I2PENDIAN_H__
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user