Я немного изменил ваш образец, чтобы уменьшить количество используемых отступов.
Есть 5 «тестовых случаев», и ни один не вызывает никаких проблем. Не могли бы вы предоставить пример запроса для воспроизведения проблемы, с которой вы столкнулись.
РЕДАКТИРОВАТЬ: Забыл упомянуть: если этот пример, как он есть (с закомментированными битами) не выдает эту ошибку, лучше всего, если у вас есть ошибка в вашей функции StringExplode
. Вы можете опубликовать его источник, чтобы получить более полезный совет.
EDIT2:
В вашем StringExplode
измените results[tmpKey] = tmpKey.substr(found+1);
на results[tmpKey] = tmpResult[i].substr(found+1);
. Измените int found
на size_t found
и удалите все if (found > 0)
, что исправит ваш таинственный out_of_range. Вы ошиблись строкой. На всякий случай вот код с исправлением:
void StringExplode(std::string str, std::string objseparator, std::string keyseperator,
std::map <std::string, std::string> &results)
{
size_t found;
std::vector<std::string> tmpResult;
found = str.find_first_of(objseparator);
while(found != std::string::npos)
{
tmpResult.push_back(str.substr(0,found));
str = str.substr(found+1);
found = str.find_first_of(objseparator);
}
if(str.length() > 0)
{
tmpResult.push_back(str);
}
for(size_t i = 0; i < tmpResult.size(); i++)
{
found = tmpResult[i].find_first_of(keyseperator);
while(found != std::string::npos)
{
std::string tmpKey = tmpResult[i].substr(0, found);
results[tmpKey] = tmpResult[i].substr(found+1);
found = tmpResult[i].find_first_of(keyseperator, found + results[tmpKey].size());
}
}
}
Код начального теста:
#include <iostream>
#include <map>
#include <string>
std::string parse(const std::string &request)
{
std::map<std::string,std::string> keyval;
std::string outRequest;
if(request[0] != 'P')
return outRequest;
if(request.find("register") == std::string::npos)
return outRequest;
//we have a register request
size_t bodypos = request.find("username");
if(bodypos==std::string::npos)
{
// HttpError(400,"Malformed HTTP POST request. Could not find key username.",request);
// you said HttpError returns, so here's a return
return outRequest;
}
std::string body = request.substr(bodypos);
// StringExplode(body,"&", "=",keyval);
outRequest = "doing stuff";
return outRequest;
}
int main()
{
std::string request("P\r\nregister\r\nusername=hello\r\n\r\n");
std::cout << "[" << parse(request) << "]\n";
request = "Pregisternusername=hello\r\n\r\n";
std::cout << "[" << parse(request) << "]\n";
request = "Pregisternusername=hello";
std::cout << "[" << parse(request) << "]\n";
request = "registernusername=hello";
std::cout << "[" << parse(request) << "]\n";
request = "";
std::cout << "[" << parse(request) << "]\n";
return 0;
}
Это выводит, как и ожидалось:
[делать вещи]
[делать вещи]
[делать вещи]
[]
[]