From: Willy Tarreau Date: Sun, 3 Jan 2010 16:24:51 +0000 (+0100) Subject: [MINOR] http: don't wait for sending requests to the server X-Git-Tag: v1.4-dev5~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2be39394165a82b99734c84879739b2749820800;p=thirdparty%2Fhaproxy.git [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 34189cde0f..ba7bcb8ae7 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 2cab1989d6..73f9fd1796 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2807,6 +2807,15 @@ int http_process_req_common(struct session *s, struct buffer *req, int an_bit, s 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 4a9434c4f8..5caac469e7 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -623,7 +623,15 @@ static int stream_sock_write_loop(struct stream_interface *si, struct buffer *b) 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);