Skip to content

Use size_t for index / length types #6947

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 58 additions & 89 deletions libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,47 +37,12 @@ static const char Content_Length[] PROGMEM = "Content-Length";
template <typename ServerType>
ESP8266WebServerTemplate<ServerType>::ESP8266WebServerTemplate(IPAddress addr, int port)
: _server(addr, port)
, _currentMethod(HTTP_ANY)
, _currentVersion(0)
, _currentStatus(HC_NONE)
, _statusChange(0)
, _keepAlive(false)
, _currentHandler(nullptr)
, _firstHandler(nullptr)
, _lastHandler(nullptr)
, _currentArgCount(0)
, _currentArgs(nullptr)
, _currentArgsHavePlain(0)
, _postArgsLen(0)
, _postArgs(nullptr)
, _headerKeysCount(0)
, _currentHeaders(nullptr)
, _contentLength(0)
, _chunked(false)
, _corsEnabled(false)
{
}

template <typename ServerType>
ESP8266WebServerTemplate<ServerType>::ESP8266WebServerTemplate(int port)
: _server(port)
, _currentMethod(HTTP_ANY)
, _currentVersion(0)
, _currentStatus(HC_NONE)
, _statusChange(0)
, _currentHandler(nullptr)
, _firstHandler(nullptr)
, _lastHandler(nullptr)
, _currentArgCount(0)
, _currentArgs(nullptr)
, _currentArgsHavePlain(0)
, _postArgsLen(0)
, _postArgs(nullptr)
, _headerKeysCount(0)
, _currentHeaders(nullptr)
, _contentLength(0)
, _chunked(false)
, _corsEnabled(false)
{
}

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

template <typename ServerType>
const String& ESP8266WebServerTemplate<ServerType>::arg(const String& name) const {
for (int j = 0; j < _postArgsLen; ++j) {
if ( _postArgs[j].key == name )
return _postArgs[j].value;
}
for (int i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
if ( _currentArgs[i].key == name )
return _currentArgs[i].value;
}
return emptyString;
for (size_t j = 0; j < _postArgsLen; ++j) {
if ( _postArgs[j].key == name )
return _postArgs[j].value;
}
for (size_t i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
if ( _currentArgs[i].key == name )
return _currentArgs[i].value;
}
return emptyString;
}

