added path info

This commit is contained in:
overflowerror 2021-05-04 00:04:24 +02:00
parent 3fa0a1262c
commit 9ab2ac6ecc
2 changed files with 52 additions and 21 deletions

View file

@ -28,13 +28,13 @@ void setDefaultErrorFormat(errorformat_t format) {
errorformat = format; errorformat = format;
} }
void _rawOutputAndFree(FILE* out, void* _userData, ctx_t ctx) { static void rawOutputAndFree(FILE* out, void* _userData, ctx_t ctx) {
fprintf(out, "%s", (char*) _userData); fprintf(out, "%s", (char*) _userData);
free(_userData); free(_userData);
} }
void _rawOutput(FILE* out, void* _userData, ctx_t ctx) { static void rawOutput(FILE* out, void* _userData, ctx_t ctx) {
fprintf(out, "%s", (const char*) _userData); fprintf(out, "%s", (const char*) _userData);
} }
@ -51,9 +51,9 @@ response_t _rawResponse(int status, char* txt, bool free) {
response._userData = (void*) txt; response._userData = (void*) txt;
if (free) { if (free) {
response.output = _rawOutputAndFree; response.output = rawOutputAndFree;
} else { } else {
response.output = _rawOutput; response.output = rawOutput;
} }
return response; return response;
} }
@ -62,38 +62,68 @@ response_t rawResponse(int status, const char* txt) {
return _rawResponse(status, (char*) txt, false); return _rawResponse(status, (char*) txt, false);
} }
response_t errorResponse(int status, const char* message) { struct statusdata {
const char* statusString = getStatusStrings(status).statusString; int status;
const char* message;
};
static void statusOutput(FILE* out, void* _userData, ctx_t ctx) {
struct statusdata* data = (struct statusdata*) _userData;
const char* statusString = getStatusStrings(data->status).statusString;
char* tmp = getTimestamp();
jsonValue_t* json = json_object(true, 5,
"timestamp", json_string(tmp),
"status", json_long(data->status),
"error", json_string(statusString),
"message", json_string(data->message),
"path", json_string(ctx.path)
);
free(data);
free(tmp);
tmp = json_stringify(json);
json_free(json);
fputs(tmp, out);
free(tmp);
}
response_t statusResponse(int status, const char* message) {
if (message == NULL) { if (message == NULL) {
message = ""; message = "";
} }
char* tmp; char* tmp;
const char* statusString;
struct statusdata* data;
switch(errorformat) { switch(errorformat) {
case RAW: case RAW:
statusString = getStatusStrings(status).statusString;
tmp = malloc(strlen(statusString) + 1 + strlen(message) + 1); tmp = malloc(strlen(statusString) + 1 + strlen(message) + 1);
sprintf(tmp, "%s\n%s", statusString, message); sprintf(tmp, "%s\n%s", statusString, message);
return _rawResponse(status, tmp, true); return _rawResponse(status, tmp, true);
case JSON: case JSON:
tmp = getTimestamp(); data = malloc(sizeof(struct statusdata));
jsonValue_t* json = json_object(true, 5, if (data == NULL) {
"timestamp", json_string(tmp), return rawResponse(500, "Internal Server Error\ncouldn't prepare status message");
"status", json_long(status), }
"error", json_string(statusString), data->status = status;
"message", json_string(message), data->message = message;
"path", json_string("not yet implemented")
); response_t response = emptyResponse();
free(tmp); response.status = status;
tmp = json_stringify(json); response._userData = data;
json_free(json); response.output = statusOutput;
return _rawResponse(status, tmp, true);
return response;
default: default:
return rawResponse(500, "Internel Server Error\nunknown error format"); return rawResponse(500, "Internel Server Error\nunknown error format");
} }
} }
response_t errorResponse(int status, const char* message) {
return statusResponse(status, message);
}
void _fileOutput(FILE* out, void* _userData, ctx_t ctx) { static void fileOutput(FILE* out, void* _userData, ctx_t ctx) {
FILE* in = (FILE*) _userData; FILE* in = (FILE*) _userData;
#define READ_BUFFER_SIZE (1024) #define READ_BUFFER_SIZE (1024)
@ -133,7 +163,7 @@ response_t fileResponse(const char* file) {
response.status = 200; response.status = 200;
response._userData = stream; response._userData = stream;
response.output = _fileOutput; response.output = fileOutput;
return response; return response;
} }

View file

@ -33,6 +33,7 @@ void setDefaultErrorFormat(errorformat_t format);
response_t emptyResponse(); response_t emptyResponse();
response_t statusResponse(int status, const char* message);
response_t errorResponse(int status, const char* message); response_t errorResponse(int status, const char* message);
response_t rawResponse(int status, const char* txt); response_t rawResponse(int status, const char* txt);