Skip to content

Commit f06f443

Browse files
committed
Fixed parsing request data
Bugfix in obtaining data request (for application)
1 parent 15a16b9 commit f06f443

File tree

5 files changed

+58
-90
lines changed

5 files changed

+58
-90
lines changed

httpserver.userprefs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<Properties>
22
<MonoDevelop.Ide.Workspace ActiveConfiguration="Release" />
3-
<MonoDevelop.Ide.Workbench ActiveDocument="httpserver/DataVariantTextPlain.cpp">
3+
<MonoDevelop.Ide.Workbench ActiveDocument="httpserver/Server.cpp">
44
<Files>
5-
<File FileName="httpserver/Server.cpp" Line="382" Column="27" />
6-
<File FileName="httpserver/Server.h" Line="20" Column="14" />
5+
<File FileName="httpserver/Server.cpp" Line="370" Column="53" />
6+
<File FileName="httpserver/Server.h" Line="1" Column="1" />
77
<File FileName="httpserver/Main.cpp" Line="1" Column="1" />
88
<File FileName="httpserver/Main.h" Line="1" Column="1" />
99
<File FileName="httpserver/DataVariantMultipartFormData.h" Line="1" Column="1" />
@@ -13,25 +13,17 @@
1313
<File FileName="httpserver/Event.cpp" Line="1" Column="1" />
1414
<File FileName="httpserver/DataVariantAbstract.h" Line="1" Column="1" />
1515
<File FileName="httpserver/DataVariantFormUrlencoded.h" Line="1" Column="1" />
16-
<File FileName="httpserver/DataVariantFormUrlencoded.cpp" Line="41" Column="5" />
16+
<File FileName="httpserver/DataVariantFormUrlencoded.cpp" Line="39" Column="46" />
1717
<File FileName="httpserver/ServerApplicationSettings.h" Line="1" Column="1" />
1818
<File FileName="httpserver/ServerApplicationsTree.h" Line="1" Column="1" />
1919
<File FileName="httpserver/ServerApplicationsTree.cpp" Line="1" Column="1" />
20-
<File FileName="httpserver/Module.h" Line="1" Column="1" />
21-
<File FileName="httpserver/Event.h" Line="1" Column="1" />
2220
<File FileName="httpserver/System.h" Line="1" Column="1" />
2321
<File FileName="httpserver/DataVariantTextPlain.h" Line="1" Column="1" />
24-
<File FileName="httpserver/DataVariantTextPlain.cpp" Line="33" Column="6" />
25-
<File FileName="httpserver/SignalsHandles.cpp" Line="1" Column="1" />
26-
<File FileName="httpserver/SignalsHandles.h" Line="1" Column="1" />
22+
<File FileName="httpserver/DataVariantTextPlain.cpp" Line="25" Column="5" />
2723
<File FileName="httpserver/System.cpp" Line="1" Column="1" />
28-
<File FileName="httpserver/Socket.cpp" Line="1" Column="1" />
2924
<File FileName="httpserver/Utils.h" Line="1" Column="1" />
30-
<File FileName="httpserver/Utils.cpp" Line="320" Column="3" />
31-
<File FileName="httpserver/Socket.h" Line="1" Column="1" />
32-
<File FileName="httpserver/FileIncoming.h" Line="1" Column="1" />
33-
<File FileName="httpserver/RawData.h" Line="1" Column="1" />
34-
<File FileName="httpserver/FileIncoming.cpp" Line="1" Column="1" />
25+
<File FileName="httpserver/Utils.cpp" Line="1" Column="1" />
26+
<File FileName="httpserver/Socket.cpp" Line="1" Column="1" />
3527
</Files>
3628
</MonoDevelop.Ide.Workbench>
3729
<MonoDevelop.Ide.DebuggingService.Breakpoints>

