Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 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
3 changes: 2 additions & 1 deletion libraries/ESP8266WebServer/src/ESP8266WebServer.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,8 @@ class ESP8266WebServer
void _handleRequest();
void _finalizeResponse();
bool _parseRequest(WiFiClient& client);
void _parseArguments(String data);
void _parseArguments(const String& data);
int _parseArgumentsPrivate(const String& data, int counted);
static String _responseCodeToString(int code);
bool _parseForm(WiFiClient& client, String boundary, uint32_t len);
bool _parseFormUploadAborted();
Expand Down
123 changes: 66 additions & 57 deletions libraries/ESP8266WebServer/src/Parsing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,79 +270,88 @@ bool ESP8266WebServer::_collectHeader(const char* headerName, const char* header
return false;
}

void ESP8266WebServer::_parseArguments(String data) {
void ESP8266WebServer::_parseArguments(const String& data) {
int counted = _parseArgumentsPrivate(data, 0);
(void)_parseArgumentsPrivate(data, counted);
}

int ESP8266WebServer::_parseArgumentsPrivate(const String& data, int counted) {
// counted==0: parsing only, return counted arguments
// counted!=0: parsing and storing "counted" arguments

#ifdef DEBUG_ESP_HTTP_SERVER
DEBUG_OUTPUT.print("args: ");
DEBUG_OUTPUT.println(data);
#endif
if (_currentArgs)
delete[] _currentArgs;
_currentArgs = 0;
if (data.length() == 0) {
_currentArgCount = 0;
_currentArgs = new RequestArgument[1];
return;
}
_currentArgCount = 1;

for (int i = 0; i < (int)data.length(); ) {
i = data.indexOf('&', i);
if (i == -1)
break;
++i;
++_currentArgCount;
if (counted > 0) {
if (_currentArgs)
delete[] _currentArgs;
_currentArgs = 0;

// allocate one more, this is needed (search "plainBuf" in this file)
_currentArgs = new RequestArgument[(_currentArgCount = counted) + 1];
}
#ifdef DEBUG_ESP_HTTP_SERVER
DEBUG_OUTPUT.print("args count: ");
DEBUG_OUTPUT.println(_currentArgCount);
#endif

_currentArgs = new RequestArgument[_currentArgCount+1];
int pos = 0;
int iarg;
for (iarg = 0; iarg < _currentArgCount;) {
int equal_sign_index = data.indexOf('=', pos);
int next_arg_index = data.indexOf('&', pos);
#ifdef DEBUG_ESP_HTTP_SERVER
DEBUG_OUTPUT.print("pos ");
DEBUG_OUTPUT.print(pos);
DEBUG_OUTPUT.print("=@ ");
DEBUG_OUTPUT.print(equal_sign_index);
DEBUG_OUTPUT.print(" &@ ");
DEBUG_OUTPUT.println(next_arg_index);
#endif
if ((equal_sign_index == -1) || ((equal_sign_index > next_arg_index) && (next_arg_index != -1))) {
#ifdef DEBUG_ESP_HTTP_SERVER
DEBUG_OUTPUT.print("arg missing value: ");
DEBUG_OUTPUT.println(iarg);
#endif
if (next_arg_index == -1)
size_t pos = 0;
int arg_total = 0;

while (true) {

// skip empty expression
while (data[pos] == '&' || data[pos] == ';')
if (++pos >= data.length())
break;
pos = next_arg_index + 1;
continue;
}
RequestArgument& arg = _currentArgs[iarg];
arg.key = urlDecode(data.substring(pos, equal_sign_index));
arg.value = urlDecode(data.substring(equal_sign_index + 1, next_arg_index));

// locate separators
int equal_index = data.indexOf('=', pos);
int keyEndPos = equal_index;
int next_index = data.indexOf('&', pos);
int next_index2 = data.indexOf(';', pos);
if ((next_index == -1) || (next_index2 != -1 && next_index2 < next_index))
next_index = next_index2;
if ((keyEndPos == -1) || ((keyEndPos > next_index) && (next_index != -1)))
keyEndPos = next_index;
if (keyEndPos == -1)
keyEndPos = data.length();
keyEndPos--;

// handle key/value
if (keyEndPos >= (int)pos) {
// do not store or count empty ending key ("url?x=y;")

if (counted > 0) {
RequestArgument& arg = _currentArgs[arg_total];
arg.key = urlDecode(data.substring(pos, keyEndPos));
if ((equal_index != -1) && ((equal_index < next_index - 1) || (next_index == -1)))
arg.value = urlDecode(data.substring(equal_index + 1, next_index - 1));
#ifdef DEBUG_ESP_HTTP_SERVER
DEBUG_OUTPUT.print("arg ");
DEBUG_OUTPUT.print(iarg);
DEBUG_OUTPUT.print(" key: ");
DEBUG_OUTPUT.print(arg.key);
DEBUG_OUTPUT.print(" value: ");
DEBUG_OUTPUT.println(arg.value);
DEBUG_OUTPUT.print("arg ");
DEBUG_OUTPUT.print(arg_total);
DEBUG_OUTPUT.print(" key: ");
DEBUG_OUTPUT.print(arg.key);
DEBUG_OUTPUT.print(" value: ");
DEBUG_OUTPUT.println(arg.value);
#endif
++iarg;
if (next_arg_index == -1)
}

++arg_total;
pos = next_index + 1;
}

if (next_index == -1)
break;
pos = next_arg_index + 1;
}
_currentArgCount = iarg;

#ifdef DEBUG_ESP_HTTP_SERVER
DEBUG_OUTPUT.print("args count: ");
DEBUG_OUTPUT.println(_currentArgCount);
DEBUG_OUTPUT.println(arg_total);
#endif

if (counted > 0)
_currentArgCount = arg_total;

return arg_total;
}

void ESP8266WebServer::_uploadWriteByte(uint8_t b){
Expand Down