Skip to content

Commit 02968cc

Browse files
committed
Use size_t for index / length types internally
While the API quirk remains until 3.x, we at least use size_t consistently internally which avoids bugs (missing handling of negative values) as well as reduces code (no need to check for negative values).
1 parent 953dfd9 commit 02968cc

File tree

3 files changed

+118
-138
lines changed

3 files changed

+118
-138
lines changed

libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h

+58-89
Original file line numberDiff line numberDiff line change
@@ -37,47 +37,12 @@ static const char Content_Length[] PROGMEM = "Content-Length";
3737
template <typename ServerType>
3838
ESP8266WebServerTemplate<ServerType>::ESP8266WebServerTemplate(IPAddress addr, int port)
3939
: _server(addr, port)
40-
, _currentMethod(HTTP_ANY)
41-
, _currentVersion(0)
42-
, _currentStatus(HC_NONE)
43-
, _statusChange(0)
44-
, _keepAlive(false)
45-
, _currentHandler(nullptr)
46-
, _firstHandler(nullptr)
47-
, _lastHandler(nullptr)
48-
, _currentArgCount(0)
49-
, _currentArgs(nullptr)
50-
, _currentArgsHavePlain(0)
51-
, _postArgsLen(0)
52-
, _postArgs(nullptr)
53-
, _headerKeysCount(0)
54-
, _currentHeaders(nullptr)
55-
, _contentLength(0)
56-
, _chunked(false)
57-
, _corsEnabled(false)
5840
{
5941
}
6042

6143
template <typename ServerType>
6244
ESP8266WebServerTemplate<ServerType>::ESP8266WebServerTemplate(int port)
6345
: _server(port)
64-
, _currentMethod(HTTP_ANY)
65-
, _currentVersion(0)
66-
, _currentStatus(HC_NONE)
67-
, _statusChange(0)
68-
, _currentHandler(nullptr)
69-
, _firstHandler(nullptr)
70-
, _lastHandler(nullptr)
71-
, _currentArgCount(0)
72-
, _currentArgs(nullptr)
73-
, _currentArgsHavePlain(0)
74-
, _postArgsLen(0)
75-
, _postArgs(nullptr)
76-
, _headerKeysCount(0)
77-
, _currentHeaders(nullptr)
78-
, _contentLength(0)
79-
, _chunked(false)
80-
, _corsEnabled(false)
8146
{
8247
}
8348

@@ -587,97 +552,101 @@ const String& ESP8266WebServerTemplate<ServerType>::pathArg(unsigned int i) cons
587552

588553
template <typename ServerType>
589554
const String& ESP8266WebServerTemplate<ServerType>::arg(const String& name) const {
590-
for (int j = 0; j < _postArgsLen; ++j) {
591-
if ( _postArgs[j].key == name )
592-
return _postArgs[j].value;
593-
}
594-
for (int i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
595-
if ( _currentArgs[i].key == name )
596-
return _currentArgs[i].value;
597-
}
598-
return emptyString;
555+
for (size_t j = 0; j < _postArgsLen; ++j) {
556+
if ( _postArgs[j].key == name )
557+
return _postArgs[j].value;
558+
}
559+
for (size_t i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
560+
if ( _currentArgs[i].key == name )
561+
return _currentArgs[i].value;
562+
}
563+
return emptyString;
599564
}
600565

