mongoose/examples/http-server/main.c

104 lines
3.4 KiB
C
Raw Normal View History

2020-12-05 19:26:32 +08:00
// Copyright (c) 2020 Cesanta Software Limited
// All rights reserved
#include <signal.h>
2020-12-05 19:26:32 +08:00
#include "mongoose.h"
2022-08-01 18:19:32 +08:00
static int s_debug_level = MG_LL_INFO;
2022-02-11 01:11:03 +08:00
static const char *s_root_dir = ".";
2022-01-23 01:03:27 +08:00
static const char *s_listening_address = "http://0.0.0.0:8000";
2020-12-05 19:26:32 +08:00
static const char *s_enable_hexdump = "no";
2021-12-21 00:35:16 +08:00
static const char *s_ssi_pattern = "#.html";
2020-12-05 19:26:32 +08:00
// Handle interrupts, like Ctrl-C
static int s_signo;
static void signal_handler(int signo) {
s_signo = signo;
}
// Event handler for the listening connection.
// Simply serve static files from `s_root_dir`
2020-12-05 19:26:32 +08:00
static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
if (ev == MG_EV_HTTP_MSG) {
2022-03-15 18:03:00 +08:00
struct mg_http_message *hm = ev_data, tmp = {0};
2021-12-25 04:46:31 +08:00
struct mg_str unknown = mg_str_n("?", 1), *cl;
2021-11-23 21:24:21 +08:00
struct mg_http_serve_opts opts = {0};
opts.root_dir = s_root_dir;
2021-12-21 00:35:16 +08:00
opts.ssi_pattern = s_ssi_pattern;
2021-12-25 04:46:31 +08:00
mg_http_serve_dir(c, hm, &opts);
mg_http_parse((char *) c->send.buf, c->send.len, &tmp);
cl = mg_http_get_header(&tmp, "Content-Length");
if (cl == NULL) cl = &unknown;
MG_INFO(("%.*s %.*s %.*s %.*s", (int) hm->method.len, hm->method.ptr,
(int) hm->uri.len, hm->uri.ptr, (int) tmp.uri.len, tmp.uri.ptr,
(int) cl->len, cl->ptr));
2020-12-05 19:26:32 +08:00
}
(void) fn_data;
}
static void usage(const char *prog) {
fprintf(stderr,
2021-07-14 11:00:27 +08:00
"Mongoose v.%s\n"
"Usage: %s OPTIONS\n"
2020-12-05 19:26:32 +08:00
" -H yes|no - enable traffic hexdump, default: '%s'\n"
2021-12-21 00:35:16 +08:00
" -S PAT - SSI filename pattern, default: '%s'\n"
2020-12-05 19:26:32 +08:00
" -d DIR - directory to serve, default: '%s'\n"
2021-01-25 18:35:14 +08:00
" -l ADDR - listening address, default: '%s'\n"
2022-08-01 18:19:32 +08:00
" -v LEVEL - debug level, from 0 to 4, default: %d\n",
2021-12-21 00:35:16 +08:00
MG_VERSION, prog, s_enable_hexdump, s_ssi_pattern, s_root_dir,
s_listening_address, s_debug_level);
2020-12-05 19:26:32 +08:00
exit(EXIT_FAILURE);
}
2021-01-19 22:21:50 +08:00
int main(int argc, char *argv[]) {
char path[MG_PATH_MAX] = ".";
2021-01-19 22:21:50 +08:00
struct mg_mgr mgr;
2020-12-05 19:26:32 +08:00
struct mg_connection *c;
int i;
2021-01-19 22:21:50 +08:00
// Parse command-line flags
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-d") == 0) {
s_root_dir = argv[++i];
2021-01-19 22:21:50 +08:00
} else if (strcmp(argv[i], "-H") == 0) {
s_enable_hexdump = argv[++i];
2021-12-21 00:35:16 +08:00
} else if (strcmp(argv[i], "-S") == 0) {
s_ssi_pattern = argv[++i];
2021-01-19 22:21:50 +08:00
} else if (strcmp(argv[i], "-l") == 0) {
s_listening_address = argv[++i];
2021-01-25 18:35:14 +08:00
} else if (strcmp(argv[i], "-v") == 0) {
2022-08-01 18:19:32 +08:00
s_debug_level = atoi(argv[++i]);
2021-01-19 22:21:50 +08:00
} else {
usage(argv[0]);
}
}
2020-12-05 19:26:32 +08:00
// Root directory must not contain double dots. Make it absolute
// Do the conversion only if the root dir spec does not contain overrides
if (strchr(s_root_dir, ',') == NULL) {
realpath(s_root_dir, path);
s_root_dir = path;
}
2020-12-05 19:26:32 +08:00
// Initialise stuff
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
2020-12-05 19:26:32 +08:00
mg_log_set(s_debug_level);
2021-01-19 22:21:50 +08:00
mg_mgr_init(&mgr);
if ((c = mg_http_listen(&mgr, s_listening_address, cb, &mgr)) == NULL) {
MG_ERROR(("Cannot listen on %s. Use http://ADDR:PORT or :PORT",
s_listening_address));
2020-12-05 19:26:32 +08:00
exit(EXIT_FAILURE);
}
if (mg_casecmp(s_enable_hexdump, "yes") == 0) c->is_hexdumping = 1;
2021-01-19 22:21:50 +08:00
// Start infinite event loop
MG_INFO(("Mongoose version : v%s", MG_VERSION));
MG_INFO(("Listening on : %s", s_listening_address));
MG_INFO(("Web root : [%s]", s_root_dir));
while (s_signo == 0) mg_mgr_poll(&mgr, 1000);
2021-01-19 22:21:50 +08:00
mg_mgr_free(&mgr);
MG_INFO(("Exiting on signal %d", s_signo));
2020-12-05 19:26:32 +08:00
return 0;
}