From 3d334dca671898241732dbc0ef6838b768308da7 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Thu, 21 Sep 2023 02:18:35 +0000 Subject: Implement If-Modified-Since Signed-off-by: Laurent Bercot --- src/libtipidee/tipidee_util_chunked_read.c | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/libtipidee/tipidee_util_chunked_read.c (limited to 'src/libtipidee/tipidee_util_chunked_read.c') diff --git a/src/libtipidee/tipidee_util_chunked_read.c b/src/libtipidee/tipidee_util_chunked_read.c new file mode 100644 index 0000000..850ffae --- /dev/null +++ b/src/libtipidee/tipidee_util_chunked_read.c @@ -0,0 +1,41 @@ +/* ISC license. */ + +#include +#include + +#include +#include +#include + +#include + +#include + +int tipidee_util_chunked_read (buffer *b, stralloc *sa, size_t maxlen, tain const *deadline, tain *stamp) +{ + char line[512] ; + for (;;) + { + size_t chunklen, pos, w = 0 ; + ssize_t r = timed_getlnmax(b, line, 512, &w, '\n', deadline, stamp) ; + if (r < 0) return 0 ; + if (!r) return (errno = EPIPE, 0) ; + pos = size_scan(line, &chunklen) ; + if (!pos) return (errno = EPROTO, 0) ; + if (!memchr("\r\n; \t", line[pos], 5)) return (errno = EPROTO, 0) ; + if (!chunklen) break ; + if (sa->len + chunklen > maxlen) return (errno = EMSGSIZE, 0) ; + if (!stralloc_readyplus(sa, chunklen)) return 0 ; + if (buffer_timed_get(b, sa->s + sa->len, chunklen, deadline, stamp) < chunklen) return 0 ; + sa->len += chunklen ; + } + for (;;) + { + size_t w = 0 ; + ssize_t r = timed_getlnmax(b, line, 512, &w, '\n', deadline, stamp) ; + if (r < 0) return 0 ; + if (!r) return (errno = EPIPE, 0) ; + if (w == 1 || (w == 2 && line[0] == '\r')) break ; + } + return 1 ; +} -- cgit v1.3.1