You need to flush for both compression and decompression. Otherwise some or all of the data remains in the object. I.e.:
def decompress(buf):
decompressor = zlib.decompressobj()
result = decompressor.decompress(buf)
return result + decompressor.flush()
def compress(buf):
compressor = zlib.compressobj()
result = compressor.compress(buf)
return result + compressor.flush()