From 59f20f9218e83230955e2a64e245d5218f67155c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Tue, 16 Nov 2021 16:49:59 +0100 Subject: [PATCH] Add support request method, request headers, request body, response headers --- src/asynchttprequest.cpp | 26 ++++++++++++++++++++++++-- src/asynchttprequest.h | 14 +++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/asynchttprequest.cpp b/src/asynchttprequest.cpp index e10136a..4daae5d 100644 --- a/src/asynchttprequest.cpp +++ b/src/asynchttprequest.cpp @@ -58,7 +58,7 @@ tl::expected AsyncHttpRequest::startTask() m_eventGroup.clearBits(TASK_RUNNING | START_REQUEST_BIT | REQUEST_RUNNING_BIT | REQUEST_FINISHED_BIT | END_TASK_BIT | TASK_ENDED); - const auto result = espcpputils::createTask(requestTask, m_taskName, 2048, this, 10, &m_taskHandle, m_coreAffinity); + const auto result = espcpputils::createTask(requestTask, m_taskName, 3096, this, 10, &m_taskHandle, m_coreAffinity); if (result != pdPASS) { auto msg = fmt::format("failed creating http task {}", result); @@ -167,7 +167,10 @@ tl::expected AsyncHttpRequest::deleteClient() return {}; } -tl::expected AsyncHttpRequest::start(std::string_view url) +tl::expected AsyncHttpRequest::start(std::string_view url, + esp_http_client_method_t method, + const std::map &requestHeaders, + std::string_view requestBody) { if (!m_taskHandle) { @@ -195,6 +198,23 @@ tl::expected AsyncHttpRequest::start(std::string_view url) return tl::make_unexpected(fmt::format("m_client.set_url() failed: {} ({})", esp_err_to_name(result), url)); } + if (const auto result = m_client.set_method(method); result != ESP_OK) + return tl::make_unexpected(fmt::format("m_client.set_method() failed: {}", esp_err_to_name(result))); + + for (auto iter = std::cbegin(requestHeaders); iter != std::cend(requestHeaders); iter++) + if (const auto result = m_client.set_header(iter->first, iter->second); result != ESP_OK) + return tl::make_unexpected(fmt::format("m_client.set_header() failed: {} ({} {})", esp_err_to_name(result), iter->first, iter->second)); + + if (!requestBody.empty()) + { + if (const auto result = m_client.open(requestBody.size()); result != ESP_OK) + return tl::make_unexpected(fmt::format("m_client.open() failed: {} ({})", esp_err_to_name(result), requestBody.size())); + if (const auto written = m_client.write(requestBody); written < 0) + return tl::make_unexpected(fmt::format("m_client.write() failed: {}", written)); + else if (written != requestBody.size()) + return tl::make_unexpected(fmt::format("m_client.write() written size mismatch: {} != {}", written, requestBody.size())); + } + m_buf.clear(); clearFinished(); @@ -250,6 +270,8 @@ esp_err_t AsyncHttpRequest::httpEventHandler(esp_http_client_event_t *evt) case HTTP_EVENT_ON_HEADER: if (evt->header_key && evt->header_value) { + if (m_collectResponseHeaders) + m_responseHeaders.emplace(std::make_pair(evt->header_key, evt->header_value)); if (strcasecmp(evt->header_key, "Content-Length") == 0) { unsigned int size; diff --git a/src/asynchttprequest.h b/src/asynchttprequest.h index b18c668..d456bf2 100644 --- a/src/asynchttprequest.h +++ b/src/asynchttprequest.h @@ -3,6 +3,7 @@ // system includes #include #include +#include // esp-idf includes #include @@ -29,7 +30,10 @@ public: tl::expected createClient(std::string_view url); tl::expected deleteClient(); - tl::expected start(std::string_view url); + tl::expected start(std::string_view url, + esp_http_client_method_t method = HTTP_METHOD_GET, + const std::map &requestHeaders = {}, + std::string_view requestBody = {}); bool inProgress() const; @@ -46,6 +50,12 @@ public: std::size_t sizeLimit() const { return m_sizeLimit; } void setSizeLimit(std::size_t sizeLimit) { m_sizeLimit = sizeLimit; } + bool collectResponseHeaders() const { return m_collectResponseHeaders; } + void setCollectResponseHeaders(bool collectResponseHeaders) { m_collectResponseHeaders = collectResponseHeaders; } + + const std::map &responseHeaders() const { return m_responseHeaders; } + std::map &&takeResponseHeaders() { return std::move(m_responseHeaders); } + private: esp_err_t httpEventHandler(esp_http_client_event_t *evt); static esp_err_t staticHttpEventHandler(esp_http_client_event_t *evt); @@ -59,6 +69,8 @@ private: esp_err_t m_result{}; int m_statusCode{}; std::size_t m_sizeLimit{4096}; + bool m_collectResponseHeaders{}; + std::map m_responseHeaders; const char * const m_taskName; const espcpputils::CoreAffinity m_coreAffinity;