diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ee29d9..8f13d7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ idf_component_register( "src/spifs.c" "src/HTTPServer.c" "src/FileServer.c" + "src/HTTPAPISystem.c" "src/HTTPPrintSystem.c" "src/HTTPPostSystem.c" "src/Helpers.c" @@ -39,7 +40,7 @@ idf_component_register( "src/SNTP.c" "src/MQTT.c" "src/MQTTSysHandler.c" - "src/OTA.c" + src/OTA.c # "src/mDNS.c" INCLUDE_DIRS "." diff --git a/extlibs/libespfs b/extlibs/libespfs index a646e3e..03ff681 160000 --- a/extlibs/libespfs +++ b/extlibs/libespfs @@ -1 +1 @@ -Subproject commit a646e3ee0594ec2301e9b3fe6373ea274eb39e39 +Subproject commit 03ff681a61cb03a43c6f008601a6e6090e9df2bd diff --git a/include/HTTPServer.h b/include/HTTPServer.h index 566d8c6..35d635d 100644 --- a/include/HTTPServer.h +++ b/include/HTTPServer.h @@ -56,7 +56,7 @@ #define SCRATCH_BUFSIZE 4096 #define AUTH_DATA_MAX_LENGTH 16 -#define HTTP_SERVER_DEBUG_LEVEL 0 +#define HTTP_SERVER_DEBUG_LEVEL 1 typedef enum { @@ -64,7 +64,8 @@ typedef enum HTTP_IO_NEED_DATA, // More data needed to continue, call again later HTTP_IO_WAITING, // Waiting for asynchronous process to complete, call again later HTTP_IO_REDIRECT, - HTTP_IO_DONE_NOREFRESH + HTTP_IO_DONE_NOREFRESH, + HTTP_IO_DONE_API } HTTP_IO_RESULT; @@ -89,6 +90,7 @@ typedef struct esp_err_t start_file_server(void); HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostData); int HTTPPrint(httpd_req_t *req, char* buf, char* var); +HTTP_IO_RESULT HTTPPostSysAPI(httpd_req_t *req, char *PostData); esp_err_t download_get_handler(httpd_req_t *req); esp_err_t upload_post_handler(httpd_req_t *req); diff --git a/include/UserCallbacks.h b/include/UserCallbacks.h index 890e4a0..d226021 100644 --- a/include/UserCallbacks.h +++ b/include/UserCallbacks.h @@ -38,5 +38,4 @@ void regHTTPPrintCustom(int (*print_handler)(httpd_req_t *req, char *buf, char * //User handler of variables 'var1=value1&var2=value2' styled in POST requests. void regAfterPostHandlerCustom(HTTP_IO_RESULT (*post_handler)(httpd_req_t *req, const char *filename, char *PostData)); - #endif /* COMPONENTS_WEBGUIAPP_INCLUDE_USERCALLBACKS_H_ */ diff --git a/src/HTTPAPISystem.c b/src/HTTPAPISystem.c new file mode 100644 index 0000000..14d844a --- /dev/null +++ b/src/HTTPAPISystem.c @@ -0,0 +1,56 @@ +/* Copyright 2023 Bogdan Pilyugin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * File name: HTTPAPISystem.c + * Project: webguiapp_ref_implement + * Created on: 2023-06-10 + * Author: bogdan + * Description: + */ + +#include "HTTPServer.h" +#include "jWrite.h" +#include "jRead.h" + +#define API_VER "1.00" + +HTTP_IO_RESULT HTTPPostSysAPI(httpd_req_t *req, char *PostData) +{ + char data[1024]; + httpd_req_get_hdr_value_str(req, "Content-Type", (char*) data, 31); + if (!memcmp(data, "application/json", sizeof("application/json"))) + { + char key[32] = {0}; + struct jReadElement result; + jRead(PostData, "", &result); + if (result.dataType == JREAD_OBJECT) + { + jRead_string(PostData, "{'key'", key, sizeof(key), NULL); + } + + //ESP_LOGI(TAG, "JSON data:%s", PostData); + jwOpen(data, sizeof(data), JW_OBJECT, JW_COMPACT); + jwObj_string("apiver", API_VER); + jwObj_string("key", key);; + jwObj_raw("result", "OK"); + jwEnd(); + jwClose(); + httpd_resp_sendstr(req, data); + return HTTP_IO_DONE_API; + } + + httpd_resp_set_status(req, HTTPD_400); + return HTTP_IO_DONE_API; +} + diff --git a/src/HTTPPostSystem.c b/src/HTTPPostSystem.c index cb04570..8ae82ee 100644 --- a/src/HTTPPostSystem.c +++ b/src/HTTPPostSystem.c @@ -35,6 +35,7 @@ const char url_adapters[] = "adapters.html"; const char url_services[] = "services.html"; const char url_system[] = "system.html"; const char url_reboot[] = "reboot.html"; +const char url_sysapi[] = "sysapi"; static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData); static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, char *PostData); @@ -49,6 +50,7 @@ void regAfterPostHandlerCustom(HTTP_IO_RESULT (*post_handler)(httpd_req_t *req, AfterPostHandlerCust = post_handler; } + HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostData) { const char *pt = filename + 1; @@ -74,6 +76,8 @@ HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostDat break; case HTTP_IO_DONE_NOREFRESH: break; + case HTTP_IO_DONE_API: + break; break; } return res; @@ -81,6 +85,8 @@ HTTP_IO_RESULT HTTPPostApp(httpd_req_t *req, const char *filename, char *PostDat static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, char *PostData) { + if (!memcmp(filename, url_sysapi, sizeof(url_sysapi))) + return HTTPPostSysAPI(req, PostData); if (!memcmp(filename, url_adapters, sizeof(url_adapters))) return HTTPPostAdaptersSettings(req, PostData); if (!memcmp(filename, url_services, sizeof(url_services))) @@ -91,6 +97,7 @@ static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, c if (!memcmp(filename, url_reboot, sizeof(url_reboot))) return HTTPPostReboot(req, PostData); + // If not found target URL here, try to call custom code if (AfterPostHandlerCust != NULL) return AfterPostHandlerCust(req, filename, PostData); @@ -98,6 +105,9 @@ static HTTP_IO_RESULT AfterPostHandler(httpd_req_t *req, const char *filename, c return HTTP_IO_DONE; } + + + static HTTP_IO_RESULT HTTPPostAdaptersSettings(httpd_req_t *req, char *PostData) { char tmp[33]; diff --git a/src/HTTPServer.c b/src/HTTPServer.c index b0a4cd3..0a155aa 100644 --- a/src/HTTPServer.c +++ b/src/HTTPServer.c @@ -220,11 +220,6 @@ static esp_err_t POSTHandler(httpd_req_t *req) req->uri, sizeof(filepath)); - if (!memcmp(filename, "/api", 4)) - { - return RestApiHandler(req); - } - http_res = HTTPPostApp(req, filename, buf); if (http_res == HTTP_IO_DONE) @@ -247,6 +242,11 @@ static esp_err_t POSTHandler(httpd_req_t *req) httpd_resp_send(req, NULL, 0); // Response body can be empty return ESP_OK; } + else if (http_res == HTTP_IO_DONE_API) + { + httpd_resp_send(req, NULL, 0); // Response body can be empty + return ESP_OK; + } }