/* ISC license. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "tipideed-internal.h" int respond_regular (tipidee_rql const *rql, char const *fn, struct stat const *st, tipidee_resattr const *ra) { tain deadline ; char fmt[128] ; size_t n = tipidee_response_status_line(buffer_1, rql, "200 OK") ; n += tipidee_response_header_common_put_g(buffer_1, !g.cont) ; { size_t l = tipidee_response_header_lastmodified(fmt, 128, st) ; if (l) n += buffer_putnoflush(buffer_1, fmt, l) ; } n += buffer_putsnoflush(buffer_1, "Content-Type: ") ; n += buffer_putsnoflush(buffer_1, ra->content_type) ; n += buffer_putsnoflush(buffer_1, "\r\nContent-Length: ") ; fmt[uint64_fmt(fmt, st->st_size)] = 0 ; n += buffer_putsnoflush(buffer_1, fmt) ; n += buffer_putnoflush(buffer_1, "\r\n\r\n", 4) ; log_regular(fn, fmt, rql->m == TIPIDEE_METHOD_HEAD, ra->content_type) ; if (rql->m == TIPIDEE_METHOD_HEAD) { tain_add_g(&deadline, &g.writetto) ; if (!buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; } else { int fd = open_read(fn) ; if (fd == -1) { buffer_unput(buffer_1, n) ; if (errno == EACCES) { respond_403(rql) ; return 0 ; } else die500sys(rql, 111, "open ", fn) ; } send_file(fd, st->st_size, fn) ; fd_close(fd) ; } return 0 ; } int respond_304 (tipidee_rql const *rql, char const *fn, struct stat const *st) { tain deadline ; char fmt[128] ; size_t n = tipidee_response_status_line(buffer_1, rql, "304 Not Modified") ; n += tipidee_response_header_common_put_g(buffer_1, !g.cont) ; { size_t l = tipidee_response_header_lastmodified(fmt, 128, st) ; if (l) n += buffer_putnoflush(buffer_1, fmt, l) ; } n += buffer_putnoflush(buffer_1, "\r\n", 2) ; log_response("304", fn) ; tain_add_g(&deadline, &g.writetto) ; if (!buffer_timed_flush_g(buffer_1, &deadline)) strerr_diefu1sys(111, "write to stdout") ; return 0 ; }