Skip to content

Commit b97dd5d

Browse files
committed
Optimized data forwarding
1 parent 12b6d8d commit b97dd5d

13 files changed

+213
-147
lines changed

httpserver.userprefs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<Properties>
22
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
3-
<MonoDevelop.Ide.Workbench ActiveDocument="httpserver/Server.cpp">
3+
<MonoDevelop.Ide.Workbench ActiveDocument="httpserver/Utils.h">
44
<Files>
5-
<File FileName="httpserver/Server.cpp" Line="750" Column="9" />
6-
<File FileName="httpserver/Server.h" Line="44" Column="90" />
5+
<File FileName="httpserver/Server.cpp" Line="1" Column="1" />
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" />
@@ -16,7 +16,7 @@
1616
<File FileName="httpserver/DataVariantFormUrlencoded.cpp" Line="1" Column="1" />
1717
<File FileName="httpserver/ServerApplicationSettings.h" Line="1" Column="1" />
1818
<File FileName="httpserver/ServerApplicationsTree.h" Line="1" Column="1" />
19-
<File FileName="httpserver/ServerApplicationsTree.cpp" Line="76" Column="4" />
19+
<File FileName="httpserver/ServerApplicationsTree.cpp" Line="1" Column="1" />
2020
<File FileName="httpserver/Module.h" Line="1" Column="1" />
2121
<File FileName="httpserver/Event.h" Line="1" Column="1" />
2222
<File FileName="httpserver/System.h" Line="1" Column="1" />
@@ -25,9 +25,9 @@
2525
<File FileName="httpserver/SignalsHandles.cpp" Line="1" Column="1" />
2626
<File FileName="httpserver/SignalsHandles.h" Line="1" Column="1" />
2727
<File FileName="httpserver/System.cpp" Line="1" Column="1" />
28-
<File FileName="httpserver/Socket.cpp" Line="1" Column="1" />
29-
<File FileName="httpserver/Utils.h" Line="1" Column="1" />
30-
<File FileName="httpserver/Utils.cpp" Line="1" Column="1" />
28+
<File FileName="httpserver/Socket.cpp" Line="18" Column="2" />
29+
<File FileName="httpserver/Utils.h" Line="35" Column="46" />
30+
<File FileName="httpserver/Utils.cpp" Line="287" Column="18" />
3131
<File FileName="httpserver/Socket.h" Line="1" Column="1" />
3232
<File FileName="httpserver/FileIncoming.h" Line="1" Column="1" />
3333
<File FileName="httpserver/RawData.h" Line="1" Column="1" />

httpserver/DataVariantFormUrlencoded.cpp

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,44 +21,42 @@ namespace HttpServer
2121
{
2222
if (str.length() )
2323
{
24-
size_t var_pos = 0;
25-
size_t var_end = std::string::npos;
26-
27-
std::string var_name;
28-
std::string var_value;
29-
30-
for (; std::string::npos != var_pos; var_pos = var_end)
24+
for (size_t var_pos = 0, var_end; std::string::npos != var_pos; var_pos = var_end)
3125
{
3226
// Поиск следующего параметра
3327
var_end = str.find('&', var_pos);
3428

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

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

43-
++delimiter;
42+
std::string var_value;
4443

45-
// Если последний параметр
46-
if (std::string::npos == var_end)
47-
{
48-
var_value = str.substr(delimiter);
49-
}
50-
else // Если не последний параметр
51-
{
52-
var_value = str.substr(delimiter, var_end - delimiter);
53-
}
44+
// Если последний параметр
45+
if (std::string::npos == var_end)
46+
{
47+
var_value = str.substr(delimiter);
48+
}
49+
else // Если не последний параметр
50+
{
51+
var_value = str.substr(delimiter, var_end - delimiter);
52+
}
5453

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

58-
if (std::string::npos != var_end)
59-
{
60-
++var_end;
61-
}
57+
if (std::string::npos != var_end)
58+
{
59+
++var_end;
6260
}
6361
}
6462

httpserver/DataVariantMultipartFormData.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ namespace HttpServer
156156
{
157157
std::string header_name = str_buf.substr(str_cur, line_end - str_cur);
158158
Utils::trim(header_name);
159-
headers.emplace(header_name, "");
159+
headers.emplace(std::move(header_name), "");
160160
}
161161
else
162162
{
@@ -168,7 +168,7 @@ namespace HttpServer
168168
std::string header_value = str_buf.substr(delimiter, line_end - delimiter);
169169
Utils::trim(header_value);
170170

171-
headers.emplace(header_name, header_value);
171+
headers.emplace(std::move(header_name), std::move(header_value) );
172172
}
173173

174174
// Перейти к следующему заголовку
@@ -207,7 +207,7 @@ namespace HttpServer
207207
{
208208
std::string param_name = (std::string::npos == str_param_end) ? header_value.substr(str_param_cur) : header_value.substr(str_param_cur, str_param_end - str_param_cur);
209209
Utils::trim(param_name);
210-
header_params.emplace(param_name, "");
210+
header_params.emplace(std::move(param_name), "");
211211
}
212212
else
213213
{
@@ -225,7 +225,7 @@ namespace HttpServer
225225
std::string param_value = (std::string::npos == str_param_end) ? header_value.substr(delimiter) : header_value.substr(delimiter, str_param_end - delimiter);
226226
Utils::trim(param_value);
227227

228-
header_params.emplace(param_name, param_value);
228+
header_params.emplace(std::move(param_name), std::move(param_value) );
229229
}
230230
else
231231
{
@@ -236,7 +236,7 @@ namespace HttpServer
236236

237237
std::string param_value = (std::string::npos == str_param_cur) ? header_value.substr(delimiter) : header_value.substr(delimiter, str_param_cur - delimiter);
238238

239-
header_params.emplace(param_name, param_value);
239+
header_params.emplace(std::move(param_name), std::move(param_value) );
240240
}
241241
}
242242

@@ -247,19 +247,19 @@ namespace HttpServer
247247
}
248248

