BUG/MEDIUM: h3: trim whitespaces in header value prior to QPACK encoding
This commit does a similar job than the previous one, but it acts now on the response path. Any leading or trailing whitespaces characters from a HTX block header value are removed, prior to the header encoding via QPACK. This must be backported up to 2.6.
This commit is contained in:
parent
a17e5b27c0
commit
bd3587574d
27
src/h3.c
27
src/h3.c
@ -1565,6 +1565,29 @@ static int h3_control_send(struct qcs *qcs, void *ctx)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Encode header field name <n> value <v> into <buf> buffer using QPACK. Strip
|
||||
* any leading/trailing WS in value prior to encoding.
|
||||
*
|
||||
* Returns 0 on success else non zero.
|
||||
*/
|
||||
static int h3_encode_header(struct buffer *buf,
|
||||
const struct ist n, const struct ist v)
|
||||
{
|
||||
struct ist v_strip;
|
||||
char *ptr;
|
||||
|
||||
/* trim leading/trailing LWS */
|
||||
for (v_strip = v; istlen(v_strip); --v_strip.len) {
|
||||
ptr = istptr(v_strip);
|
||||
if (unlikely(HTTP_IS_LWS(*ptr)))
|
||||
++v_strip.ptr;
|
||||
else if (!unlikely(HTTP_IS_LWS(ptr[istlen(v_strip) - 1])))
|
||||
break;
|
||||
}
|
||||
|
||||
return qpack_encode_header(buf, n, v_strip);
|
||||
}
|
||||
|
||||
static int h3_resp_headers_send(struct qcs *qcs, struct htx *htx)
|
||||
{
|
||||
int err;
|
||||
@ -1679,7 +1702,7 @@ static int h3_resp_headers_send(struct qcs *qcs, struct htx *htx)
|
||||
list[hdr].v = ist("trailers");
|
||||
}
|
||||
|
||||
if (qpack_encode_header(&headers_buf, list[hdr].n, list[hdr].v))
|
||||
if (h3_encode_header(&headers_buf, list[hdr].n, list[hdr].v))
|
||||
goto err_full;
|
||||
}
|
||||
|
||||
@ -1839,7 +1862,7 @@ static int h3_resp_trailers_send(struct qcs *qcs, struct htx *htx)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (qpack_encode_header(&headers_buf, list[hdr].n, list[hdr].v)) {
|
||||
if (h3_encode_header(&headers_buf, list[hdr].n, list[hdr].v)) {
|
||||
TRACE_STATE("not enough room for all trailers", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
|
||||
if (qcc_release_stream_txbuf(qcs))
|
||||
goto end;
|
||||
|
Loading…
x
Reference in New Issue
Block a user