93 lines
2.2 KiB
C
93 lines
2.2 KiB
C
#define _POSIX_C_SOURCE 199309L
|
|
|
|
#include <time.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <vessel/mem.h>
|
|
#include <vessel/log.h>
|
|
#include <vessel/http.h>
|
|
#include <vessel/sock.h>
|
|
#include <vessel/main.h>
|
|
#include <vessel/stream.h>
|
|
#include <vessel/request.h>
|
|
|
|
#define HW "Hello, World!"
|
|
#define HWL 13
|
|
|
|
static Bool pre_open(SockWorker *w) {
|
|
flog_info(LOG_ALL, "New connection: %d", w->fp.fd);
|
|
return True;
|
|
}
|
|
|
|
static Bool post_open(SockWorker *w) {
|
|
HTTPRequest *r;
|
|
|
|
r = Malloc(sizeof(*r));
|
|
|
|
if (!r)
|
|
return False; /* Server error */
|
|
|
|
if (!HTTPRequest_init(r)) {
|
|
Free(r);
|
|
return False; /* Server error */
|
|
}
|
|
|
|
if (HTTPRequest_read(&w->fp, r) != HTTPRequestParseError_ok) {
|
|
HTTPRequest_destroy(r);
|
|
Free(r);
|
|
return False; /* Bad request :( */
|
|
}
|
|
|
|
Stream_writef(&w->fp,
|
|
"%s 200 OK" HTTP_CRLF "Connection: close" HTTP_CRLF
|
|
"Content-length: %d" HTTP_CRLF HTTP_CRLF "%s",
|
|
r->version,
|
|
HWL + HTTP_CRLF_LENGTH,
|
|
HW HTTP_CRLF);
|
|
Stream_flush(&w->fp);
|
|
|
|
const Bool res = HTTPRequest_destroy(r);
|
|
HTTPRequest_destroy(r);
|
|
return res;
|
|
}
|
|
|
|
int main(void) {
|
|
SockServer s = { 0 };
|
|
SockServerHook hooks[] = HOOKS({ SockServerHookType_post_open, post_open },
|
|
{ SockServerHookType_pre_open, pre_open });
|
|
|
|
s.host = "127.0.0.1";
|
|
s.port = 8080;
|
|
s.lg = LOG_ALL;
|
|
s.threads = 12;
|
|
|
|
srand((unsigned)time(NULL));
|
|
|
|
if (!SockServer_create_generic(&s, False)) {
|
|
log_error(s.lg, "Failed to create a generic TCP server.");
|
|
return 1;
|
|
}
|
|
|
|
if (!SockServer_init(&s, SEC2TO(0.01))) {
|
|
log_error(s.lg, "Failed to create a generic TCP server.");
|
|
SockServer_destroy(&s);
|
|
return 1;
|
|
}
|
|
|
|
if (!SockServer_setup_signals(&s)) {
|
|
log_error(s.lg, "Failed to handle signals for the server.");
|
|
SockServer_destroy(&s);
|
|
return 1;
|
|
}
|
|
|
|
if (!SockServer_start(&s, hooks)) {
|
|
log_error(s.lg, "Failed to start the server.");
|
|
SockServer_destroy(&s);
|
|
return 1;
|
|
}
|
|
|
|
SockServer_destroy(&s);
|
|
|
|
return 0;
|
|
}
|