From fb4ffea4161c3ac88eeb43bc886fab63dfdc3891 Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 23 May 2022 15:27:49 +0200 Subject: feat(minion): add response headers --- minion/src/gymnasiearbete.cpp | 19 ++++++++++++++++--- minion/src/wifi_module.cpp | 27 +++++++++++++++++++++++---- minion/src/wifi_module.hpp | 4 +++- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/minion/src/gymnasiearbete.cpp b/minion/src/gymnasiearbete.cpp index a7f1e31..5c4f725 100644 --- a/minion/src/gymnasiearbete.cpp +++ b/minion/src/gymnasiearbete.cpp @@ -116,6 +116,12 @@ void loop() const auto temperature_sensor_status = temperature_sensor.read_temperature(); + const char *response_headers[] = { "Access-Control-Allow-Origin: *", + "Content-Type: application/json" }; + + const auto response_header_cnt = + sizeof(response_headers) / sizeof(response_headers[0]); + if (temperature_sensor_status != TemperatureSensorStatus::OK) { Serial.print("Error: "); @@ -124,6 +130,8 @@ void loop() wifi_module.send_response( connection, HTTP_RESPONSE_STATUS_INTERNAL_SERVER_ERROR, + response_headers, + response_header_cnt, R"({"error": "Internal server error"})" ); @@ -137,14 +145,19 @@ void loop() snprintf( response_data, RESPONSE_DATA_MAX_LENGTH, - "{ %s: { %s: %u } }", + "{ %s: { %s: %u} }", R"("data")", R"("temperature")", temperature_sensor.temperature() ); - const auto send_response_ok = - wifi_module.send_response(connection, HTTP_RESPONSE_STATUS_OK, response_data); + const auto send_response_ok = wifi_module.send_response( + connection, + HTTP_RESPONSE_STATUS_OK, + response_headers, + response_header_cnt, + response_data + ); if (!send_response_ok) { diff --git a/minion/src/wifi_module.cpp b/minion/src/wifi_module.cpp index d377bd8..6c989f9 100644 --- a/minion/src/wifi_module.cpp +++ b/minion/src/wifi_module.cpp @@ -332,13 +332,23 @@ auto WiFiModule::close_connection(NetworkConnection &connection) noexcept -> boo auto WiFiModule::send_response( const NetworkConnection &connection, size_t status_code, - const char *data + const char **headers, + size_t headers_cnt, + const char *body ) noexcept -> bool { const auto *cmd = "AT+CIPSEND"; + auto tot_headers_lengths = 0U; + + for (size_t index = 0U; index < headers_cnt; index++) + { + tot_headers_lengths += strlen(headers[index]) + 2U; + } + const auto data_length = strlen(RESPONSE_HTTP_VERSION) + 1 + - RESPONSE_STATUS_CODE_LENGTH + 4 + strlen(data); + RESPONSE_STATUS_CODE_LENGTH + 4 + strlen(body) + + tot_headers_lengths; auto command_length = SEND_RESPONSE_COMMAND_BASE_LENGTH + strlen(cmd) + data_length; @@ -363,8 +373,17 @@ auto WiFiModule::send_response( _serial.print(RESPONSE_HTTP_VERSION); _serial.print(" "); _serial.print(status_code); - _serial.print("\r\n\r\n"); - _serial.print(data); + _serial.print("\r\n"); + + // Print headers + for (size_t index = 0U; index < headers_cnt; index++) + { + _serial.print(headers[index]); + _serial.print("\r\n"); + } + + _serial.print("\r\n"); + _serial.print(body); strcpy(response, ""); diff --git a/minion/src/wifi_module.hpp b/minion/src/wifi_module.hpp index 51e90f0..963a1de 100644 --- a/minion/src/wifi_module.hpp +++ b/minion/src/wifi_module.hpp @@ -108,7 +108,9 @@ public: auto send_response( const NetworkConnection &connection, size_t status_code, - const char *data + const char **headers, + size_t headers_cnt, + const char *body ) noexcept -> bool; private: -- cgit v1.2.3-18-g5258