#define MODULE "httpd" #include "common.h" #include "fw.h" #include "httpd.h" static httpd_handle_t httpd; esp_err_t httpd_firmware_upgrade_handler(httpd_req_t *req) { char *response; esp_err_t err; int rv, len; printf("[POST] len = %zu uri = \"%s\"\n", req->content_len, req->uri); if (!req->content_len) { return httpd_resp_send_err(req, 411, NULL); } rv = firmware_update((read_func_t)httpd_req_recv, (token_t)req); if (rv == FWUPDATE_ERR_IN_PROGRESS) return httpd_resp_send_err(req, 409, "Firmware update already in progress"); else if (rv) return httpd_resp_send_err(req, 500, "Firmware update failed"); len = asprintf(&response, "\r\n" "\r\n" "
\r\n" "Rebooting in %u seconds
\r\n" "\r\n" "\r\n", reboot_delayed()); /* 200 and text/html are the response defaults, no need to set */ err = httpd_resp_send(req, response, len); free(response); return err; } static esp_err_t httpd_get_handler(httpd_req_t *req) { char *response; int len; esp_err_t err; len = asprintf(&response, "\n" "\n" "\n" "Hello, World!
\n" "GET uri = %s
\n" "\n" "\n" "\n", req->uri); /* 200 and text/html are the response defaults, no need to set */ err = httpd_resp_send(req, response, len); free(response); return err; } static const httpd_uri_t uri_get = { .uri = "/", .method = HTTP_GET, .handler = httpd_get_handler, .user_ctx = NULL }; static const httpd_uri_t uri_firmware_upgrade = { .uri = "/firmware-upgrade", .method = HTTP_POST, .handler = httpd_firmware_upgrade_handler, .user_ctx = NULL }; void my_httpd_stop(void) { if (httpd) { esp_unregister_shutdown_handler(my_httpd_stop); httpd_stop(httpd); httpd = NULL; } } void my_httpd_start(void) { httpd_config_t config = HTTPD_DEFAULT_CONFIG(); httpd_handle_t server; if (httpd) return; config.task_priority = 2; printf("[HTTP] Default stack size: %zu\n", config.stack_size); config.stack_size <<= 2; printf("[HTTP] Requesting stack size: %zu\n", config.stack_size); if (httpd_start(&server, &config) != ESP_OK) return; httpd = server; httpd_register_uri_handler(httpd, &uri_get); httpd_register_uri_handler(httpd, &uri_firmware_upgrade); esp_register_shutdown_handler(my_httpd_stop); printf("[HTTP] httpd started\n"); }