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/deps-lib/tipidee | 5 ++- src/libtipidee/tipidee_chunked_read.c | 41 ---------------------- .../tipidee_response_header_common_put.c | 2 +- src/libtipidee/tipidee_response_header_date.c | 19 ++++++++++ src/libtipidee/tipidee_response_header_date_fmt.c | 11 +----- .../tipidee_response_header_lastmodified.c | 24 +++++++++++++ src/libtipidee/tipidee_util_chunked_read.c | 41 ++++++++++++++++++++++ src/libtipidee/tipidee_util_httpdate.c | 22 ++++++++++++ 8 files changed, 112 insertions(+), 53 deletions(-) delete mode 100644 src/libtipidee/tipidee_chunked_read.c create mode 100644 src/libtipidee/tipidee_response_header_date.c create mode 100644 src/libtipidee/tipidee_response_header_lastmodified.c create mode 100644 src/libtipidee/tipidee_util_chunked_read.c create mode 100644 src/libtipidee/tipidee_util_httpdate.c (limited to 'src/libtipidee') diff --git a/src/libtipidee/deps-lib/tipidee b/src/libtipidee/deps-lib/tipidee index d218af1..81cc5f7 100644 --- a/src/libtipidee/deps-lib/tipidee +++ b/src/libtipidee/deps-lib/tipidee @@ -1,4 +1,3 @@ -tipidee_chunked_read.o tipidee_conf_free.o tipidee_conf_get.o tipidee_conf_get_argv.o @@ -17,8 +16,12 @@ tipidee_method_tostr.o tipidee_response_error.o tipidee_response_header_builtin.o tipidee_response_header_common_put.o +tipidee_response_header_date.o tipidee_response_header_date_fmt.o +tipidee_response_header_lastmodified.o tipidee_response_status.o tipidee_rql_read.o tipidee_uri_parse.o +tipidee_util_chunked_read.o +tipidee_util_httpdate.o -lskarnet diff --git a/src/libtipidee/tipidee_chunked_read.c b/src/libtipidee/tipidee_chunked_read.c deleted file mode 100644 index 66d5d80..0000000 --- a/src/libtipidee/tipidee_chunked_read.c +++ /dev/null @@ -1,41 +0,0 @@ -/* ISC license. */ - -#include -#include - -#include -#include -#include - -#include - -#include - -int tipidee_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 ; -} diff --git a/src/libtipidee/tipidee_response_header_common_put.c b/src/libtipidee/tipidee_response_header_common_put.c index 8352ba9..c67cc94 100644 --- a/src/libtipidee/tipidee_response_header_common_put.c +++ b/src/libtipidee/tipidee_response_header_common_put.c @@ -10,7 +10,7 @@ size_t tipidee_response_header_common_put (buffer *b, uint32_t options, tain const *stamp) { char fmt[128] ; - size_t m = buffer_putnoflush(b, fmt, tipidee_response_header_date_fmt(fmt, 128, stamp)) ; + size_t m = buffer_putnoflush(b, fmt, tipidee_response_header_date(fmt, 128, stamp)) ; for (tipidee_response_header_builtin const *p = tipidee_response_header_builtin_table ; p->key ; p++) { m += buffer_putsnoflush(b, p->key) ; diff --git a/src/libtipidee/tipidee_response_header_date.c b/src/libtipidee/tipidee_response_header_date.c new file mode 100644 index 0000000..d350d2c --- /dev/null +++ b/src/libtipidee/tipidee_response_header_date.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include + +#include + +size_t tipidee_response_header_date (char *s, size_t max, tain const *stamp) +{ + size_t l ; + if (max < 8) return (errno = ENOBUFS, 0) ; + memcpy(s, "Date: ", 6) ; + l = tipidee_response_header_date_fmt(s + 6, max - 6, stamp) ; + if (!l) return 0 ; + if (l + 8 > max) return (errno = ENOBUFS, 0) ; + l += 6 ; + s[l++] = '\r' ; s[l++] = '\n' ; + return l ; +} diff --git a/src/libtipidee/tipidee_response_header_date_fmt.c b/src/libtipidee/tipidee_response_header_date_fmt.c index df19673..ca4cdd9 100644 --- a/src/libtipidee/tipidee_response_header_date_fmt.c +++ b/src/libtipidee/tipidee_response_header_date_fmt.c @@ -1,6 +1,5 @@ /* ISC license. */ -#include #include #include @@ -10,15 +9,7 @@ size_t tipidee_response_header_date_fmt (char *s, size_t max, tain const *stamp) { - size_t m = 0, l ; struct tm tm ; - if (m + 6 > max) return 0 ; if (!localtm_from_tai(&tm, tain_secp(stamp), 0)) return 0 ; - memcpy(s, "Date: ", 6) ; m += 6 ; - l = strftime(s + m, max - m, "%a, %d %b %Y %T GMT", &tm) ; - if (!l) return 0 ; - m += l ; - if (m + 2 > max) return 0 ; - s[m++] = '\r' ; s[m++] = '\n' ; - return m ; + return strftime(s, max, "%a, %d %b %Y %T GMT", &tm) ; } diff --git a/src/libtipidee/tipidee_response_header_lastmodified.c b/src/libtipidee/tipidee_response_header_lastmodified.c new file mode 100644 index 0000000..3b3caa6 --- /dev/null +++ b/src/libtipidee/tipidee_response_header_lastmodified.c @@ -0,0 +1,24 @@ +/* ISC license. */ + +#include + +#include +#include +#include + +#include + +size_t tipidee_response_header_lastmodified (char *s, size_t max, struct stat const *st) +{ + tain t ; + size_t l ; + if (max < 17) return (errno = ENOBUFS, 0) ; + if (!tain_from_timespec(&t, &st->st_mtim)) return 0 ; + memcpy(s, "Last-Modified: ", 15) ; + l = tipidee_response_header_date_fmt(s + 15, max - 15, &t) ; + if (!l) return 0 ; + if (l + 17 > max) return (errno = ENOBUFS, 0) ; + l += 15 ; + s[l++] = '\r' ; s[l++] = '\n' ; + return l ; +} 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 ; +} diff --git a/src/libtipidee/tipidee_util_httpdate.c b/src/libtipidee/tipidee_util_httpdate.c new file mode 100644 index 0000000..cce735d --- /dev/null +++ b/src/libtipidee/tipidee_util_httpdate.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include + +#include + +#include + +int tipidee_util_httpdate (char const *s, tain *stamp) +{ + struct tm tm ; + if (strptime(s, "%a, %d %b %Y %T GMT", &tm)) goto got ; + if (strptime(s, "%a, %d-%b-%y %T GMT", &tm)) goto got ; + if (strptime(s, "%a %b %d %T %Y", &tm)) goto got ; + return (errno = EINVAL, 0) ; + + got: + if (!tai_from_localtm(tain_secp(stamp), &tm)) return 0 ; + stamp->nano = 0 ; + return 1 ; +} -- cgit v1.3.1