diff --git a/examples/webui-rest/Makefile b/examples/webui-rest/Makefile new file mode 100644 index 00000000..9addcb99 --- /dev/null +++ b/examples/webui-rest/Makefile @@ -0,0 +1,20 @@ +PROG ?= example +SSL = ? + +ifeq "$(SSL)" "MBEDTLS" +CFLAGS += -DMG_ENABLE_MBEDTLS=1 -lmbedtls -lmbedcrypto -lmbedx509 +endif + +ifeq "$(SSL)" "OPENSSL" +CFLAGS += -DMG_ENABLE_OPENSSL=1 -lssl -lcrypto +endif + +all: $(PROG) + $(DEBUGGER) ./$(PROG) $(ARGS) + + +$(PROG): main.c + $(CC) ../../mongoose.c -I../.. -W -Wall $(CFLAGS) $(EXTRA_CFLAGS) -o $(PROG) main.c + +clean: + rm -rf $(PROG) *.o *.dSYM *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb diff --git a/examples/webui-rest/ca.pem b/examples/webui-rest/ca.pem new file mode 120000 index 00000000..8addd9e2 --- /dev/null +++ b/examples/webui-rest/ca.pem @@ -0,0 +1 @@ +../../test/data/ca.pem \ No newline at end of file diff --git a/examples/webui-rest/main.c b/examples/webui-rest/main.c new file mode 100644 index 00000000..288e9f8a --- /dev/null +++ b/examples/webui-rest/main.c @@ -0,0 +1,48 @@ +// Copyright (c) 2022 Cesanta Software Limited +// All rights reserved +// +// REST basics example +// It implements the following endpoints: +// /api/f1 - respond with a simple mock result +// /api/sum - respond with the result of adding two numbers +// any other URI serves static files from s_root_dir +// Results are JSON strings + +#include "mongoose.h" + +static const char *s_http_addr = "http://localhost:8000"; // HTTP port +static const char *s_root_dir = "web_root"; + +static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { + if (ev == MG_EV_HTTP_MSG) { + struct mg_http_message *hm = (struct mg_http_message *) ev_data; + if (mg_http_match_uri(hm, "/api/f1")) { + mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{%Q:%d}\n", + "result", 123); + } else if (mg_http_match_uri(hm, "/api/sum")) { + // Attempt to fetch a JSON array from the body, hm->body + struct mg_str json = hm->body; + double num1, num2; + if (mg_json_get_num(json, "$[0]", &num1) && + mg_json_get_num(json, "$[1]", &num2)) { + // Success! create a JSON response + mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{%Q:%g}\n", + "result", num1 + num2); + } + } else { + struct mg_http_serve_opts opts = {.root_dir = s_root_dir}; + mg_http_serve_dir(c, ev_data, &opts); + } + } + (void) fn_data; +} + +int main(void) { + struct mg_mgr mgr; // Event manager + mg_log_set("2"); // Set to 3 to enable debug + mg_mgr_init(&mgr); // Initialise event manager + mg_http_listen(&mgr, s_http_addr, fn, NULL); // Create HTTP listener + for (;;) mg_mgr_poll(&mgr, 1000); // Infinite event loop + mg_mgr_free(&mgr); + return 0; +} diff --git a/examples/webui-rest/web_root/index.html b/examples/webui-rest/web_root/index.html new file mode 100644 index 00000000..90ea4728 --- /dev/null +++ b/examples/webui-rest/web_root/index.html @@ -0,0 +1,38 @@ + + +
+