#include "debugresponsehandler.h" // esp-idf includes #include #include // 3rdparty lib includes #include #include #include namespace { constexpr const char * const TAG = "ASIO_WEBSERVER"; } // namespace DebugResponseHandler::DebugResponseHandler(ClientConnection &clientConnection, std::string_view method, std::string_view path, std::string_view protocol) : m_clientConnection{clientConnection}, m_method{method}, m_path{path}, m_protocol{protocol} { // ESP_LOGV(TAG, "constructed for %.*s %.*s (%s:%hi)", m_method.size(), m_method.data(), path.size(), path.data(), // m_clientConnection.remote_endpoint().address().to_string().c_str(), m_clientConnection.remote_endpoint().port()); } DebugResponseHandler::~DebugResponseHandler() { // ESP_LOGV(TAG, "destructed for %.*s %.*s (%s:%hi)", m_method.size(), m_method.data(), m_path.size(), m_path.data(), // m_clientConnection.remote_endpoint().address().to_string().c_str(), m_clientConnection.remote_endpoint().port()); } void DebugResponseHandler::requestHeaderReceived(std::string_view key, std::string_view value) { m_requestHeaders.emplace_back(std::make_pair(std::string{key}, std::string{value})); } void DebugResponseHandler::requestBodyReceived(std::string_view body) { m_requestBody += body; } void DebugResponseHandler::sendResponse() { ESP_LOGI(TAG, "sending response for %.*s %.*s (%s:%hi)", m_method.size(), m_method.data(), m_path.size(), m_path.data(), m_clientConnection.remote_endpoint().address().to_string().c_str(), m_clientConnection.remote_endpoint().port()); m_response = fmt::format("" "" "Test" "" "" "

Request details:

" "" "" "" "" "" "" "" "" ""; if (!m_requestBody.empty()) { m_response += fmt::format( "" "" "" "", m_requestBody); } m_response += "" "
Method:{}
Path:{}
Protocol:{}
Request headers:" "", m_method, m_path, m_protocol); for (const auto &pair : m_requestHeaders) m_response += fmt::format( "", pair.first, pair.second); m_response += "
{}{}
" "
Request body:
{}
" "
" "
" "GET form with line edit" "" "" "
" "
" "
" "
" "POST form with line edit" "" "" "
" "
" "
" "
" "POST form with multiline edit" "" "" "
" "
" "
" "
" "POST form with multipart form-data and line edit" "" "" "
" "
" "
" "
" "POST form with multipart form-data and file upload" "" "" "
" "
" "" ""; m_response = fmt::format("HTTP/1.1 200 Ok\r\n" "Connection: {}\r\n" "Content-Type: text/html\r\n" "Content-Length: {}\r\n" "\r\n" "{}", m_clientConnection.webserver().connectionKeepAlive() ? "keep-alive" : "close", m_response.size(), m_response); asio::async_write(m_clientConnection.socket(), asio::buffer(m_response.data(), m_response.size()), [this, self=m_clientConnection.shared_from_this()](std::error_code ec, std::size_t length) { written(ec, length); }); } void DebugResponseHandler::written(std::error_code ec, std::size_t length) { if (ec) { ESP_LOGW(TAG, "error: %i (%s:%hi)", ec.value(), m_clientConnection.remote_endpoint().address().to_string().c_str(), m_clientConnection.remote_endpoint().port()); m_clientConnection.responseFinished(ec); return; } ESP_LOGI(TAG, "expected=%zd actual=%zd for %.*s %.*s (%s:%hi)", m_response.size(), length, m_method.size(), m_method.data(), m_path.size(), m_path.data(), m_clientConnection.remote_endpoint().address().to_string().c_str(), m_clientConnection.remote_endpoint().port()); m_clientConnection.responseFinished(ec); }