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.
This commit is contained in:
Willy Tarreau 2018-06-14 13:32:50 +02:00
parent 188e230704
commit 7314be8e2c
3 changed files with 12 additions and 22 deletions

View File

@ -43,7 +43,7 @@ int http_forward_trailers(struct http_msg *msg);
int h1_headers_to_hdr_list(char *start, const char *stop, int h1_headers_to_hdr_list(char *start, const char *stop,
struct http_hdr *hdr, unsigned int hdr_num, struct http_hdr *hdr, unsigned int hdr_num,
struct h1m *h1m); 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_CTL 0x01
#define H1_FLG_SEP 0x02 #define H1_FLG_SEP 0x02

View File

@ -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 /* This function performs a very minimal parsing of the trailers block present
* in the output part of <buf>, and returns the number of bytes to delete to * in the output part of <buf> for up to <max> bytes, and returns the number of
* skip the trailers. It may return 0 if it's missing some input data, or < 0 * bytes to delete to skip the trailers. It may return 0 if it's missing some
* in case of parse error (in which case the caller may have to decide how to * input data, or < 0 in case of parse error (in which case the caller may have
* proceed, possibly eating everything). * 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; int count = 0;
while (1) { while (1) {
const char *p1 = NULL, *p2 = NULL; const char *p1 = NULL, *p2 = NULL;
const char *start = b_ptr(buf, (int)(count - buf->o)); const char *start = b_peek(buf, count);
const char *stop = b_peek(buf, buf->o); const char *stop = b_peek(buf, max);
const char *ptr = start; const char *ptr = start;
int bytes = 0;
/* scan current line and stop at LF or CRLF */ /* scan current line and stop at LF or CRLF */
while (1) { while (1) {
@ -1243,21 +1242,12 @@ int h1_measure_trailers(const struct buffer *buf)
p1 = ptr; p1 = ptr;
} }
ptr++; ptr = b_next(buf, ptr);
if (ptr >= buf->data + buf->size)
ptr = buf->data;
} }
/* after LF; point to beginning of next line */ /* after LF; point to beginning of next line */
p2++; p2 = b_next(buf, p2);
if (p2 >= buf->data + buf->size) count += b_dist(buf, start, p2);
p2 = buf->data;
bytes = p2 - start;
if (bytes < 0)
bytes += buf->size;
count += bytes;
/* LF/CRLF at beginning of line => end of trailers at p2. /* LF/CRLF at beginning of line => end of trailers at p2.
* Everything was scheduled for forwarding, there's nothing left * Everything was scheduled for forwarding, there's nothing left

View File

@ -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) { else if (h2s->res.state == HTTP_MSG_TRAILERS) {
/* consume the trailers if any (we don't forward them for now) */ /* 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 (unlikely(count <= 0)) {
if (count < 0) if (count < 0)