httpserver/DataVariantFormUrlencoded.cpp

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,42 +23,34 @@ namespace HttpServer
2323
{
2424
if (str.length() )
2525
{
26-
for (size_t var_pos = 0, var_end; std::string::npos != var_pos; var_pos = var_end)
26+
for (size_t var_pos = 0, var_end = 0; std::string::npos != var_end; var_pos = var_end + 1)
2727
{
2828
// Поиск следующего параметра
2929
var_end = str.find('&', var_pos);
3030

3131
// Поиск значения параметра
3232
size_t delimiter = str.find('=', var_pos);
3333

34-
if (std::string::npos == delimiter || delimiter > var_end)
34+
if (delimiter >= var_end)
3535
{
36-
return false;
37-
}
38-
39-
// Получить имя параметра
40-
std::string var_name = str.substr(var_pos, delimiter - var_pos);
41-
42-
++delimiter;
43-
44-
std::string var_value;
36+
// Получить имя параметра
37+
std::string var_name = Utils::urlDecode(str.substr(var_pos, std::string::npos != var_end ? var_end - var_pos : std::string::npos) );
4538

46-
// Если последний параметр
47-
if (std::string::npos == var_end)
48-
{
49-
var_value = Utils::urlDecode(str.substr(delimiter) );
39+
// Сохранить параметр с пустым значением
40+
data.emplace(std::move(var_name), "");
5041
}
51-
else // Если не последний параметр
42+
else
5243
{
53-
var_value = Utils::urlDecode(str.substr(delimiter, var_end - delimiter) );
54-
}
44+
// Получить имя параметра
45+
std::string var_name = Utils::urlDecode(str.substr(var_pos, delimiter - var_pos) );
5546

56-
// Сохранить параметр и значение
57-
data.emplace(std::move(var_name), std::move(var_value) );
47+
++delimiter;
5848

59-
if (std::string::npos != var_end)
60-
{
61-
++var_end;
49+
// Получить значение параметра
50+
std::string var_value = Utils::urlDecode(str.substr(delimiter, std::string::npos != var_end ? var_end - delimiter : std::string::npos) );
51+
52+
// Сохранить параметр и значение
53+
data.emplace(std::move(var_name), std::move(var_value) );
6254
}
6355
}
6456

httpserver/DataVariantTextPlain.cpp

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,42 +21,34 @@ namespace HttpServer
2121
{
2222
if (str.length() )
2323
{
24-
for (size_t var_pos = 0, var_end; std::string::npos != var_pos; var_pos = var_end)
24+
for (size_t var_pos = 0, var_end = 0; std::string::npos != var_end; var_pos = var_end + 1)
2525
{
2626
// Поиск следующего параметра
2727
var_end = str.find('&', var_pos);
2828

2929
// Поиск значения параметра
3030
size_t delimiter = str.find('=', var_pos);
3131

32-
if (std::string::npos == delimiter || delimiter > var_end)
32+
if (delimiter >= var_end)
3333
{
34-
return false;
35-
}
36-
37-
// Получить имя параметра
38-
std::string var_name = str.substr(var_pos, delimiter - var_pos);
39-
40-
++delimiter;
41-
42-
std::string var_value;
34+
// Получить имя параметра
35+
std::string var_name = str.substr(var_pos, std::string::npos != var_end ? var_end - var_pos : std::string::npos);
4336

44-
// Если последний параметр
45-
if (std::string::npos == var_end)
46-
{
47-
var_value = str.substr(delimiter);
37+
// Сохранить параметр с пустым значением
38+
data.emplace(std::move(var_name), "");
4839
}
49-
else // Если не последний параметр
40+
else
5041
{
51-
var_value = str.substr(delimiter, var_end - delimiter);
52-
}
42+
// Получить имя параметра
43+
std::string var_name = str.substr(var_pos, delimiter - var_pos);
5344

54-
// Сохранить параметр и значение
55-
data.emplace(std::move(var_name), std::move(var_value) );
45+
++delimiter;
5646

57-
if (std::string::npos != var_end)
58-
{
59-
++var_end;
47+
// Получить значение параметра
48+
std::string var_value = str.substr(delimiter, std::string::npos != var_end ? var_end - delimiter : std::string::npos);
49+
50+
// Сохранить параметр и значение
51+
data.emplace(std::move(var_name), std::move(var_value) );
6052
}
6153
}
6254

httpserver/Server.cpp

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -357,46 +357,38 @@ namespace HttpServer
357357
/**
358358
* Парсинг переданных параметров (URI)
359359
*/
360-
bool Server::parseIncomingVars(std::unordered_multimap<std::string, std::string> &map, const std::string &uriParams) const
360+
bool Server::parseIncomingVars(std::unordered_multimap<std::string, std::string> &params, const std::string &uriParams) const
361361
{
362362
if (uriParams.length() )
363363
{
364-
for (size_t var_pos = 0, var_end; std::string::npos != var_pos; var_pos = var_end)
364+
for (size_t var_pos = 0, var_end = 0; std::string::npos != var_end; var_pos = var_end + 1)
365365
{
366366
// Поиск следующего параметра
367367
var_end = uriParams.find('&', var_pos);
368368

369369
// Поиск значения параметра
370370
size_t delimiter = uriParams.find('=', var_pos);
371371

372-
if (std::string::npos == delimiter || delimiter > var_end)
372+
if (delimiter >= var_end)
373373
{
374-
return false;
375-
}
376-
377-
// Получить имя параметра
378-
std::string var_name = uriParams.substr(var_pos, delimiter - var_pos);
379-
380-
++delimiter;
374+
// Получить имя параметра
375+
std::string var_name = Utils::urlDecode(uriParams.substr(var_pos, std::string::npos != var_end ? var_end - var_pos : std::string::npos) );
381376

382-
std::string var_value;
383-
384-
// Если последний параметр
385-
if (std::string::npos == var_end)
386-
{
387-
var_value = Utils::urlDecode(uriParams.substr(delimiter) );
377+
// Сохранить параметр с пустым значением
378+
params.emplace(std::move(var_name), "");
388379
}
389-
else // Если не последний параметр
380+
else
390381
{
391-
var_value = Utils::urlDecode(uriParams.substr(delimiter, var_end - delimiter) );
392-
}
382+
// Получить имя параметра
383+
std::string var_name = Utils::urlDecode(uriParams.substr(var_pos, delimiter - var_pos) );
393384

394-
// Сохранить параметр и значение
395-
map.emplace(std::move(var_name), std::move(var_value) );
385+
++delimiter;
396386

397-
if (std::string::npos != var_end)
398-
{
399-
++var_end;
387+
// Получить значение параметра
388+
std::string var_value = Utils::urlDecode(uriParams.substr(delimiter, std::string::npos != var_end ? var_end - delimiter : std::string::npos) );
389+
390+
// Сохранить параметр и значение
391+
params.emplace(std::move(var_name), std::move(var_value) );
400392
}
401393
}
402394

@@ -420,7 +412,7 @@ namespace HttpServer
420412
{
421413
const std::string &status = it->second;
422414

423-
std::string headers("HTTP/1.1 " + std::to_string(statusCode) + status + "\r\n\r\n");
415+
std::string headers("HTTP/1.1 " + std::to_string(statusCode) + ' ' + status + "\r\n\r\n");
424416

425417
clientSocket.nonblock_send(headers, timeout);
426418
}

httpserver/Utils.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,31 +120,31 @@ namespace Utils
120120
{
121121
for (size_t i = 0; i < count; ++i)
122122
{
123-
map.emplace(raw[i].key ? raw[i].key : "", raw[i].value);
123+
map.emplace(raw[i].key ? raw[i].key : "", raw[i].value ? raw[i].value : "");
124124
}
125125
}
126126

127127
void rawPairsToStlUnorderedMap(std::unordered_map<std::string, std::string> &map, const Utils::raw_pair raw[], const size_t count)
128128
{
129129
for (size_t i = 0; i < count; ++i)
130130
{
131-
map.emplace(raw[i].key, raw[i].value);
131+
map.emplace(raw[i].key ? raw[i].key : "", raw[i].value ? raw[i].value : "");
132132
}
133133
}
134134

135135
void rawPairsToStlUnorderedMultimap(std::unordered_multimap<std::string, std::string> &map, const Utils::raw_pair raw[], const size_t count)
136136
{
137137
for (size_t i = 0; i < count; ++i)
138138
{
139-
map.emplace(raw[i].key, raw[i].value);
139+
map.emplace(raw[i].key ? raw[i].key : "", raw[i].value ? raw[i].value : "");
140140
}
141141
}
142142

143143
void rawFilesInfoToFilesIncoming(std::unordered_multimap<std::string, HttpServer::FileIncoming> &map, const Utils::raw_fileinfo raw[], const size_t count)
144144
{
145145
for (size_t i = 0; i < count; ++i)
146146
{
147-
map.emplace(raw[i].key, HttpServer::FileIncoming(raw[i].file_name, raw[i].file_type, raw[i].file_size) );
147+
map.emplace(raw[i].key ? raw[i].key : "", HttpServer::FileIncoming(raw[i].file_name, raw[i].file_type, raw[i].file_size) );
148148
}
149149
}
150150

0 commit comments

Comments
 (0)