diff --git a/Makefile b/Makefile index 7823d27..ef48db8 100644 --- a/Makefile +++ b/Makefile @@ -18,17 +18,18 @@ all: example libserwer.so %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< -example: example.o serwer.o ws_linear.o ws_utils.o help.o +example: example.o serwer.o ws_modes/linear.o ws_handlers/info.o ws_utils.o help.o $(CC) $(LDFLAGS) -o $@ $^ -libserwer.so: serwer.o ws_linear.o ws_utils.o help.o +libserwer.so: serwer.o ws_modes/linear.o ws_handlers/info.o ws_utils.o help.o $(CC) $(LIBFLAGS) -o $@ $^ example.o: example.c serwer.h help.h help.o: help.c help.h serwer.o: serwer.c serwer.h ws_types.h ws_modes.h ws_utils.h help.h ws_utils.o: ws_utils.c ws_utils.h ws_types.h -ws_linear.o: ws_linear.c ws_modes.h ws_types.h serwer.h ws_utils.h +ws_modes/linear.o: ws_modes/linear.c ws_modes.h ws_types.h serwer.h ws_utils.h +ws_handlers/info.o: ws_handlers/info.c ws_handlers.h serwer.h clean: - rm -f *.o example libserwer.so + rm -f *.o ws_modes/*.o example libserwer.so diff --git a/example.c b/example.c index 4b1c2b6..4052864 100644 --- a/example.c +++ b/example.c @@ -1,9 +1,10 @@ #include "serwer.h" +#include "ws_handlers.h" #include "help.h" #include #include -int hello_world(method_t method, const char* host, const char* path, headers_t requestHeaders, +int hello_world(webserver_t server, method_t method, const char* host, const char* path, headers_t requestHeaders, headers_t* responseHeaders, stream_t request, stream_t response) { fprintf(response, "Hello World!\n"); @@ -11,20 +12,6 @@ int hello_world(method_t method, const char* host, const char* path, headers_t r return 200; } -int test(method_t method, const char* host, const char* path, headers_t requestHeaders, - headers_t* responseHeaders, stream_t request, stream_t response) { - - fprintf(response, "Method: %s, URI: %s%s\n", ws_method_string(method), host, path); - fprintf(response, "Request headers:\n"); - for (int i = 0; i < requestHeaders.nrfields; i++) { - header_t header = requestHeaders.fields[i]; - fprintf(response, " %s - %s\n", header.key, header.value); - } - fprintf(response, "\n"); - - return 200; -} - int main(int argc, char** argv) { help_init(NULL, "test"); @@ -35,8 +22,8 @@ int main(int argc, char** argv) { }; handle_t test_handle = { .host = ANY, - .path = "/test", - .handler = &test + .path = "/info", + .handler = &info_handler }; srvoptions_t options = { .mode = LINEAR, diff --git a/serwer.c b/serwer.c index af46c1d..798ad7f 100644 --- a/serwer.c +++ b/serwer.c @@ -14,7 +14,7 @@ #include #include -handler_t ws_handler_find(webserver_t* server, const char* path, const char* host) { +handler_t* ws_handler_find(webserver_t* server, const char* path, const char* host) { for (int i = 0; i < server->nrhandles; i++) { handle_t handle = server->handles[i]; @@ -218,6 +218,10 @@ int ws_run(webserver_t* server) { ws_log(server, LOG_MESSAGE, "server \"%s\" started on %s:%s", server->name, server->host == NULL ? "0.0.0.0" : server->host, server->port); + time_t rawtime; + time(&rawtime); + server->started = localtime(&rawtime); + switch(server->options.mode) { case LINEAR: ws_log(server, LOG_DEBUG, "starting linear handler"); diff --git a/serwer.h b/serwer.h index 65e5333..03b2e56 100644 --- a/serwer.h +++ b/serwer.h @@ -26,7 +26,7 @@ void ws_headers_convert(headers_t*, char*); void ws_headers_free(headers_t*); void ws_handle_add(webserver_t*, handle_t); -handler_t ws_handler_find(webserver_t*, const char*, const char*); +handler_t* ws_handler_find(webserver_t*, const char*, const char*); size_t ws_send(int, int, headers_t, int); void ws_simple_status(int, int); diff --git a/ws_handlers.h b/ws_handlers.h new file mode 100644 index 0000000..c4c442c --- /dev/null +++ b/ws_handlers.h @@ -0,0 +1,6 @@ +#ifndef WS_HANDLERS_H +#define WS_HANDLERS_H + +handler_t info_handler; + +#endif diff --git a/ws_handlers/info.c b/ws_handlers/info.c new file mode 100644 index 0000000..e7c7d0b --- /dev/null +++ b/ws_handlers/info.c @@ -0,0 +1,40 @@ +#include "../serwer.h" +#include "../ws_handlers.h" + +#include + +int info_handler(webserver_t server, method_t method, const char* host, const char* path, headers_t requestHeaders, + headers_t* responseHeaders, stream_t request, stream_t response) { + + fprintf(response, "\n"); + fprintf(response, "Test-Page"); + fprintf(response, "
"); + fprintf(response, "

Info Page for %s

", server.name); + + char buffer[26]; + strftime(buffer, 26, "%Y.%m.%d %H:%M:%S", server.started); + + fprintf(response, "

Server Infos

"); + fprintf(response, "This server is running %s (%s Version %s) on %s:%s since %s.

", server.name, WS_NAME, WS_VERSION, server.host == NULL ? "8.8.8.8" : server.host, server.port, buffer); + fprintf(response, "There are %i handles registered:
    ", server.nrhandles); + for (int i = 0; i < server.nrhandles; i++) { + char* hhost = server.handles[i].host; + char* hpath = server.handles[i].path; + fprintf(response, "
  • %s %s
  • ", hhost == NULL ? "(null)" : hhost, hpath = NULL ? "(null)" : hpath); + } + fprintf(response, "
"); + + fprintf(response, "

Request Infos

"); + fprintf(response, "Method: %s URI: %s%s

", ws_method_string(method), host, path); + fprintf(response, "Request headers:"); + + for (int i = 0; i < requestHeaders.nrfields; i++) { + header_t header = requestHeaders.fields[i]; + fprintf(response, "", header.key, header.value); + } + fprintf(response, "
%s:%s
"); + fprintf(response, "
We are responding with 200."); + fprintf(response, "
"); + + return 200; +} diff --git a/ws_modes.h b/ws_modes.h index ee66256..7a2d4c3 100644 --- a/ws_modes.h +++ b/ws_modes.h @@ -3,6 +3,6 @@ #include "ws_types.h" -int ws_run_linear(webserver_t*); +srvhandler_t ws_run_linear; #endif diff --git a/ws_linear.c b/ws_modes/linear.c similarity index 96% rename from ws_linear.c rename to ws_modes/linear.c index 6f892b1..0e4a1e1 100644 --- a/ws_linear.c +++ b/ws_modes/linear.c @@ -1,4 +1,4 @@ -#include "serwer.h" +#include "../serwer.h" #include #include @@ -92,7 +92,7 @@ int ws_run_linear(webserver_t* server) { // find handler ws_log(server, LOG_TESTING, "find handler"); - handler_t handler = ws_handler_find(server, path, host); + handler_t* handler = ws_handler_find(server, path, host); if (handler == NULL) { // TODO 404 @@ -131,7 +131,7 @@ int ws_run_linear(webserver_t* server) { // handler ws_log(server, LOG_DEBUG, "execute handler"); - int code = (*handler)(method, host, path, headers, &responseHeaders, request, response); + int code = (*handler)(*server, method, host, path, headers, &responseHeaders, request, response); ws_log(server, LOG_TESTING, "handler finished with %i", code); fclose(response); diff --git a/ws_types.h b/ws_types.h index 45398ec..26f367d 100644 --- a/ws_types.h +++ b/ws_types.h @@ -2,6 +2,7 @@ #define WS_TYPES_H #include +#include typedef struct header { const char* key; @@ -30,15 +31,6 @@ typedef enum method { CONNECT } method_t; -typedef int(*handler_t)(method_t method, const char* host, const char* path, headers_t requestHeaders, - headers_t* responseHeaders, stream_t request, stream_t response); - -typedef struct handle { - const char* path; - const char* host; - handler_t handler; -} handle_t; - typedef enum mode { //PRE_FORKED, //POST_FORKED, @@ -54,7 +46,20 @@ typedef struct srvoptions { loglevel_t loglevel; } srvoptions_t; -typedef struct webserver { +typedef struct webserver webserver_t; + +typedef int(handler_t)(webserver_t server, method_t method, const char* host, const char* path, headers_t requestHeaders, + headers_t* responseHeaders, stream_t request, stream_t response); + +typedef int(srvhandler_t)(webserver_t* server); + +typedef struct handle { + const char* path; + const char* host; + handler_t* handler; +} handle_t; + +struct webserver { const char* name; int sfd; const char* host; @@ -62,7 +67,8 @@ typedef struct webserver { handle_t* handles; int nrhandles; FILE* logfile; - srvoptions_t options; -} webserver_t; + srvoptions_t options; + struct tm* started; +}; #endif