From: Willy Tarreau Date: Thu, 14 Jun 2018 11:32:50 +0000 (+0200) Subject: MINOR: h1: make h1_measure_trailers() take the byte count in argument X-Git-Tag: v1.9-dev1~139 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7314be8e2c63fedd4e5de7400dacd3ebe53428fd;p=thirdparty%2Fhaproxy.git MINOR: h1: make h1_measure_trailers() take the byte count in argument The principle is that it should not have to take this value from the buffer itself anymore. --- diff --git a/include/proto/h1.h b/include/proto/h1.h index ada7d03b6b..05d1877409 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); +int h1_measure_trailers(const struct buffer *buf, unsigned int max); #define H1_FLG_CTL 0x01 #define H1_FLG_SEP 0x02 diff --git a/src/h1.c b/src/h1.c index f0701163a3..436180952c 100644 --- a/src/h1.c +++ b/src/h1.c @@ -1209,21 +1209,20 @@ 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 , 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). + * in the output part of 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) +int h1_measure_trailers(const struct buffer *buf, unsigned int max) { int count = 0; while (1) { const char *p1 = NULL, *p2 = NULL; - const char *start = b_ptr(buf, (int)(count - buf->o)); - const char *stop = b_peek(buf, buf->o); + const char *start = b_peek(buf, count); + const char *stop = b_peek(buf, max); const char *ptr = start; - int bytes = 0; /* scan current line and stop at LF or CRLF */ while (1) { @@ -1243,21 +1242,12 @@ int h1_measure_trailers(const struct buffer *buf) p1 = ptr; } - ptr++; - if (ptr >= buf->data + buf->size) - ptr = buf->data; + ptr = b_next(buf, ptr); } /* after LF; point to beginning of next line */ - p2++; - if (p2 >= buf->data + buf->size) - p2 = buf->data; - - bytes = p2 - start; - if (bytes < 0) - bytes += buf->size; - - count += bytes; + p2 = b_next(buf, p2); + count += b_dist(buf, start, p2); /* LF/CRLF at beginning of line => end of trailers at p2. * Everything was scheduled for forwarding, there's nothing left diff --git a/src/mux_h2.c b/src/mux_h2.c index 9b4dcd5267..beb7dca288 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3391,7 +3391,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) */ - int count = h1_measure_trailers(buf); + int count = h1_measure_trailers(buf, buf->o); if (unlikely(count <= 0)) { if (count < 0)