diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2023-12-20 14:08:25 +0000 |
---|---|---|
committer | Laurent Bercot <ska@appnovation.com> | 2023-12-20 14:08:25 +0000 |
commit | 51d0fdce74aeb23ef28336037b2d35aa4c955cee (patch) | |
tree | 9c178c8e6756ec770b85efd54235cd7c2a97888f /src/tipideed/regular.c | |
parent | d2959364ef8d6bc948474a8facf497788b4e768b (diff) | |
download | tipidee-51d0fdce74aeb23ef28336037b2d35aa4c955cee.tar.xz |
Major refactors; implement ranges
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/tipideed/regular.c')
-rw-r--r-- | src/tipideed/regular.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/tipideed/regular.c b/src/tipideed/regular.c index 67fba35..3d82750 100644 --- a/src/tipideed/regular.c +++ b/src/tipideed/regular.c @@ -22,7 +22,8 @@ int respond_regular (tipidee_rql const *rql, char const *docroot, char const *fn if (rql->m == TIPIDEE_METHOD_HEAD) { tain deadline ; - tipidee_response_file_G(buffer_1, rql, 200, "OK", st, ra->content_type, g.rhdr, g.rhdrn, 2 | !g.cont) ; + tipidee_response_file_G(buffer_1, rql, 200, "OK", st, st->st_size, ra->content_type, g.rhdr, g.rhdrn, 2 | !g.cont) ; + tipidee_response_header_end(buffer_1) ; tipidee_log_answer(g.logv, rql, 200, st->st_size) ; tain_add_g(&deadline, &g.writetto) ; if (!buffer_timed_flush_g(buffer_1, &deadline)) @@ -40,7 +41,8 @@ int respond_regular (tipidee_rql const *rql, char const *docroot, char const *fn } else die500sys(rql, 111, docroot, "open ", fn) ; } - tipidee_response_file_G(buffer_1, rql, 200, "OK", st, ra->content_type, g.rhdr, g.rhdrn, 2 | !g.cont) ; + tipidee_response_file_G(buffer_1, rql, 200, "OK", st, st->st_size, ra->content_type, g.rhdr, g.rhdrn, 2 | !g.cont) ; + tipidee_response_header_end(buffer_1) ; tipidee_log_answer(g.logv, rql, 200, st->st_size) ; send_file(fd, st->st_size, fn) ; fd_close(fd) ; @@ -58,10 +60,30 @@ int respond_304 (tipidee_rql const *rql, char const *fn, struct stat const *st) size_t l = tipidee_response_header_lastmodified(fmt, 128, st) ; if (l) buffer_putnoflush(buffer_1, fmt, l) ; } - buffer_putnoflush(buffer_1, "\r\n", 2) ; + tipidee_response_header_end(buffer_1) ; tipidee_log_answer(g.logv, rql, 304, 0) ; tain_add_g(&deadline, &g.writetto) ; if (!buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; return 0 ; } + +int respond_partial (tipidee_rql const *rql, char const *docroot, char const *fn, struct stat const *st, uint64_t start, uint64_t len, tipidee_resattr const *ra) +{ + int fd = open_read(fn) ; + if (fd == -1) + { + if (errno == EACCES) + { + respond_403(rql, docroot) ; + return 0 ; + } + else die500sys(rql, 111, docroot, "open ", fn) ; + } + tipidee_response_partial_G(buffer_1, rql, st, start, len, ra->content_type, g.rhdr, g.rhdrn, 2 | !g.cont) ; + tipidee_response_header_end(buffer_1) ; + tipidee_log_answer(g.logv, rql, 206, len) ; + send_file_range(fd, start, len, fn) ; + fd_close(fd) ; + return 0 ; +} |