Skip to content

Commit 47b8947

Browse files
authored
ESP8266WebServer: Add variadic template version of collectHeaders() (#7296)
* More user-friendly, less RODATA usage. eg. `webServer.collectHeaders(F("Content-Type"), F("Origin"));` In this example, less about 20 bytes than the traditional way.
1 parent 8ffe41b commit 47b8947

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

libraries/ESP8266WebServer/examples/SimpleAuthentication/SimpleAuthentication.ino

+1-4
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,8 @@ void setup(void) {
123123
});
124124

125125
server.onNotFound(handleNotFound);
126-
//here the list of headers to be recorded
127-
const char * headerkeys[] = {"User-Agent", "Cookie"} ;
128-
size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*);
129126
//ask server to track these headers
130-
server.collectHeaders(headerkeys, headerkeyssize);
127+
server.collectHeaders("User-Agent", "Cookie");
131128
server.begin();
132129
Serial.println("HTTP server started");
133130
}

libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h

+17-9
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ void ESP8266WebServerTemplate<ServerType>::close() {
373373
_server.close();
374374
_currentStatus = HC_NONE;
375375
if(!_headerKeysCount)
376-
collectHeaders(0, 0);
376+
collectHeaders();
377377
}
378378

379379
template <typename ServerType>
@@ -544,7 +544,7 @@ void ESP8266WebServerTemplate<ServerType>::_streamFileCore(const size_t fileSize
544544
}
545545

546546
template <typename ServerType>
547-
const String& ESP8266WebServerTemplate<ServerType>::pathArg(unsigned int i) const {
547+
const String& ESP8266WebServerTemplate<ServerType>::pathArg(unsigned int i) const {
548548
if (_currentHandler != nullptr)
549549
return _currentHandler->pathArg(i);
550550
return emptyString;
@@ -595,7 +595,6 @@ bool ESP8266WebServerTemplate<ServerType>::hasArg(const String& name) const {
595595
return false;
596596
}
597597

598-
599598
template <typename ServerType>
600599
const String& ESP8266WebServerTemplate<ServerType>::header(const String& name) const {
601600
for (int i = 0; i < _headerKeysCount; ++i) {
@@ -605,21 +604,30 @@ const String& ESP8266WebServerTemplate<ServerType>::header(const String& name) c
605604
return emptyString;
606605
}
607606

608-
609607
template<typename ServerType>
610608
void ESP8266WebServerTemplate<ServerType>::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) {
611-
_headerKeysCount = headerKeysCount + 2;
612-
if (_currentHeaders){
609+
if (_currentHeaders)
613610
delete[] _currentHeaders;
614-
}
615-
_currentHeaders = new RequestArgument[_headerKeysCount];
611+
_currentHeaders = new RequestArgument[_headerKeysCount = headerKeysCount + 2];
616612
_currentHeaders[0].key = FPSTR(AUTHORIZATION_HEADER);
617613
_currentHeaders[1].key = FPSTR(ETAG_HEADER);
618614
for (int i = 2; i < _headerKeysCount; i++){
619-
_currentHeaders[i].key = headerKeys[i-2];
615+
_currentHeaders[i].key = headerKeys[i - 2];
620616
}
621617
}
622618

619+
template <typename ServerType>
620+
template <typename... Args>
621+
void ESP8266WebServerTemplate<ServerType>::collectHeaders(const Args&... args) {
622+
if (_currentHeaders)
623+
delete[] _currentHeaders;
624+
_currentHeaders = new RequestArgument[_headerKeysCount = sizeof...(args) + 2] {
625+
{ .key = FPSTR(AUTHORIZATION_HEADER), .value = emptyString },
626+
{ .key = FPSTR(ETAG_HEADER), .value = emptyString },
627+
{ .key = args, .value = emptyString } ...
628+
};
629+
}
630+
623631
template <typename ServerType>
624632
const String& ESP8266WebServerTemplate<ServerType>::header(int i) const {
625633
if (i < _headerKeysCount)

libraries/ESP8266WebServer/src/ESP8266WebServer.h

+2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ class ESP8266WebServerTemplate
138138
int args() const; // get arguments count
139139
bool hasArg(const String& name) const; // check if argument exists
140140
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
141+
template<typename... Args>
142+
void collectHeaders(const Args&... args); // set the request headers to collect (variadic template version)
141143
const String& header(const String& name) const; // get request header value by name
142144
const String& header(int i) const; // get request header value by number
143145
const String& headerName(int i) const; // get request header name by number

0 commit comments

Comments
 (0)