info handler, structur of files + some other changes

This commit is contained in:
overflowerror 2017-01-03 01:01:24 +01:00
parent 277a00b1fe
commit fcfc8d69e9
9 changed files with 83 additions and 39 deletions

View file

@ -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

View file

@ -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,

View file

@ -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");

View file

@ -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
View 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
View 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;
}

View file

@ -3,6 +3,6 @@
#include "ws_types.h"
int ws_run_linear(webserver_t*);
srvhandler_t ws_run_linear;
#endif

View file

@ -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);

View file

@ -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;
@ -63,6 +68,7 @@ typedef struct webserver {
int nrhandles;
FILE* logfile;
srvoptions_t options;
} webserver_t;
struct tm* started;
};
#endif