Mechiel Lukkien f40f94670e
implement IMAP extension COMPRESS=DEFLATE, rfc 4978
to compress the entire IMAP connection. tested with thunderbird, meli, k9, ios
mail. the initial implementation had interoperability issues with some of these
clients: if they write the deflate stream and flush in "partial mode", the go
stdlib flate reader does not return any data (until there is an explicit
zero-length "sync flush" block, or until the history/sliding window is full),
blocking progress, resulting in clients closing the seemingly stuck connection
after considering the connection timed out. this includes a coy of the flate
package with a new reader that returns partially flushed blocks earlier.

this also adds imap trace logging to imapclient.Conn, which was useful for
debugging.
2025-02-21 14:56:17 +01:00
..

https://pkg.go.dev/compress/flate from go1.24.0, with flate.NewReaderPartial added: a Reader that returns data from blocks flushed with mode "partial flush", without blocking on reading the next flate block. Without NewReaderPartial, protocols that expect a response after writing a short compressed request that was flushed in "partial flush" mode can get stuck.

Writes/flushes in "partial flush" mode are not implemented.

https://pkg.go.dev/github.com/mjl-/flate#NewReaderPartial

Also see https://github.com/golang/go/issues/31514