From 8889fd64ec50572de443765232204fbdc031df4c Mon Sep 17 00:00:00 2001 From: overflowerror Date: Sun, 23 May 2021 17:18:53 +0200 Subject: [PATCH] added template response function --- src/request.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/request.h | 2 ++ 2 files changed, 61 insertions(+) diff --git a/src/request.c b/src/request.c index 3a7538b..4718420 100644 --- a/src/request.c +++ b/src/request.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -12,6 +13,7 @@ #include #include +#include #include "request.h" @@ -193,3 +195,60 @@ response_t _jsonResponse(int status, const char* type, void* value) { return response; } + +extern size_t _sizeTemplate(const char*, ...); +extern void _renderTemplate(const char*, FILE*, ...); + +response_t templateResponse(int status, const char* name, ...) { + response_t response = emptyResponse(); + + size_t length; + char* buffer; + + va_list argptr, argptr2; + va_start(argptr, name); + va_copy(argptr2, argptr); + + length = _sizeTemplate(name, argptr); + + va_end(argptr); + + buffer = malloc(length + 1); + if (buffer == NULL) { + va_end(argptr2); + return statusResponse(500, strerror(errno)); + } + + FILE* out = fmemopen(buffer, length + 1, "w"); + if (out == NULL) { + va_end(argptr2); + return statusResponse(500, strerror(errno)); + } + + _renderTemplate(name, out, argptr2); + fclose(out); + + va_end(argptr2); + + buffer[length] = '\0'; + + response.status = status; + response._userData = buffer; + response.output = rawOutputAndFree; + + printf("%s\n", buffer + 100); + printf("%zd - %zd\n", length, strlen(buffer)); + + size_t tmpLength = snprintf(NULL, 0, "%zd", length); + char* tmp = malloc(tmpLength + 1); + if (tmp != NULL) { + snprintf(tmp, tmpLength + 1, "%zd", length); + headers_mod(&response.headers, "Content-Length", tmp); + free(tmp); + } else { + // not a huge deal + // CFloor should be able to deal with a missing content-length header + } + + return response; +} diff --git a/src/request.h b/src/request.h index 0a7de49..0b84d38 100644 --- a/src/request.h +++ b/src/request.h @@ -43,4 +43,6 @@ response_t fileResponse(const char* file); response_t _jsonResponse(int status, const char* type, void* value); #define jsonResponse(s, t, v) _jsonResponse(s, # t, v) +response_t templateResponse(int status, const char* name, ...); + #endif