diff --git a/src/asynchttprequest.cpp b/src/asynchttprequest.cpp index e5306d4..a809432 100644 --- a/src/asynchttprequest.cpp +++ b/src/asynchttprequest.cpp @@ -207,7 +207,7 @@ bool AsyncHttpRequest::hasClient() const std::expected AsyncHttpRequest::start(std::string_view url, esp_http_client_method_t method, const std::map &requestHeaders, - std::string_view requestBody, int timeout_ms, + std::string &&requestBody, int timeout_ms, const std::optional &clientAuth) { if (!m_taskHandle) @@ -232,6 +232,15 @@ std::expected AsyncHttpRequest::start(std::string_view url, if (auto result = createClient(url, method, timeout_ms, clientAuth); !result) return std::unexpected(std::move(result).error()); + m_requestBody = std::move(requestBody); + if (!m_requestBody.empty()) + if (const auto result = m_client.set_post_field(m_requestBody); result != ESP_OK) + { + auto msg = fmt::format("m_client.set_post_field() failed with {}", esp_err_to_name(result)); + ESP_LOGE(TAG, "%.*s", msg.size(), msg.data()); + return std::unexpected(std::move(msg)); + } + 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) { @@ -240,27 +249,6 @@ std::expected AsyncHttpRequest::start(std::string_view url, return std::unexpected(std::move(msg)); } - if (!requestBody.empty()) - { - if (const auto result = m_client.open(requestBody.size()); result != ESP_OK) - { - auto msg = fmt::format("m_client.open() failed: {} ({})", esp_err_to_name(result), requestBody.size()); - ESP_LOGW(TAG, "%.*s", msg.size(), msg.data()); - return std::unexpected(std::move(msg)); - } - if (const auto written = m_client.write(requestBody); written < 0) - { - auto msg = fmt::format("m_client.write() failed: {}", written); - ESP_LOGW(TAG, "%.*s", msg.size(), msg.data()); - return std::unexpected(std::move(msg)); - } - else if (written != requestBody.size()) - { - auto msg = fmt::format("m_client.write() written size mismatch: {} != {}", written, requestBody.size()); - ESP_LOGW(TAG, "%.*s", msg.size(), msg.data()); - return std::unexpected(std::move(msg)); - } - } m_buf.clear(); @@ -273,7 +261,7 @@ std::expected AsyncHttpRequest::start(std::string_view url, std::expected AsyncHttpRequest::retry(std::optional url, std::optional method, const std::map &requestHeaders, - std::string_view requestBody, std::optional timeout_ms) + std::optional &&requestBody, std::optional timeout_ms) { if (!m_taskHandle) { @@ -319,6 +307,18 @@ std::expected AsyncHttpRequest::retry(std::optionalfirst, iter->second); result != ESP_OK) { @@ -327,28 +327,6 @@ std::expected AsyncHttpRequest::retry(std::optional start(std::string_view url, esp_http_client_method_t method = HTTP_METHOD_GET, const std::map &requestHeaders = {}, - std::string_view requestBody = {}, int timeout_ms = 0, + std::string &&requestBody = {}, int timeout_ms = 0, const std::optional &clientAuth = {}); std::expected retry(std::optional url = std::nullopt, std::optional method = std::nullopt, const std::map &requestHeaders = {}, - std::string_view requestBody = {}, std::optional timeout_ms = {}); + std::optional &&requestBody = {}, std::optional timeout_ms = {}); std::expected abort(); bool inProgress() const; @@ -82,6 +82,7 @@ private: std::size_t m_sizeLimit{4096}; bool m_collectResponseHeaders{}; std::map m_responseHeaders; + std::string m_requestBody; const char * const m_taskName; const uint32_t m_taskSize;