mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 14:51:27 +02:00
BUG/MINOR: mux-h2: rely on trailers output not input to turn them to empty data
When sending trailers, we may face an empty HTX trailers block or even have to discard some of the headers there and be left with nothing to send. RFC7540 forbids sending of empty HEADERS frames, so in this case we turn to DATA frames (which is possible since after other DATA). The code used to only check the input frame's contents to decide whether or not to switch to a DATA frame, it didn't consider the possibility that the frame only used to contain headers discarded later, thus it could still emit an empty HEADERS frame in such a case. This patch makes sure that the output frame size is checked instead to take the decision. This patch must be backported to 1.9. In practice this situation is never encountered since the discarded headers have really nothing to do in a trailers block.
This commit is contained in:
parent
596ce52fe1
commit
5121e5d750
11
src/mux_h2.c
11
src/mux_h2.c
@ -5096,11 +5096,12 @@ static size_t h2s_htx_make_trailers(struct h2s *h2s, struct htx *htx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hdr) {
|
if (outbuf.data == 9) {
|
||||||
/* here we have a problem, we've received an empty trailers
|
/* here we have a problem, we have nothing to emit (either we
|
||||||
* block followed by an EOM. Because of this we can't send a
|
* received an empty trailers block followed or we removed its
|
||||||
* HEADERS frame, so we have to cheat and instead send an empty
|
* contents above). Because of this we can't send a HEADERS
|
||||||
* DATA frame conveying the ES flag.
|
* frame, so we have to cheat and instead send an empty DATA
|
||||||
|
* frame conveying the ES flag.
|
||||||
*/
|
*/
|
||||||
outbuf.area[3] = H2_FT_DATA;
|
outbuf.area[3] = H2_FT_DATA;
|
||||||
outbuf.area[4] = H2_F_DATA_END_STREAM;
|
outbuf.area[4] = H2_F_DATA_END_STREAM;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user