aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-03-22 06:57:51 +0000
committerLaurent Bercot <ska@appnovation.com>2025-03-22 06:57:51 +0000
commitbfdd8182f9a098d400c83fd43c70cbb2ccc94264 (patch)
tree7f784190087e8dd2ada6f67dfe64e1348c6a114a /src
parent9cd4e0d1902ebb196ebd53ed7ee88e6689d801b7 (diff)
downloadtipidee-bfdd8182f9a098d400c83fd43c70cbb2ccc94264.tar.gz
Implement autochunk
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src')
-rw-r--r--src/tipideed/cgi.c4
-rw-r--r--src/tipideed/stream.c34
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") ;
}