template <typename ServerType>
const String& ESP8266WebServerTemplate<ServerType>::arg(int i) const {
if (i >= 0 && i < _currentArgCount + _currentArgsHavePlain)
return _currentArgs[i].value;
return emptyString;
const String& ESP8266WebServerTemplate<ServerType>::arg(int _i) const {
size_t i = (size_t) _i;
if (i < _currentArgCount + _currentArgsHavePlain)
return _currentArgs[i].value;
return emptyString;
}

template <typename ServerType>
const String& ESP8266WebServerTemplate<ServerType>::argName(int i) const {
if (i >= 0 && i < _currentArgCount + _currentArgsHavePlain)
return _currentArgs[i].key;
return emptyString;
const String& ESP8266WebServerTemplate<ServerType>::argName(int _i) const {
size_t i = (size_t) _i;
if (i < _currentArgCount + _currentArgsHavePlain)
return _currentArgs[i].key;
return emptyString;
}

template <typename ServerType>
int ESP8266WebServerTemplate<ServerType>::args() const {
return _currentArgCount;
return (int) _currentArgCount;
}

template <typename ServerType>
bool ESP8266WebServerTemplate<ServerType>::hasArg(const String& name) const {
for (int j = 0; j < _postArgsLen; ++j) {
if (_postArgs[j].key == name)
return true;
}
for (int i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
if (_currentArgs[i].key == name)
return true;
}
return false;
for (size_t j = 0; j < _postArgsLen; ++j) {
if (_postArgs[j].key == name)
return true;
}
for (size_t i = 0; i < _currentArgCount + _currentArgsHavePlain; ++i) {
if (_currentArgs[i].key == name)
return true;
}
return false;
}


template <typename ServerType>
const String& ESP8266WebServerTemplate<ServerType>::header(const String& name) const {
for (int i = 0; i < _headerKeysCount; ++i) {
if (_currentHeaders[i].key.equalsIgnoreCase(name))
return _currentHeaders[i].value;
}
return emptyString;
for (size_t i = 0; i < _headerKeysCount; ++i) {
if (_currentHeaders[i].key.equalsIgnoreCase(name))
return _currentHeaders[i].value;
}
return emptyString;
}

template <typename ServerType>
void ESP8266WebServerTemplate<ServerType>::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) {
_headerKeysCount = headerKeysCount + 1;
if (_currentHeaders)
delete[]_currentHeaders;
_currentHeaders = new RequestArgument[_headerKeysCount];
_currentHeaders[0].key = FPSTR(AUTHORIZATION_HEADER);
for (int i = 1; i < _headerKeysCount; i++){
_currentHeaders[i].key = headerKeys[i-1];
}
_headerKeysCount = headerKeysCount + 1;
if (_currentHeaders)
delete [] _currentHeaders;
_currentHeaders = new RequestArgument[_headerKeysCount];
_currentHeaders[0].key = FPSTR(AUTHORIZATION_HEADER);
for (size_t i = 1; i < _headerKeysCount; i++) {
_currentHeaders[i].key = headerKeys[i-1];
}
}

template <typename ServerType>
const String& ESP8266WebServerTemplate<ServerType>::header(int i) const {
if (i < _headerKeysCount)
return _currentHeaders[i].value;
return emptyString;
const String& ESP8266WebServerTemplate<ServerType>::header(int _i) const {
size_t i = (size_t) _i;
if (i < _headerKeysCount)
return _currentHeaders[i].value;
return emptyString;
}

template <typename ServerType>
const String& ESP8266WebServerTemplate<ServerType>::headerName(int i) const {
if (i < _headerKeysCount)
return _currentHeaders[i].key;
return emptyString;
const String& ESP8266WebServerTemplate<ServerType>::headerName(int _i) const {
size_t i = (size_t) _i;
if (i < _headerKeysCount)
return _currentHeaders[i].key;
return emptyString;
}

template <typename ServerType>
int ESP8266WebServerTemplate<ServerType>::headers() const {
return _headerKeysCount;
return (int) _headerKeysCount;
}

template <typename ServerType>
bool ESP8266WebServerTemplate<ServerType>::hasHeader(const String& name) const {
for (int i = 0; i < _headerKeysCount; ++i) {
if ((_currentHeaders[i].key.equalsIgnoreCase(name)) && (_currentHeaders[i].value.length() > 0))
return true;
}
return false;
for (size_t i = 0; i < _headerKeysCount; ++i) {
if ((_currentHeaders[i].key.equalsIgnoreCase(name)) && (_currentHeaders[i].value.length() > 0))
return true;
}
return false;
}

template <typename ServerType>
Expand Down
80 changes: 46 additions & 34 deletions libraries/ESP8266WebServer/src/ESP8266WebServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,19 +127,32 @@ class ESP8266WebServerTemplate
// Allows setting server options (i.e. SSL keys) by the instantiator
ServerType &getServer() { return _server; }

const String& pathArg(unsigned int i) const; // get request path argument by number
const String& arg(const String& name) const; // get request argument value by name
const String& arg(int i) const; // get request argument value by number
const String& argName(int i) const; // get request argument name by number
int args() const; // get arguments count
bool hasArg(const String& name) const; // check if argument exists
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
const String& header(const String& name) const; // get request header value by name
const String& header(int i) const; // get request header value by number
const String& headerName(int i) const; // get request header name by number
int headers() const; // get header count
bool hasHeader(const String& name) const; // check if header exists
const String& hostHeader() const; // get request host header if available or empty String if not
// get request path argument by number
const String& pathArg(unsigned int i) const;
// get request argument value by name
const String& arg(const String& name) const;
// get request argument value by number
const String& arg(int i) const;
// get request argument name by number
const String& argName(int i) const;
// get arguments count
int args() const;
// check if argument exists
bool hasArg(const String& name) const;
// set the request headers to collect
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
// get request header value by name
const String& header(const String& name) const;
// get request header value by number
const String& header(int i) const;
// get request header name by number
const String& headerName(int i) const;
// get header count
int headers() const;
// check if header exists
bool hasHeader(const String& name) const;
// get request host header if available or empty String if not
const String& hostHeader() const;

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

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

Expand Down Expand Up @@ -261,34 +274,33 @@ class ESP8266WebServerTemplate
ClientType _currentClient;
HTTPMethod _currentMethod;
String _currentUri;
uint8_t _currentVersion;
HTTPClientStatus _currentStatus;
unsigned long _statusChange;
bool _keepAlive;

RequestHandlerType* _currentHandler;
RequestHandlerType* _firstHandler;
RequestHandlerType* _lastHandler;
uint8_t _currentVersion = 0;
HTTPClientStatus _currentStatus = HC_NONE;
unsigned long _statusChange = 0;

bool _keepAlive = false;
bool _chunked = false;
bool _corsEnabled = false;

RequestHandlerType* _currentHandler = nullptr;
RequestHandlerType* _firstHandler = nullptr;
RequestHandlerType* _lastHandler = nullptr;
THandlerFunction _notFoundHandler;
THandlerFunction _fileUploadHandler;

int _currentArgCount;
RequestArgument* _currentArgs;
int _currentArgsHavePlain;
size_t _currentArgCount = 0;
RequestArgument* _currentArgs = nullptr;
size_t _currentArgsHavePlain = 0;
std::unique_ptr<HTTPUpload> _currentUpload;
int _postArgsLen;
RequestArgument* _postArgs;
size_t _postArgsLen = 0;
RequestArgument* _postArgs = nullptr;

int _headerKeysCount;
RequestArgument* _currentHeaders;
size_t _headerKeysCount = 0;
RequestArgument* _currentHeaders = nullptr;

size_t _contentLength;
size_t _contentLength = 0;
String _responseHeaders;

String _hostHeader;
bool _chunked;
bool _corsEnabled;

String _snonce; // Store noance and opaque for future comparison
String _sopaque;
String _srealm; // Store the Auth realm between Calls
Expand Down
29 changes: 14 additions & 15 deletions libraries/ESP8266WebServer/src/Parsing-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ typename ESP8266WebServerTemplate<ServerType>::ClientFuture ESP8266WebServerTemp
DBGWS("request: %s\n", req.c_str());
client.readStringUntil('\n');
//reset header value
for (int i = 0; i < _headerKeysCount; ++i) {
for (size_t i = 0; i < _headerKeysCount; ++i) {
_currentHeaders[i].value.clear();
}

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

template <typename ServerType>
bool ESP8266WebServerTemplate<ServerType>::_collectHeader(const char* headerName, const char* headerValue) {
for (int i = 0; i < _headerKeysCount; i++) {
if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) {
_currentHeaders[i].value=headerValue;
for (size_t i = 0; i < _headerKeysCount; i++) {
if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) {
_currentHeaders[i].value = headerValue;
return true;
}
}
return false;
}
return false;
}

template <typename ServerType>
Expand Down Expand Up @@ -513,21 +513,20 @@ bool ESP8266WebServerTemplate<ServerType>::_parseForm(ClientType& client, const
}
}

int iarg;
int totalArgs = ((WEBSERVER_MAX_POST_ARGS - _postArgsLen) < _currentArgCount)?(WEBSERVER_MAX_POST_ARGS - _postArgsLen):_currentArgCount;
for (iarg = 0; iarg < totalArgs; iarg++){
size_t totalArgs = ((WEBSERVER_MAX_POST_ARGS - _postArgsLen) < _currentArgCount)?(WEBSERVER_MAX_POST_ARGS - _postArgsLen):_currentArgCount;
for (size_t iarg = 0; iarg < totalArgs; iarg++) {
RequestArgument& arg = _postArgs[_postArgsLen++];
arg.key = _currentArgs[iarg].key;
arg.value = _currentArgs[iarg].value;
}
if (_currentArgs) delete[] _currentArgs;
_currentArgs = new RequestArgument[_postArgsLen];
for (iarg = 0; iarg < _postArgsLen; iarg++){
RequestArgument& arg = _currentArgs[iarg];
arg.key = _postArgs[iarg].key;
arg.value = _postArgs[iarg].value;
for (size_t i = 0; i < _postArgsLen; i++) {
RequestArgument& arg = _currentArgs[i];
arg.key = _postArgs[i].key;
arg.value = _postArgs[i].value;
}
_currentArgCount = iarg;
_currentArgCount = _postArgsLen;
if (_postArgs) {
delete[] _postArgs;
_postArgs = nullptr;
Expand Down