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
}
/* 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
- * 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 <buf> for up to <max> 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) {
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
}
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)