mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-21 22:01:31 +02:00
BUG/MINOR: mux-h1: Apply the reserve on the channel's buffer only
There is no reason to use the reserve to limit the amount of data of the input buffer that we can parse at a time. The only important thing is to keep the reserve free in the channel's buffer. This patch should be backported to 1.9.
This commit is contained in:
parent
a413e958fd
commit
afe57846bf
29
src/mux_h1.c
29
src/mux_h1.c
@ -1064,12 +1064,17 @@ static size_t h1_process_headers(struct h1s *h1s, struct h1m *h1m, struct htx *h
|
||||
*/
|
||||
static size_t h1_process_data(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
|
||||
struct buffer *buf, size_t *ofs, size_t max,
|
||||
struct buffer *htxbuf)
|
||||
struct buffer *htxbuf, size_t reserve)
|
||||
{
|
||||
uint32_t data_space = htx_free_data_space(htx);
|
||||
uint32_t data_space;
|
||||
size_t total = 0;
|
||||
int ret = 0;
|
||||
|
||||
data_space = htx_free_data_space(htx);
|
||||
if (data_space <= reserve)
|
||||
goto end;
|
||||
data_space -= reserve;
|
||||
|
||||
if (h1m->flags & H1_MF_XFER_LEN) {
|
||||
if (h1m->flags & H1_MF_CLEN) {
|
||||
/* content-length: read only h2m->body_len */
|
||||
@ -1175,6 +1180,10 @@ static size_t h1_process_data(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
|
||||
}
|
||||
if (!h1m->curr_len) {
|
||||
h1m->state = H1_MSG_CHUNK_CRLF;
|
||||
data_space = htx_free_data_space(htx);
|
||||
if (data_space <= reserve)
|
||||
goto end;
|
||||
data_space -= reserve;
|
||||
goto new_chunk;
|
||||
}
|
||||
goto end;
|
||||
@ -1303,22 +1312,14 @@ static size_t h1_process_input(struct h1c *h1c, struct buffer *buf, int flags)
|
||||
struct htx *htx;
|
||||
size_t total = 0;
|
||||
size_t ret = 0;
|
||||
size_t count, max;
|
||||
size_t count, rsv;
|
||||
int errflag;
|
||||
|
||||
htx = htx_from_buf(buf);
|
||||
count = b_data(&h1c->ibuf);
|
||||
max = htx_free_space(htx);
|
||||
if (flags & CO_RFL_KEEP_RSV) {
|
||||
if (max < global.tune.maxrewrite)
|
||||
goto end;
|
||||
max -= global.tune.maxrewrite;
|
||||
}
|
||||
if (count > max)
|
||||
count = max;
|
||||
|
||||
if (!count)
|
||||
goto end;
|
||||
rsv = ((flags & CO_RFL_KEEP_RSV) ? global.tune.maxrewrite : 0);
|
||||
|
||||
if (!conn_is_back(h1c->conn)) {
|
||||
h1m = &h1s->req;
|
||||
@ -1336,7 +1337,7 @@ static size_t h1_process_input(struct h1c *h1c, struct buffer *buf, int flags)
|
||||
break;
|
||||
}
|
||||
else if (h1m->state <= H1_MSG_TRAILERS) {
|
||||
ret = h1_process_data(h1s, h1m, htx, &h1c->ibuf, &total, count, buf);
|
||||
ret = h1_process_data(h1s, h1m, htx, &h1c->ibuf, &total, count, buf, rsv);
|
||||
htx = htx_from_buf(buf);
|
||||
if (!ret)
|
||||
break;
|
||||
@ -1346,7 +1347,7 @@ static size_t h1_process_input(struct h1c *h1c, struct buffer *buf, int flags)
|
||||
break;
|
||||
}
|
||||
else if (h1m->state == H1_MSG_TUNNEL) {
|
||||
ret = h1_process_data(h1s, h1m, htx, &h1c->ibuf, &total, count, buf);
|
||||
ret = h1_process_data(h1s, h1m, htx, &h1c->ibuf, &total, count, buf, rsv);
|
||||
htx = htx_from_buf(buf);
|
||||
if (!ret)
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user