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;
|
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)
|
static int h3_resp_headers_send(struct qcs *qcs, struct htx *htx)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@ -1679,7 +1702,7 @@ static int h3_resp_headers_send(struct qcs *qcs, struct htx *htx)
|
|||||||
list[hdr].v = ist("trailers");
|
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;
|
goto err_full;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1839,7 +1862,7 @@ static int h3_resp_trailers_send(struct qcs *qcs, struct htx *htx)
|
|||||||
continue;
|
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);
|
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))
|
if (qcc_release_stream_txbuf(qcs))
|
||||||
goto end;
|
goto end;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user