249249
// Поиск имени блока данных
250-
auto name = header_params.find("name");
250+
auto it_name = header_params.find("name");
251251

252-
if (header_params.end() != name)
252+
if (header_params.end() != it_name)
253253
{
254254
// Если данные пришли из файла
255-
auto filename = header_params.find("filename");
255+
auto it_filename = header_params.find("filename");
256256

257-
if (header_params.end() != filename)
257+
if (header_params.end() != it_filename)
258258
{
259259
// Найти тип файла
260-
auto filetype = headers.find("Content-Type");
260+
auto it_filetype = headers.find("Content-Type");
261261

262-
if (headers.end() != filetype)
262+
if (headers.end() != it_filetype)
263263
{
264264
// Сгенерировать уникальное имя
265265
std::string tmp_name = System::getTempDir() + Utils::getUniqueName();
@@ -298,7 +298,7 @@ namespace HttpServer
298298
file.write(str_buf.data(), delimiter);
299299

300300
// Добавить данные в список
301-
files.emplace(name->second, FileIncoming(tmp_name, filetype->second, file.tellp() ) );
301+
files.emplace(it_name->second, FileIncoming(std::move(tmp_name), it_filetype->second, file.tellp() ) );
302302

303303
file.close();
304304

@@ -352,7 +352,7 @@ namespace HttpServer
352352
value.append(str_buf.cbegin(), str_buf.cbegin() + delimiter);
353353

354354
// Добавить данные в список
355-
data.emplace(name->second, value);
355+
data.emplace(it_name->second, std::move(value) );
356356

357357
// Если найден конец данных
358358
if (str_buf.find(data_end, delimiter) == delimiter)

httpserver/DataVariantTextPlain.cpp

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,44 +21,42 @@ namespace HttpServer
2121
{
2222
if (str.length() )
2323
{
24-
size_t var_pos = 0;
25-
size_t var_end = std::string::npos;
26-
27-
std::string var_name;
28-
std::string var_value;
29-
30-
for (; std::string::npos != var_pos; var_pos = var_end)
24+
for (size_t var_pos = 0, var_end; std::string::npos != var_pos; var_pos = var_end)
3125
{
3226
// Поиск следующего параметра
3327
var_end = str.find('&', var_pos);
3428

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

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

43-
++delimiter;
42+
std::string var_value;
4443

45-
// Если последний параметр
46-
if (std::string::npos == var_end)
47-
{
48-
var_value = str.substr(delimiter);
49-
}
50-
else // Если не последний параметр
51-
{
52-
var_value = str.substr(delimiter, var_end - delimiter);
53-
}
44+
// Если последний параметр
45+
if (std::string::npos == var_end)
46+
{
47+
var_value = str.substr(delimiter);
48+
}
49+
else // Если не последний параметр
50+
{
51+
var_value = str.substr(delimiter, var_end - delimiter);
52+
}
5453

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

58-
if (std::string::npos != var_end)
59-
{
60-
++var_end;
61-
}
57+
if (std::string::npos != var_end)
58+
{
59+
++var_end;
6260
}
6361
}
6462

httpserver/FileIncoming.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,28 @@
66
namespace HttpServer
77
{
88
FileIncoming::FileIncoming(const std::string &fileName, const std::string &fileType, const size_t fileSize)
9+
: file_name(fileName), file_type(fileType), file_size(fileSize)
910
{
10-
file_name = fileName;
11-
file_type = fileType;
12-
file_size = fileSize;
11+
12+
}
13+
14+
FileIncoming::FileIncoming(const FileIncoming &file)
15+
: file_name(file.file_name), file_type(file.file_type), file_size(file.file_size)
16+
{
17+
18+
}
19+
20+
FileIncoming::FileIncoming(FileIncoming &&file)
21+
: file_name(file.file_name), file_type(file.file_type), file_size(file.file_size)
22+
{
23+
file.file_name.clear();
24+
file.file_type.clear();
25+
file.file_size = 0;
1326
}
1427

1528
bool FileIncoming::isExists() const
1629
{
17-
std::ifstream file(file_name);
30+
std::ifstream file(file_name, std::ifstream::binary);
1831

1932
bool is_exists = file.good();
2033

httpserver/FileIncoming.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ namespace HttpServer
1616

1717
public:
1818
FileIncoming(const std::string &, const std::string &, const size_t);
19+
FileIncoming(const FileIncoming &);
20+
FileIncoming(FileIncoming &&);
1921
~FileIncoming() = default;
2022

2123
inline std::string getName() const

httpserver/Module.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ namespace HttpServer
3434
open(libPath);
3535
}
3636

37+
Module(const Module &module) : lib_handle(module.lib_handle)
38+
{
39+
40+
}
41+
42+
Module(Module &&module) : lib_handle(module.lib_handle)
43+
{
44+
module.lib_handle = nullptr;
45+
}
46+
3747
~Module() = default;
3848

3949
inline bool is_open() const

0 commit comments

Comments
 (0)