mirror of
https://github.com/sigmasternchen/Serwer
synced 2025-03-15 07:08:54 +00:00
info handler, structur of files + some other changes
This commit is contained in:
parent
277a00b1fe
commit
fcfc8d69e9
9 changed files with 83 additions and 39 deletions
9
Makefile
9
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
|
||||
|
|
21
example.c
21
example.c
|
@ -1,9 +1,10 @@
|
|||
#include "serwer.h"
|
||||
#include "ws_handlers.h"
|
||||
#include "help.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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,
|
||||
|
|
6
serwer.c
6
serwer.c
|
@ -14,7 +14,7 @@
|
|||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
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");
|
||||
|
|
2
serwer.h
2
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);
|
||||
|
|
6
ws_handlers.h
Normal file
6
ws_handlers.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef WS_HANDLERS_H
|
||||
#define WS_HANDLERS_H
|
||||
|
||||
handler_t info_handler;
|
||||
|
||||
#endif
|
40
ws_handlers/info.c
Normal file
40
ws_handlers/info.c
Normal file
|
@ -0,0 +1,40 @@
|
|||
#include "../serwer.h"
|
||||
#include "../ws_handlers.h"
|
||||
|
||||
#include <time.h>
|
||||
|
||||
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, "<!DOCTYPE html>\n");
|
||||
fprintf(response, "<html></head><title>Test-Page</title><style>* { font-family: Arial; }</style></head><body style=\"margin: 0px; padding: 0px; background-color: #fee\">");
|
||||
fprintf(response, "<div style=\"background-color: #eee; margin: 0 auto; height: 100%%; width: 60%%; border-left: 3px solid black; border-right: 1px solid grey; padding: 10px;\">");
|
||||
fprintf(response, "<h1 style=\"text-align: center\">Info Page for %s</h1>", server.name);
|
||||
|
||||
char buffer[26];
|
||||
strftime(buffer, 26, "%Y.%m.%d %H:%M:%S", server.started);
|
||||
|
||||
fprintf(response, "<h2>Server Infos</h2>");
|
||||
fprintf(response, "This server is running %s (%s Version %s) on %s:%s since %s.</br></br>", 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:<ul>", server.nrhandles);
|
||||
for (int i = 0; i < server.nrhandles; i++) {
|
||||
char* hhost = server.handles[i].host;
|
||||
char* hpath = server.handles[i].path;
|
||||
fprintf(response, "<li>%s %s</li>", hhost == NULL ? "(null)" : hhost, hpath = NULL ? "(null)" : hpath);
|
||||
}
|
||||
fprintf(response, "</ul>");
|
||||
|
||||
fprintf(response, "<h2>Request Infos</h2>");
|
||||
fprintf(response, "Method: %s URI: %s%s</br></br>", ws_method_string(method), host, path);
|
||||
fprintf(response, "Request headers:<table style=\"border: none\">");
|
||||
|
||||
for (int i = 0; i < requestHeaders.nrfields; i++) {
|
||||
header_t header = requestHeaders.fields[i];
|
||||
fprintf(response, "<tr><td style=\"border: none; font-family: \\\"Times New Roman\\\", Times, serif;\">%s:</td><td style=\"font-family: \\\"Times New Roman\\\", Times, serif;\">%s</td>", header.key, header.value);
|
||||
}
|
||||
fprintf(response, "</table>");
|
||||
fprintf(response, "<br />We are responding with 200.");
|
||||
fprintf(response, "</div></body>");
|
||||
|
||||
return 200;
|
||||
}
|
|
@ -3,6 +3,6 @@
|
|||
|
||||
#include "ws_types.h"
|
||||
|
||||
int ws_run_linear(webserver_t*);
|
||||
srvhandler_t ws_run_linear;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#include "serwer.h"
|
||||
#include "../serwer.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -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);
|
30
ws_types.h
30
ws_types.h
|
@ -2,6 +2,7 @@
|
|||
#define WS_TYPES_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue