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
|
%.o: %.c
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
$(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 $@ $^
|
$(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 $@ $^
|
$(CC) $(LIBFLAGS) -o $@ $^
|
||||||
|
|
||||||
example.o: example.c serwer.h help.h
|
example.o: example.c serwer.h help.h
|
||||||
help.o: help.c 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
|
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_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:
|
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 "serwer.h"
|
||||||
|
#include "ws_handlers.h"
|
||||||
#include "help.h"
|
#include "help.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.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) {
|
headers_t* responseHeaders, stream_t request, stream_t response) {
|
||||||
|
|
||||||
fprintf(response, "Hello World!\n");
|
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;
|
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) {
|
int main(int argc, char** argv) {
|
||||||
help_init(NULL, "test");
|
help_init(NULL, "test");
|
||||||
|
|
||||||
|
@ -35,8 +22,8 @@ int main(int argc, char** argv) {
|
||||||
};
|
};
|
||||||
handle_t test_handle = {
|
handle_t test_handle = {
|
||||||
.host = ANY,
|
.host = ANY,
|
||||||
.path = "/test",
|
.path = "/info",
|
||||||
.handler = &test
|
.handler = &info_handler
|
||||||
};
|
};
|
||||||
srvoptions_t options = {
|
srvoptions_t options = {
|
||||||
.mode = LINEAR,
|
.mode = LINEAR,
|
||||||
|
|
6
serwer.c
6
serwer.c
|
@ -14,7 +14,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <time.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++) {
|
for (int i = 0; i < server->nrhandles; i++) {
|
||||||
handle_t handle = server->handles[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,
|
ws_log(server, LOG_MESSAGE, "server \"%s\" started on %s:%s", server->name,
|
||||||
server->host == NULL ? "0.0.0.0" : server->host, server->port);
|
server->host == NULL ? "0.0.0.0" : server->host, server->port);
|
||||||
|
|
||||||
|
time_t rawtime;
|
||||||
|
time(&rawtime);
|
||||||
|
server->started = localtime(&rawtime);
|
||||||
|
|
||||||
switch(server->options.mode) {
|
switch(server->options.mode) {
|
||||||
case LINEAR:
|
case LINEAR:
|
||||||
ws_log(server, LOG_DEBUG, "starting linear handler");
|
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_headers_free(headers_t*);
|
||||||
|
|
||||||
void ws_handle_add(webserver_t*, handle_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);
|
size_t ws_send(int, int, headers_t, int);
|
||||||
void ws_simple_status(int, 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"
|
#include "ws_types.h"
|
||||||
|
|
||||||
int ws_run_linear(webserver_t*);
|
srvhandler_t ws_run_linear;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "serwer.h"
|
#include "../serwer.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -92,7 +92,7 @@ int ws_run_linear(webserver_t* server) {
|
||||||
|
|
||||||
// find handler
|
// find handler
|
||||||
ws_log(server, LOG_TESTING, "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) {
|
if (handler == NULL) {
|
||||||
// TODO 404
|
// TODO 404
|
||||||
|
@ -131,7 +131,7 @@ int ws_run_linear(webserver_t* server) {
|
||||||
|
|
||||||
// handler
|
// handler
|
||||||
ws_log(server, LOG_DEBUG, "execute 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);
|
ws_log(server, LOG_TESTING, "handler finished with %i", code);
|
||||||
|
|
||||||
fclose(response);
|
fclose(response);
|
30
ws_types.h
30
ws_types.h
|
@ -2,6 +2,7 @@
|
||||||
#define WS_TYPES_H
|
#define WS_TYPES_H
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
typedef struct header {
|
typedef struct header {
|
||||||
const char* key;
|
const char* key;
|
||||||
|
@ -30,15 +31,6 @@ typedef enum method {
|
||||||
CONNECT
|
CONNECT
|
||||||
} method_t;
|
} 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 {
|
typedef enum mode {
|
||||||
//PRE_FORKED,
|
//PRE_FORKED,
|
||||||
//POST_FORKED,
|
//POST_FORKED,
|
||||||
|
@ -54,7 +46,20 @@ typedef struct srvoptions {
|
||||||
loglevel_t loglevel;
|
loglevel_t loglevel;
|
||||||
} srvoptions_t;
|
} 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;
|
const char* name;
|
||||||
int sfd;
|
int sfd;
|
||||||
const char* host;
|
const char* host;
|
||||||
|
@ -62,7 +67,8 @@ typedef struct webserver {
|
||||||
handle_t* handles;
|
handle_t* handles;
|
||||||
int nrhandles;
|
int nrhandles;
|
||||||
FILE* logfile;
|
FILE* logfile;
|
||||||
srvoptions_t options;
|
srvoptions_t options;
|
||||||
} webserver_t;
|
struct tm* started;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue