#include #include #include #include "httpd.h" #include "httpd-utils.h" #include "cgi-espfs.h" extern unsigned char espfs_image[]; extern unsigned int espfs_image_len; httpd_thread_handle_t *s_serverHandle = NULL; struct SharedData { int visits; }; static struct SharedData shared = {}; struct RequestData { int counter; }; /** "About" page */ httpd_cgi_state templateReplacer(TplData *td) { struct RequestData *rd; if (!td->conn) { if (td->userData) { httpdPlatFree(td->userData); td->userData = NULL; } return HTTPD_CGI_DONE; } if (!td->userData) { rd = httpdPlatMalloc(sizeof(struct RequestData)); td->userData = rd; rd->counter = 0; shared.visits++; } else { rd = td->userData; } char buf[100]; if (streq(td->token, "visits")) { sprintf(buf, "%d", shared.visits); tplSend(td, buf); } else if (streq(td->token, "html1")) { tplSend(td, "foo"); } else if (streq(td->token, "html2")) { tplSend(td, "bar"); } else if (streq(td->token, "json1")) { tplSend(td, "\"hello\":\"foo'' and backslash\\ \" also crlf \r\n"); } else if (streq(td->token, "multipart")) { if (rd->counter < 100) { sprintf(buf, "HELLO %d, ", rd->counter); tplSend(td, buf); rd->counter++; return HTTPD_CGI_MORE; } tplSend(td, "and that's it."); } else { return HTTPD_CGI_NOTFOUND; } return HTTPD_CGI_DONE; } /** * Application routes */ const HttpdBuiltInUrl routes[] = { // TODO password lock ... // --- Web pages --- // ROUTE_TPL_FILE("/", tplIndex, "/index.tpl"), ROUTE_FILE("/", "index.html"), ROUTE_TPL_FILE("/tpl", templateReplacer, "template.tpl.txt"), ROUTE_FILESYSTEM(), ROUTE_END(), }; void sigpipe_handler(int unused) { } void handle_sigint(int signum) { fprintf(stderr, " SIGINT detected, shutting down HTTPD\n"); httpdShutdown(s_serverHandle); } int main() { struct sigaction action; memset(&action, 0, sizeof(action)); action.sa_handler = handle_sigint; sigaction(SIGINT, &action, NULL); // prevent abort on sigpipe sigaction(SIGPIPE, &(struct sigaction) {{sigpipe_handler}}, NULL); struct httpd_options opts = { .port = 8080, }; s_serverHandle = httpdStart(routes, &opts); httpdSetName("SpriteHTTPD Server Demo"); httpdJoin(s_serverHandle); return 0; } int httpdPlatEspfsRead(void *dest, uint32_t offset, size_t len) { if (offset + len > espfs_image_len) { return -1; } memcpy(dest, &espfs_image[offset], len); return 0; }