} else {
conn->compression = conn->decompression = NULL;
}
- conn->done_sending = conn->done_receiving = 0
#endif
+ conn->done_sending = conn->done_receiving = 0;
return conn;
}
int connection_decompress_to_buf(char *string, int len, connection_t *conn,
int flush) {
- /* This is not sane with respect to flow control; we want to spool out to
- * z_outbuf, but only decompress and write as needed.
- */
int n;
struct timeval now;
- if (write_to_buf(string, len,
- &conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen) < 0)
- return -1;
+ if (len) {
+ if (write_to_buf(string, len,
+ &conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen) < 0)
+ return -1;
+ }
+
+ /* If we have more that 10 payloads worth of data waiting in outbuf,
+ * don't uncompress any more; queue this data in z_outbuf.
+ *
+ * This check should may be different.
+ */
+ if (connection_outbuf_too_full(conn->outbuf))
+ return 0;
n = decompress_buf_to_buf(
&conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen,
return 0;
conn->timestamp_lastwritten = now.tv_sec;
+ conn->outbuf_flushlen += n;
return n;
}