[MINOR] http: don't wait for sending requests to the server

By default we automatically wait for enough data to fill large
packets if buf->to_forward is not null. This causes a problem
with POST/Expect requests which have a data size but no data
immediately available. Instead of causing noticeable delays on
such requests, simply add a flag to disable waiting when sending
requests.
diff --git a/include/types/buffers.h b/include/types/buffers.h
index 34189cd..ba7bcb8 100644
--- a/include/types/buffers.h
+++ b/include/types/buffers.h
@@ -113,6 +113,7 @@
 
 #define BF_DONT_READ     0x1000000  /* disable reading for now */
 #define BF_EXPECT_MORE   0x2000000  /* more data expected to be sent very soon (one-shoot) */
+#define BF_SEND_DONTWAIT 0x4000000  /* don't wait for sending data (one-shoot) */
 
 /* Use these masks to clear the flags before going back to lower layers */
 #define BF_CLEAR_READ     (~(BF_READ_NULL|BF_READ_PARTIAL|BF_READ_ERROR|BF_READ_ATTACHED))
diff --git a/src/proto_http.c b/src/proto_http.c
index 2cab198..73f9fd1 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -2807,6 +2807,15 @@
 	else
 		req->flags &= ~BF_DONT_READ;
 
+	/* POST requests may be accompanied with an "Expect: 100-Continue" header.
+	 * If this happens, then the data will not come immediately, so we must
+	 * send all what we have without waiting. Note that due to the small gain
+	 * in waiting for the body of the request, it's easier to simply put the
+	 * BF_SEND_DONTWAIT flag any time. It's a one-shot flag so it will remove
+	 * itself once used.
+	 */
+	req->flags |= BF_SEND_DONTWAIT;
+
 	/* that's OK for us now, let's move on to next analysers */
 	return 1;
 
diff --git a/src/stream_sock.c b/src/stream_sock.c
index 4a9434c..5caac46 100644
--- a/src/stream_sock.c
+++ b/src/stream_sock.c
@@ -623,7 +623,15 @@
 				send_flag |= MSG_MORE;
 			}
 
+			/* this flag has precedence over the rest */
+			if (b->flags & BF_SEND_DONTWAIT)
+				send_flag &= ~MSG_MORE;
+
 			ret = send(si->fd, b->w, max, send_flag);
+
+			/* disable it only once everything has been sent */
+			if (ret == max && (b->flags & BF_SEND_DONTWAIT))
+				b->flags &= ~BF_SEND_DONTWAIT;
 		} else {
 			int skerr;
 			socklen_t lskerr = sizeof(skerr);