From: Willy Tarreau Date: Thu, 14 Jun 2018 14:52:02 +0000 (+0200) Subject: MINOR: h1: make h1_measure_trailers() use an offset and a count X-Git-Tag: v1.9-dev1~134 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f40e68227b77001c33c6a007c0b32def01de4121;p=thirdparty%2Fhaproxy.git MINOR: h1: make h1_measure_trailers() use an offset and a count This will be needed by the H2 encoder to restart after wrapping. --- diff --git a/include/proto/h1.h b/include/proto/h1.h index b0051e3a9d..943ac0fe5e 100644 --- a/include/proto/h1.h +++ b/include/proto/h1.h @@ -43,7 +43,7 @@ int http_forward_trailers(struct http_msg *msg); int h1_headers_to_hdr_list(char *start, const char *stop, struct http_hdr *hdr, unsigned int hdr_num, struct h1m *h1m); -int h1_measure_trailers(const struct buffer *buf, unsigned int max); +int h1_measure_trailers(const struct buffer *buf, unsigned int ofs, unsigned int max); #define H1_FLG_CTL 0x01 #define H1_FLG_SEP 0x02 diff --git a/src/h1.c b/src/h1.c index 436180952c..12278f4704 100644 --- a/src/h1.c +++ b/src/h1.c @@ -1209,19 +1209,19 @@ int h1_headers_to_hdr_list(char *start, const char *stop, } /* This function performs a very minimal parsing of the trailers block present - * in the output part of for up to bytes, and returns the number of + * at offset in for up to bytes, and returns the number of * bytes to delete to skip the trailers. It may return 0 if it's missing some * input data, or < 0 in case of parse error (in which case the caller may have * to decide how to proceed, possibly eating everything). */ -int h1_measure_trailers(const struct buffer *buf, unsigned int max) +int h1_measure_trailers(const struct buffer *buf, unsigned int ofs, unsigned int max) { - int count = 0; + const char *stop = b_peek(buf, ofs + max); + int count = ofs; while (1) { const char *p1 = NULL, *p2 = NULL; const char *start = b_peek(buf, count); - const char *stop = b_peek(buf, max); const char *ptr = start; /* scan current line and stop at LF or CRLF */ @@ -1256,7 +1256,7 @@ int h1_measure_trailers(const struct buffer *buf, unsigned int max) break; /* OK, next line then */ } - return count; + return count - ofs; } /* This function skips trailers in the buffer associated with HTTP message diff --git a/src/mux_h2.c b/src/mux_h2.c index e75a2ba647..63b49c175e 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3400,7 +3400,7 @@ static int h2_snd_buf(struct conn_stream *cs, struct buffer *buf, int flags) } else if (h2s->res.state == HTTP_MSG_TRAILERS) { /* consume the trailers if any (we don't forward them for now) */ - ret = h1_measure_trailers(buf, buf->o); + ret = h1_measure_trailers(buf, 0, buf->o); if (unlikely((int)ret <= 0)) { if ((int)ret < 0)