#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))
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;
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);