mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-06 07:07:04 +02:00
MINOR: mux-h1: Add function to add size of a chunk to an outgoind message
This function should be used to send the chunk size, before appending the chunk payload. It also takes care to add a CRLF to finish a previous chunk, if necessary. This function will be used to fix the splicing for re-chunk responses with an unknown length.
This commit is contained in:
parent
91f1c5519a
commit
6dff013fad
44
src/mux_h1.c
44
src/mux_h1.c
@ -2980,6 +2980,50 @@ static size_t h1_make_trailers(struct h1s *h1s, struct h1m *h1m, struct htx *htx
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Try to send the header for a chunk of <len> bytes. It returns the number of
|
||||||
|
* bytes consumed or zero if nothing was done or if an error occurred..
|
||||||
|
*/
|
||||||
|
static __maybe_unused size_t h1_make_chunk(struct h1s *h1s, struct h1m * h1m, size_t len)
|
||||||
|
{
|
||||||
|
struct h1c *h1c = h1s->h1c;
|
||||||
|
struct buffer outbuf;
|
||||||
|
size_t ret = 0;
|
||||||
|
|
||||||
|
TRACE_ENTER(H1_EV_TX_DATA|H1_EV_TX_BODY, h1c->conn, h1s);
|
||||||
|
|
||||||
|
if (!h1_get_buf(h1c, &h1c->obuf)) {
|
||||||
|
h1c->flags |= H1C_F_OUT_ALLOC;
|
||||||
|
TRACE_STATE("waiting for h1c obuf allocation", H1_EV_TX_DATA|H1_EV_H1S_BLK, h1c->conn, h1s);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b_space_wraps(&h1c->obuf))
|
||||||
|
b_slow_realign(&h1c->obuf, trash.area, b_data(&h1c->obuf));
|
||||||
|
outbuf = b_make(b_tail(&h1c->obuf), b_contig_space(&h1c->obuf), 0, 0);
|
||||||
|
|
||||||
|
if (h1m->state == H1_MSG_CHUNK_CRLF) {
|
||||||
|
if (!chunk_memcat(&outbuf, "\r\n", 2))
|
||||||
|
goto full;
|
||||||
|
h1m->state = H1_MSG_CHUNK_SIZE;
|
||||||
|
}
|
||||||
|
if (!h1_append_chunk_size(&outbuf, len))
|
||||||
|
goto full;
|
||||||
|
|
||||||
|
h1m->state = H1_MSG_DATA;
|
||||||
|
|
||||||
|
TRACE_PROTO("H1 chunk info xferred", H1_EV_TX_DATA|H1_EV_TX_BODY, h1c->conn, h1s, 0, (size_t[]){ret});
|
||||||
|
b_add(&h1c->obuf, outbuf.data);
|
||||||
|
ret = outbuf.data;
|
||||||
|
|
||||||
|
end:
|
||||||
|
TRACE_LEAVE(H1_EV_TX_DATA|H1_EV_TX_BODY, h1c->conn, h1s, NULL, (size_t[]){ret});
|
||||||
|
return ret;
|
||||||
|
full:
|
||||||
|
TRACE_STATE("h1c obuf full", H1_EV_TX_DATA|H1_EV_H1S_BLK, h1c->conn, h1s);
|
||||||
|
h1c->flags |= H1C_F_OUT_FULL;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process outgoing data. It parses data and transfer them from the channel buffer into
|
* Process outgoing data. It parses data and transfer them from the channel buffer into
|
||||||
* h1c->obuf. It returns the number of bytes parsed and transferred if > 0, or
|
* h1c->obuf. It returns the number of bytes parsed and transferred if > 0, or
|
||||||
|
Loading…
Reference in New Issue
Block a user