mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-03-25 04:17:42 +00:00
[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.
This commit is contained in:
parent
6c2cbe14e4
commit
2be3939416
@ -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))
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user