Skip to content

Commit d6f9485

Browse files
committed
Fixes for nkolban#213
1 parent b53dd77 commit d6f9485

File tree

3 files changed

+55
-30
lines changed

3 files changed

+55
-30
lines changed

cpp_utils/WebServer.cpp

+53-29
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,36 @@ void WebServer::HTTPResponse::addHeader(const std::string& name, const std::stri
431431

432432
void WebServer::HTTPResponse::addHeader(std::string&& name, std::string&& value) {
433433
m_headers[std::move(name)] = std::move(value);
434-
}
434+
} // addHeader
435+
436+
437+
/**
438+
* @brief Build a string representation of the headers.
439+
* @return A string representation of the headers.
440+
*/
441+
std::string WebServer::HTTPResponse::buildHeaders() {
442+
std::string headers;
443+
unsigned long headers_len = 0;
444+
445+
for(auto iter = m_headers.begin(); iter != m_headers.end(); iter++) {
446+
if(iter != m_headers.begin())
447+
headers_len += 2;
448+
headers_len += iter->first.length();
449+
headers_len += 2;
450+
headers_len += iter->second.length();
451+
}
452+
headers_len += 1;
453+
headers.resize(headers_len); // Will not have to resize and recopy during the next loop, we have 2 loops but it still ends up being faster
454+
455+
for (auto iter = m_headers.begin(); iter != m_headers.end(); iter++) {
456+
if(iter != m_headers.begin())
457+
headers += "\r\n";
458+
headers += iter->first;
459+
headers += ": ";
460+
headers += iter->second;
461+
}
462+
return headers;
463+
} // buildHeaders
435464

436465
/**
437466
* @brief Send data to the HTTP caller.
@@ -444,6 +473,9 @@ void WebServer::HTTPResponse::sendData(const std::string& data) {
444473
} // sendData
445474

446475

476+
477+
478+
447479
/**
448480
* @brief Send data to the HTTP caller.
449481
* Send the data to the HTTP caller. No further data should be sent after this call.
@@ -458,56 +490,48 @@ void WebServer::HTTPResponse::sendData(const uint8_t* pData, size_t length) {
458490
}
459491
m_dataSent = true;
460492

461-
std::string headers;
462-
unsigned long headers_len = 0;
463-
464-
for(auto iter = m_headers.begin(); iter != m_headers.end(); iter++) {
465-
if(iter != m_headers.begin())
466-
headers_len += 2;
467-
headers_len += iter->first.length();
468-
headers_len += 2;
469-
headers_len += iter->second.length();
470-
}
471-
headers_len += 1;
472-
headers.resize(headers_len); // Will not have to resize and recopy during the next loop, we have 2 loops but it still ends up being faster
473-
474-
for (auto iter = m_headers.begin(); iter != m_headers.end(); iter++) {
475-
if(iter != m_headers.begin())
476-
headers += "\r\n";
477-
headers += iter->first;
478-
headers += ": ";
479-
headers += iter->second;
480-
}
481-
mg_send_head(m_nc, m_status, length, headers.c_str());
493+
mg_send_head(m_nc, m_status, length, buildHeaders().c_str());
482494
mg_send(m_nc, pData, length);
483495
m_nc->flags |= MG_F_SEND_AND_CLOSE;
484496
} // sendData
485497

498+
499+
/**
500+
*
501+
*/
486502
void WebServer::HTTPResponse::sendData(const char* pData, size_t length) {
487503
sendData((uint8_t*) pData, length);
488504
} // sendData
489505

506+
507+
/**
508+
*
509+
*/
490510
void WebServer::HTTPResponse::sendChunkHead() {
491511
if(m_dataSent) {
492512
ESP_LOGE(tag, "HTTPResponse: Chunk headers already sent! Attempt to send again/more.");
493513
}
494514
m_dataSent = true;
495-
mg_send_head(m_nc, m_status, -1, m_headers.c_str());
496-
}
515+
mg_send_head(m_nc, m_status, -1, buildHeaders().c_str());
516+
} // sendChunkHead
497517

518+
519+
/**
520+
*
521+
*/
498522
void WebServer::HTTPResponse::sendChunk(const char* pData, size_t length) {
499523
mg_send_http_chunk(m_nc, pData, length);
500524
} // sendChunkHead
501525

526+
527+
/**
528+
*
529+
*/
502530
void WebServer::HTTPResponse::closeConnection() {
503531
m_nc->flags |= MG_F_SEND_AND_CLOSE;
504-
}
532+
} // closeConnection
505533

506534

507-
void WebServer::HTTPResponse::sendData(const char* pData, size_t length) {
508-
sendData((uint8_t*) pData, length);
509-
}
510-
511535
/**
512536
* @brief Set the headers to be sent in the HTTP response.
513537
* @param [in] headers The complete set of headers to send to the caller.

cpp_utils/WebServer.h

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class WebServer {
7171
int m_status;
7272
std::map<std::string, std::string> m_headers;
7373
bool m_dataSent;
74+
std::string buildHeaders();
7475
}; // HTTPResponse
7576

7677
/**

mongoose/webserver/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#mongoose/webserver
1+
# mongoose/webserver
22
This snippet provides a simple Webserver using the Mongoose library on the ESP32.
33
It provides two URL endpoints:
44

0 commit comments

Comments
 (0)