vessel/tests/simple-http-server.c
2025-06-13 17:58:13 +03:00

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