From 17c382d1c9d7236c101418060758d2296cc5e17e Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Sat, 5 Aug 2023 11:51:25 +0000 Subject: Initial commit Signed-off-by: Laurent Bercot --- src/tipideed/responses.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/tipideed/responses.c (limited to 'src/tipideed/responses.c') diff --git a/src/tipideed/responses.c b/src/tipideed/responses.c new file mode 100644 index 0000000..02109b3 --- /dev/null +++ b/src/tipideed/responses.c @@ -0,0 +1,64 @@ +/* ISC license. */ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "tipideed-internal.h" + +void response_error (tipidee_rql const *rql, char const *rsl, char const *text, int doclose) +{ + tain deadline ; + tipidee_response_error(buffer_1, rql, rsl, text, doclose || !g.cont) ; + tain_add_g(&deadline, &g.writetto) ; + if (!buffer_timed_flush_g(buffer_1, &deadline)) + strerr_diefu1sys(111, "write to stdout") ; +} + +void response_error_and_exit (tipidee_rql const *rql, char const *rsl, char const *text) +{ + response_error(rql, rsl, text, 1) ; + log_and_exit(0) ; +} + +void response_error_and_die (tipidee_rql const *rql, int e, char const *rsl, char const *text, char const *const *v, unsigned int n, int dosys) +{ + response_error(rql, rsl, text, 1) ; + if (dosys) strerr_dievsys(e, v, n) ; + else strerr_diev(e, v, n) ; +} + +void exit_405 (tipidee_rql const *rql, uint32_t options) +{ + tain deadline ; + tipidee_response_status_line(buffer_1, rql, "405 Method Not Allowed") ; + tipidee_response_header_common_put_g(buffer_1, 1) ; + buffer_putsnoflush(buffer_1, "Allow: GET, HEAD") ; + if (options & 1) buffer_putsnoflush(buffer_1, ", POST") ; + buffer_putnoflush(buffer_1, "\r\n\r\n", 4) ; + tain_add_g(&deadline, &g.writetto) ; + if (!buffer_timed_flush_g(buffer_1, &deadline)) + strerr_diefu1sys(111, "write to stdout") ; + log_and_exit(0) ; +} + +void respond_30x (tipidee_rql const *rql, tipidee_redirection const *rd) +{ + static char const *rsl[4] = { "307 Temporary Redirect", "308 Permanent Redirect", "302 Found", "301 Moved Permanently" } ; + tain deadline ; + tipidee_response_status_line(buffer_1, rql, rsl[rd->type]) ; + tipidee_response_header_common_put_g(buffer_1, 0) ; + buffer_putsnoflush(buffer_1, "Location: ") ; + buffer_putsnoflush(buffer_1, rd->location) ; + if (rd->sub) buffer_putsnoflush(buffer_1, rd->sub) ; + buffer_putnoflush(buffer_1, "\r\n\r\n", 4) ; + tain_add_g(&deadline, &g.writetto) ; + if (!buffer_timed_flush_g(buffer_1, &deadline)) + strerr_diefu1sys(111, "write to stdout") ; +} -- cgit v1.2.3