MINOR: channel: add new function channel_congested()

This function returns non-zero if the channel is congested with data in
transit waiting for leaving, indicating to the caller that it should wait
for the reserve to be released before starting to process new data in
case it needs the ability to append data. This is meant to be used while
waiting for a clean response buffer before processing a request.
(cherry picked from commit 55e58f23348c2f9fa918e7370c0ddb98b307ee28)
(cherry picked from commit ac8771ccb2543777b19f2bde9140e3f41e93d11b)
[wt: channel_is_rewritable() is channel_reserved() in 1.5]
diff --git a/include/proto/channel.h b/include/proto/channel.h
index fbdf872..189be86 100644
--- a/include/proto/channel.h
+++ b/include/proto/channel.h
@@ -118,6 +118,27 @@
 	return rem >= 0;
 }
 
+/* Returns non-zero if the channel is congested with data in transit waiting
+ * for leaving, indicating to the caller that it should wait for the reserve to
+ * be released before starting to process new data in case it needs the ability
+ * to append data. This is meant to be used while waiting for a clean response
+ * buffer before processing a request.
+ */
+static inline int channel_congested(const struct channel *chn)
+{
+	if (!chn->buf->o)
+		return 0;
+
+	if (!channel_reserved(chn))
+		return 1;
+
+	if (chn->buf->p + chn->buf->i >
+	    chn->buf->data + chn->buf->size - global.tune.maxrewrite)
+		return 1;
+
+	return 0;
+}
+
 /* Tells whether data are likely to leave the buffer. This is used to know when
  * we can safely ignore the reserve since we know we cannot retry a connection.
  * It returns zero if data are blocked, non-zero otherwise.