diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-03-22 06:57:51 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-03-22 06:57:51 +0000 |
| commit | bfdd8182f9a098d400c83fd43c70cbb2ccc94264 (patch) | |
| tree | 7f784190087e8dd2ada6f67dfe64e1348c6a114a /src | |
| parent | 9cd4e0d1902ebb196ebd53ed7ee88e6689d801b7 (diff) | |
| download | tipidee-bfdd8182f9a098d400c83fd43c70cbb2ccc94264.tar.gz | |
Implement autochunk
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/tipideed/cgi.c | 4 | ||||
| -rw-r--r-- | src/tipideed/stream.c | 34 |
2 files changed, 35 insertions, 3 deletions
diff --git a/src/tipideed/cgi.c b/src/tipideed/cgi.c index fbf08c7..7954ac9 100644 --- a/src/tipideed/cgi.c +++ b/src/tipideed/cgi.c @@ -184,7 +184,7 @@ static inline int do_cgi (tipidee_rql *rql, char const *docroot, char const *con int r ; tipidee_headers hdr ; char hdrbuf[4096] ; - char buf[4096] ; + char buf[BUFFER_OUTSIZE - 16] ; /* leave room for chunk encoding */ iopause_fd x[2] = { { .events = IOPAUSE_READ }, { .events = IOPAUSE_WRITE } } ; size_t bodyw = 0 ; tain deadline ; @@ -205,7 +205,7 @@ static inline int do_cgi (tipidee_rql *rql, char const *docroot, char const *con close(x[1].fd) ; x[1].fd = -1 ; } - buffer_init(&b, &buffer_read, x[0].fd, buf, 4096) ; + buffer_init(&b, &buffer_read, x[0].fd, buf, BUFFER_OUTSIZE - 16) ; tain_add_g(&deadline, &g.cgitto) ; for (;;) diff --git a/src/tipideed/stream.c b/src/tipideed/stream.c index 7323c93..c391631 100644 --- a/src/tipideed/stream.c +++ b/src/tipideed/stream.c @@ -117,6 +117,7 @@ void stream_infinite (int fd, char const *fn) r = timed_readv_g(fd, v, 2, &deadline) ; if (r == -1) strerr_diefu2sys(111, "read from resource ", fn) ; if (!r) break ; + buffer_wseek(buffer_1, r) ; tain_add_g(&deadline, &g.writetto) ; if (!buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; @@ -125,9 +126,40 @@ void stream_infinite (int fd, char const *fn) #endif - +#include <skalibs/types.h> #include <skalibs/buffer.h> void stream_autochunk (buffer *b, char const *fn) { + tain deadline ; + struct iovec v[2] ; + size_t len, w ; + char fmt[SIZE_XFMT] ; + + for (;;) + { + ssize_t r = buffer_len(b) ; + if (!r) + { + tain_add_g(&deadline, &g.cgitto) ; + r = buffer_timed_fill_g(b, &deadline) ; + if (r == -1) strerr_diefu2sys(111, "read from resource ", fn) ; + if (!r) break ; + } + + tain_add_g(&deadline, &g.writetto) ; + len = size_xfmt(fmt, r) ; + if (buffer_timed_put_g(buffer_1, fmt, len, &deadline) < r + || buffer_timed_put_g(buffer_1, "\r\n", 2, &deadline) < 2) strerr_diefu1sys(111, "write to stdout") ; + buffer_wpeek(b, v) ; + w = buffer_timed_putv_g(buffer_1, v, 2, &deadline) ; + buffer_wseek(b, w) ; + if (w < r + || buffer_timed_put_g(buffer_1, "\r\n", 2, &deadline) < 2 + || !buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; + } + + tain_add_g(&deadline, &g.writetto) ; + if (buffer_timed_put_g(buffer_1, "0\r\n\r\n", 5, &deadline) < 5 + || !buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; } |
