From 57f5c12c04986950668e85f4aeece906905f74d3 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 2 Dec 2010 00:37:14 +0100 Subject: [PATCH] [OPTIM] http: don't send each chunk in a separate packet When forwarding chunk-encoded data, each chunk gets a TCP PUSH flag when going onto the wire simply because the send() function does not know that some data remain after it (next chunk). Now we set the BF_EXPECT_MORE flag on the buffer if the chunk size is not null. That way we can reduce the number of packets sent, which is particularly noticeable when forwarding compressed data, especially as it requires less ACKs from the client. --- src/proto_http.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/proto_http.c b/src/proto_http.c index aa3ed5310..4dcefca2d 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -4364,6 +4364,9 @@ int http_request_forward_body(struct session *s, struct buffer *req, int an_bit) goto return_bad_req; } /* otherwise we're in HTTP_MSG_DATA or HTTP_MSG_TRAILERS state */ + /* Don't set a PUSH at the end of that chunk if it's not the last one */ + if (msg->msg_state == HTTP_MSG_DATA) + req->flags |= BF_EXPECT_MORE; } else if (msg->msg_state == HTTP_MSG_DATA_CRLF) { /* we want the CRLF after the data */ @@ -5342,6 +5345,9 @@ int http_response_forward_body(struct session *s, struct buffer *res, int an_bit else if (ret < 0) goto return_bad_res; /* otherwise we're in HTTP_MSG_DATA or HTTP_MSG_TRAILERS state */ + /* Don't set a PUSH at the end of that chunk if it's not the last one */ + if (msg->msg_state == HTTP_MSG_DATA) + res->flags |= BF_EXPECT_MORE; } else if (msg->msg_state == HTTP_MSG_DATA_CRLF) { /* we want the CRLF after the data */