601566
template <typename ServerType>
602-
const String& ESP8266WebServerTemplate<ServerType>::arg(int i) const {
603-
if (i >= 0 && i < _currentArgCount + _currentArgsHavePlain)
604-
return _currentArgs[i].value;
605-
return emptyString;
567+
const String& ESP8266WebServerTemplate<ServerType>::arg(int _i) const {
568+
size_t i = (size_t) _i;
569+
if (i < _currentArgCount + _currentArgsHavePlain)
570+
return _currentArgs[i].value;
571+
return emptyString;
606572
}
607573

608574
template <typename ServerType>
609-
const String& ESP8266WebServerTemplate<ServerType>::argName(int i) const {
610-
if (i >= 0 && i < _currentArgCount + _currentArgsHavePlain)
611-
return _currentArgs[i].key;
612-
return emptyString;
575+
const String& ESP8266WebServerTemplate<ServerType>::argName(int _i) const {
576+
size_t i = (size_t) _i;
577+
if (i < _currentArgCount + _currentArgsHavePlain)
578+
return _currentArgs[i].key;
579+
return emptyString;
613580
}
614581

615582
template <typename ServerType>
616583
int ESP8266WebServerTemplate<ServerType>::args() const {
617-
return _currentArgCount;
584+
return (int) _currentArgCount;
618585
}
619586

620587
template <typename ServerType>
621588
bool ESP8266WebServerTemplate<ServerType>::hasArg(const String& name) const {
622-
for (int j = 0; j < _postArgsLen; ++j) {
623-
if (_postArgs[j].key == name)
624-
return true;
625-
}
626-
for (int i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
627-
if (_currentArgs[i].key == name)
628-
return true;
629-
}
630-
return false;
589+
for (size_t j = 0; j < _postArgsLen; ++j) {
590+
if (_postArgs[j].key == name)
591+
return true;
592+
}
593+
for (size_t i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
594+
if (_currentArgs[i].key == name)
595+
return true;
596+
}
597+
return false;
631598
}
632599

633600

634601
template <typename ServerType>
635602
const String& ESP8266WebServerTemplate<ServerType>::header(const String& name) const {
636-
for (int i = 0; i < _headerKeysCount; ++i) {
637-
if (_currentHeaders[i].key.equalsIgnoreCase(name))
638-
return _currentHeaders[i].value;
639-
}
640-
return emptyString;
603+
for (size_t i = 0; i < _headerKeysCount; ++i) {
604+
if (_currentHeaders[i].key.equalsIgnoreCase(name))
605+
return _currentHeaders[i].value;
606+
}
607+
return emptyString;
641608
}
642609

643610
template <typename ServerType>
644611
void ESP8266WebServerTemplate<ServerType>::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) {
645-
_headerKeysCount = headerKeysCount + 1;
646-
if (_currentHeaders)
647-
delete[]_currentHeaders;
648-
_currentHeaders = new RequestArgument[_headerKeysCount];
649-
_currentHeaders[0].key = FPSTR(AUTHORIZATION_HEADER);
650-
for (int i = 1; i < _headerKeysCount; i++){
651-
_currentHeaders[i].key = headerKeys[i-1];
652-
}
612+
_headerKeysCount = headerKeysCount + 1;
613+
if (_currentHeaders)
614+
delete [] _currentHeaders;
615+
_currentHeaders = new RequestArgument[_headerKeysCount];
616+
_currentHeaders[0].key = FPSTR(AUTHORIZATION_HEADER);
617+
for (size_t i = 1; i < _headerKeysCount; i++) {
618+
_currentHeaders[i].key = headerKeys[i-1];
619+
}
653620
}
654621

655622
template <typename ServerType>
656-
const String& ESP8266WebServerTemplate<ServerType>::header(int i) const {
657-
if (i < _headerKeysCount)
658-
return _currentHeaders[i].value;
659-
return emptyString;
623+
const String& ESP8266WebServerTemplate<ServerType>::header(int _i) const {
624+
size_t i = (size_t) _i;
625+
if (i < _headerKeysCount)
626+
return _currentHeaders[i].value;
627+
return emptyString;
660628
}
661629

662630
template <typename ServerType>
663-
const String& ESP8266WebServerTemplate<ServerType>::headerName(int i) const {
664-
if (i < _headerKeysCount)
665-
return _currentHeaders[i].key;
666-
return emptyString;
631+
const String& ESP8266WebServerTemplate<ServerType>::headerName(int _i) const {
632+
size_t i = (size_t) _i;
633+
if (i < _headerKeysCount)
634+
return _currentHeaders[i].key;
635+
return emptyString;
667636
}
668637

669638
template <typename ServerType>
670639
int ESP8266WebServerTemplate<ServerType>::headers() const {
671-
return _headerKeysCount;
640+
return (int) _headerKeysCount;
672641
}
673642

674643
template <typename ServerType>
675644
bool ESP8266WebServerTemplate<ServerType>::hasHeader(const String& name) const {
676-
for (int i = 0; i < _headerKeysCount; ++i) {
677-
if ((_currentHeaders[i].key.equalsIgnoreCase(name)) && (_currentHeaders[i].value.length() > 0))
678-
return true;
679-
}
680-
return false;
645+
for (size_t i = 0; i < _headerKeysCount; ++i) {
646+
if ((_currentHeaders[i].key.equalsIgnoreCase(name)) && (_currentHeaders[i].value.length() > 0))
647+
return true;
648+
}
649+
return false;
681650
}
682651

683652
template <typename ServerType>

libraries/ESP8266WebServer/src/ESP8266WebServer.h

+46-34
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,32 @@ class ESP8266WebServerTemplate
127127
// Allows setting server options (i.e. SSL keys) by the instantiator
128128
ServerType &getServer() { return _server; }
129129

130-
const String& pathArg(unsigned int i) const; // get request path argument by number
131-
const String& arg(const String& name) const; // get request argument value by name
132-
const String& arg(int i) const; // get request argument value by number
133-
const String& argName(int i) const; // get request argument name by number
134-
int args() const; // get arguments count
135-
bool hasArg(const String& name) const; // check if argument exists
136-
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
137-
const String& header(const String& name) const; // get request header value by name
138-
const String& header(int i) const; // get request header value by number
139-
const String& headerName(int i) const; // get request header name by number
140-
int headers() const; // get header count
141-
bool hasHeader(const String& name) const; // check if header exists
142-
const String& hostHeader() const; // get request host header if available or empty String if not
130+
// get request path argument by number
131+
const String& pathArg(unsigned int i) const;
132+
// get request argument value by name
133+
const String& arg(const String& name) const;
134+
// get request argument value by number
135+
const String& arg(int i) const;
136+
// get request argument name by number
137+
const String& argName(int i) const;
138+
// get arguments count
139+
int args() const;
140+
// check if argument exists
141+
bool hasArg(const String& name) const;
142+
// set the request headers to collect
143+
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
144+
// get request header value by name
145+
const String& header(const String& name) const;
146+
// get request header value by number
147+
const String& header(int i) const;
148+
// get request header name by number
149+
const String& headerName(int i) const;
150+
// get header count
151+
int headers() const;
152+
// check if header exists
153+
bool hasHeader(const String& name) const;
154+
// get request host header if available or empty String if not
155+
const String& hostHeader() const;
143156

144157
// send response to the client
145158
// code - HTTP response code, can be 200 or 404
@@ -192,7 +205,7 @@ class ESP8266WebServerTemplate
192205
// Defaults to true when the client's HTTP version is 1.1 or above, otherwise it defaults to false.
193206
// If the client sends the "Connection" header, the value given by the header is used.
194207
void keepAlive(bool keepAlive) { _keepAlive = keepAlive; }
195-
bool keepAlive() { return _keepAlive; }
208+
bool keepAlive() const { return _keepAlive; }
196209

197210
static String credentialHash(const String& username, const String& realm, const String& password);
198211

@@ -261,34 +274,33 @@ class ESP8266WebServerTemplate
261274
ClientType _currentClient;
262275
HTTPMethod _currentMethod;
263276
String _currentUri;
264-
uint8_t _currentVersion;
265-
HTTPClientStatus _currentStatus;
266-
unsigned long _statusChange;
267-
bool _keepAlive;
268-
269-
RequestHandlerType* _currentHandler;
270-
RequestHandlerType* _firstHandler;
271-
RequestHandlerType* _lastHandler;
277+
uint8_t _currentVersion = 0;
278+
HTTPClientStatus _currentStatus = HC_NONE;
279+
unsigned long _statusChange = 0;
280+
281+
bool _keepAlive = false;
282+
bool _chunked = false;
283+
bool _corsEnabled = false;
284+
285+
RequestHandlerType* _currentHandler = nullptr;
286+
RequestHandlerType* _firstHandler = nullptr;
287+
RequestHandlerType* _lastHandler = nullptr;
272288
THandlerFunction _notFoundHandler;
273289
THandlerFunction _fileUploadHandler;
274290

275-
int _currentArgCount;
276-
RequestArgument* _currentArgs;
277-
int _currentArgsHavePlain;
291+
size_t _currentArgCount = 0;
292+
RequestArgument* _currentArgs = nullptr;
293+
size_t _currentArgsHavePlain = 0;
278294
std::unique_ptr<HTTPUpload> _currentUpload;
279-
int _postArgsLen;
280-
RequestArgument* _postArgs;
295+
size_t _postArgsLen = 0;
296+
RequestArgument* _postArgs = nullptr;
281297

282-
int _headerKeysCount;
283-
RequestArgument* _currentHeaders;
298+
size_t _headerKeysCount = 0;
299+
RequestArgument* _currentHeaders = nullptr;
284300

285-
size_t _contentLength;
301+
size_t _contentLength = 0;
286302
String _responseHeaders;
287-
288303
String _hostHeader;
289-
bool _chunked;
290-
bool _corsEnabled;
291-
292304
String _snonce; // Store noance and opaque for future comparison
293305
String _sopaque;
294306
String _srealm; // Store the Auth realm between Calls

libraries/ESP8266WebServer/src/Parsing-impl.h

+14-15
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ typename ESP8266WebServerTemplate<ServerType>::ClientFuture ESP8266WebServerTemp
6060
DBGWS("request: %s\n", req.c_str());
6161
client.readStringUntil('\n');
6262
//reset header value
63-
for (int i = 0; i < _headerKeysCount; ++i) {
63+
for (size_t i = 0; i < _headerKeysCount; ++i) {
6464
_currentHeaders[i].value.clear();
6565
}
6666

@@ -236,7 +236,7 @@ typename ESP8266WebServerTemplate<ServerType>::ClientFuture ESP8266WebServerTemp
236236
#ifdef DEBUG_ESP_HTTP_SERVER
237237
DBGWS("Request: %s\nArguments: %s\nfinal list of key/value pairs:\n",
238238
url.c_str(), searchStr.c_str());
239-
for (int i = 0; i < _currentArgCount; i++)
239+
for (size_t i = 0; i < _currentArgCount; i++)
240240
DBGWS(" key:'%s' value:'%s'\r\n",
241241
_currentArgs[i].key.c_str(),
242242
_currentArgs[i].value.c_str());
@@ -247,13 +247,13 @@ typename ESP8266WebServerTemplate<ServerType>::ClientFuture ESP8266WebServerTemp
247247

248248
template <typename ServerType>
249249
bool ESP8266WebServerTemplate<ServerType>::_collectHeader(const char* headerName, const char* headerValue) {
250-
for (int i = 0; i < _headerKeysCount; i++) {
251-
if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) {
252-
_currentHeaders[i].value=headerValue;
250+
for (size_t i = 0; i < _headerKeysCount; i++) {
251+
if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) {
252+
_currentHeaders[i].value = headerValue;
253253
return true;
254254
}
255-
}
256-
return false;
255+
}
256+
return false;
257257
}
258258

259259
template <typename ServerType>
@@ -513,21 +513,20 @@ bool ESP8266WebServerTemplate<ServerType>::_parseForm(ClientType& client, const
513513
}
514514
}
515515

516-
int iarg;
517-
int totalArgs = ((WEBSERVER_MAX_POST_ARGS - _postArgsLen) < _currentArgCount)?(WEBSERVER_MAX_POST_ARGS - _postArgsLen):_currentArgCount;
518-
for (iarg = 0; iarg < totalArgs; iarg++){
516+
size_t totalArgs = ((WEBSERVER_MAX_POST_ARGS - _postArgsLen) < _currentArgCount)?(WEBSERVER_MAX_POST_ARGS - _postArgsLen):_currentArgCount;
517+
for (size_t iarg = 0; iarg < totalArgs; iarg++) {
519518
RequestArgument& arg = _postArgs[_postArgsLen++];
520519
arg.key = _currentArgs[iarg].key;
521520
arg.value = _currentArgs[iarg].value;
522521
}
523522
if (_currentArgs) delete[] _currentArgs;
524523
_currentArgs = new RequestArgument[_postArgsLen];
525-
for (iarg = 0; iarg < _postArgsLen; iarg++){
526-
RequestArgument& arg = _currentArgs[iarg];
527-
arg.key = _postArgs[iarg].key;
528-
arg.value = _postArgs[iarg].value;
524+
for (size_t i = 0; i < _postArgsLen; i++) {
525+
RequestArgument& arg = _currentArgs[i];
526+
arg.key = _postArgs[i].key;
527+
arg.value = _postArgs[i].value;
529528
}
530-
_currentArgCount = iarg;
529+
_currentArgCount = _postArgsLen;
531530
if (_postArgs) {
532531
delete[] _postArgs;
533532
_postArgs = nullptr;

0 commit comments

Comments
 (0)