Skip to content

Commit 6fea450

Browse files
committed
Fixed critical bug for Windows
Refactoring function to process the request in a thread
1 parent 68c79d3 commit 6fea450

20 files changed

+689
-546
lines changed

httpserver.pro

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ SOURCES += \
3434
httpserver/SocketList.cpp \
3535
httpserver/System.cpp \
3636
httpserver/Utils.cpp \
37-
httpserver/ConfigParser.cpp
37+
httpserver/ConfigParser.cpp \
38+
httpserver/RequestParameters.cpp
3839

3940
include(deployment.pri)
4041
qtcAddDeployment()
@@ -60,5 +61,6 @@ HEADERS += \
6061
httpserver/SocketList.h \
6162
httpserver/System.h \
6263
httpserver/Utils.h \
63-
httpserver/ConfigParser.h
64+
httpserver/ConfigParser.h \
65+
httpserver/RequestParameters.h
6466

httpserver.pro.user

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE QtCreatorProject>
3-
<!-- Written by QtCreator 3.2.1, 2015-08-28T20:24:23. -->
3+
<!-- Written by QtCreator 3.2.1, 2015-09-29T01:37:03. -->
44
<qtcreator>
55
<data>
66
<variable>EnvironmentId</variable>
@@ -61,7 +61,7 @@
6161
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
6262
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
6363
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{c77ee4a2-1c2a-4bac-9185-8378ec4ebf5d}</value>
64-
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
64+
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
6565
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
6666
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
6767
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">

httpserver/DataVariantAbstract.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
#pragma once
22

33
#include "Socket.h"
4-
#include "FileIncoming.h"
5-
6-
#include <unordered_map>
4+
#include "RequestParameters.h"
75

86
namespace HttpServer
97
{
@@ -26,24 +24,20 @@ namespace HttpServer
2624

2725
/**
2826
* @param const Socket & - сокет, откуда можно достать остальные данные
29-
* @param const std::chrono::milliseconds & - максимальное время ожидания данных (на сокете)
3027
* @param std::string & - первая часть полученных данных
3128
* @param const size_t - сколько осталось данных (в байтах) получить из сокета
3229
* @param const std::unordered_map<std::string, std::string> & - дополнительные параметры, описывающие формат данных
33-
* @param std::unordered_multimap<std::string, std::string> & - данные в виде ключ->значение
34-
* @param std::unordered_multimap<std::string, FileIncoming> & - имена файлов, в которые записаны данные
30+
* @param request_data & - данные текущего запроса (заголовки, параметры, коллекции для хранения данных)
3531
*
3632
* @return bool - (true|false) - удачно ли были разобраны данные
3733
*/
3834
virtual bool parse
3935
(
40-
const Socket &,
41-
const std::chrono::milliseconds &,
36+
const Socket &sock,
4237
std::string &,
4338
const size_t,
44-
const std::unordered_map<std::string, std::string> &,
45-
std::unordered_multimap<std::string, std::string> &,
46-
std::unordered_multimap<std::string, FileIncoming> &
39+
std::unordered_map<std::string, std::string> &contentParams,
40+
struct request_parameters &rp
4741
) = 0;
4842
};
4943
};

httpserver/DataVariantFormUrlencoded.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ namespace HttpServer
1313
bool DataVariantFormUrlencoded::parse
1414
(
1515
const Socket &sock,
16-
const std::chrono::milliseconds &timeout,
1716
std::string &str,
1817
const size_t leftBytes,
19-
const std::unordered_map<std::string, std::string> &params,
20-
std::unordered_multimap<std::string, std::string> &data,
21-
std::unordered_multimap<std::string, FileIncoming> &files
18+
std::unordered_map<std::string, std::string> &contentParams,
19+
struct request_parameters &rp
2220
)
2321
{
2422
if (str.empty() )
@@ -40,7 +38,7 @@ namespace HttpServer
4038
std::string var_name = Utils::urlDecode(str.substr(var_pos, std::string::npos != var_end ? var_end - var_pos : std::string::npos) );
4139

4240
// Сохранить параметр с пустым значением
43-
data.emplace(std::move(var_name), "");
41+
rp.incoming_data.emplace(std::move(var_name), "");
4442
}
4543
else
4644
{
@@ -53,7 +51,7 @@ namespace HttpServer
5351
std::string var_value = Utils::urlDecode(str.substr(delimiter, std::string::npos != var_end ? var_end - delimiter : std::string::npos) );
5452

5553
// Сохранить параметр и значение
56-
data.emplace(std::move(var_name), std::move(var_value) );
54+
rp.incoming_data.emplace(std::move(var_name), std::move(var_value) );
5755
}
5856
}
5957

httpserver/DataVariantFormUrlencoded.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ namespace HttpServer
1313
virtual bool parse
1414
(
1515
const Socket &,
16-
const std::chrono::milliseconds &,
1716
std::string &,
1817
const size_t,
19-
const std::unordered_map<std::string, std::string> &,
20-
std::unordered_multimap<std::string, std::string> &,
21-
std::unordered_multimap<std::string, FileIncoming> &
18+
std::unordered_map<std::string, std::string> &contentParams,
19+
struct request_parameters &rp
2220
) override;
2321
};
2422
};

httpserver/DataVariantMultipartFormData.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,16 @@ namespace HttpServer
5656
bool DataVariantMultipartFormData::parse
5757
(
5858
const Socket &sock,
59-
const std::chrono::milliseconds &timeout,
6059
std::string &str,
6160
const size_t leftBytes,
62-
const std::unordered_map<std::string, std::string> &params,
63-
std::unordered_multimap<std::string, std::string> &data,
64-
std::unordered_multimap<std::string, FileIncoming> &files
61+
std::unordered_map<std::string, std::string> &contentParams,
62+
struct request_parameters &rp
6563
)
6664
{
6765
// Проверить есть ли в параметрах разделитель блоков данных
68-
auto it = params.find("boundary");
66+
auto it = contentParams.find("boundary");
6967

70-
if (params.cend() == it)
68+
if (contentParams.cend() == it)
7169
{
7270
return false;
7371
}
@@ -101,7 +99,7 @@ namespace HttpServer
10199
if (std::string::npos == str_cur)
102100
{
103101
// Получить следующий кусок данных
104-
if (false == append(sock, timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
102+
if (false == append(sock, rp.timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
105103
{
106104
return false;
107105
}
@@ -134,7 +132,7 @@ namespace HttpServer
134132
if (std::string::npos == headers_end)
135133
{
136134
// Получить следующий кусок данных
137-
if (false == append(sock, timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
135+
if (false == append(sock, rp.timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
138136
{
139137
return false;
140138
}
@@ -293,7 +291,7 @@ namespace HttpServer
293291
str.erase(str.begin(), str.end() - data_end.length() );
294292

295293
// Получить следующий кусок данных
296-
if (false == append(sock, timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
294+
if (false == append(sock, rp.timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
297295
{
298296
return false;
299297
}
@@ -306,7 +304,7 @@ namespace HttpServer
306304
file.write(str.data(), delimiter);
307305

308306
// Добавить данные в список
309-
files.emplace(it_name->second, FileIncoming(std::move(tmp_name), it_filetype->second, file.tellp() ) );
307+
rp.incoming_files.emplace(it_name->second, FileIncoming(std::move(tmp_name), it_filetype->second, file.tellp() ) );
310308

311309
file.close();
312310

@@ -349,7 +347,7 @@ namespace HttpServer
349347
str.erase(str.begin(), str.end() - data_end.length() );
350348

351349
// Получить следующий кусок данных
352-
if (false == append(sock, timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
350+
if (false == append(sock, rp.timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
353351
{
354352
return false;
355353
}
@@ -362,7 +360,7 @@ namespace HttpServer
362360
value.append(str.cbegin(), str.cbegin() + delimiter);
363361

364362
// Добавить данные в список
365-
data.emplace(it_name->second, std::move(value) );
363+
rp.incoming_data.emplace(it_name->second, std::move(value) );
366364

367365
// Если найден конец данных
368366
if (str.find(data_end, delimiter) == delimiter)
@@ -401,7 +399,7 @@ namespace HttpServer
401399
str.erase(str.begin(), str.end() - data_end.length() );
402400

403401
// Получить следующий кусок данных
404-
if (false == append(sock, timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
402+
if (false == append(sock, rp.timeout, buf, str, data_end, leftBytes, recv_len, read_len) )
405403
{
406404
return false;
407405
}

httpserver/DataVariantMultipartFormData.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ namespace HttpServer
1515
const Socket &,
1616
const std::chrono::milliseconds &,
1717
std::vector<std::string::value_type> &,
18-
std::string &, const std::string &,
18+
std::string &,
19+
const std::string &,
1920
const size_t &,
2021
size_t &,
2122
size_t &
@@ -25,12 +26,10 @@ namespace HttpServer
2526
virtual bool parse
2627
(
2728
const Socket &,
28-
const std::chrono::milliseconds &,
2929
std::string &,
3030
const size_t,
31-
const std::unordered_map<std::string, std::string> &,
32-
std::unordered_multimap<std::string, std::string> &,
33-
std::unordered_multimap<std::string, FileIncoming> &
31+
std::unordered_map<std::string, std::string> &contentParams,
32+
struct request_parameters &rp
3433
) override;
3534
};
3635
};

httpserver/DataVariantTextPlain.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,10 @@ namespace HttpServer
1111
bool DataVariantTextPlain::parse
1212
(
1313
const Socket &sock,
14-
const std::chrono::milliseconds &timeout,
1514
std::string &str,
1615
const size_t leftBytes,
17-
const std::unordered_map<std::string, std::string> &params,
18-
std::unordered_multimap<std::string, std::string> &data,
19-
std::unordered_multimap<std::string, FileIncoming> &files
16+
std::unordered_map<std::string, std::string> &contentParams,
17+
struct request_parameters &rp
2018
)
2119
{
2220
if (str.empty() )
@@ -38,7 +36,7 @@ namespace HttpServer
3836
std::string var_name = str.substr(var_pos, std::string::npos != var_end ? var_end - var_pos : std::string::npos);
3937

4038
// Сохранить параметр с пустым значением
41-
data.emplace(std::move(var_name), "");
39+
rp.incoming_data.emplace(std::move(var_name), "");
4240
}
4341
else
4442
{
@@ -51,7 +49,7 @@ namespace HttpServer
5149
std::string var_value = str.substr(delimiter, std::string::npos != var_end ? var_end - delimiter : std::string::npos);
5250

5351
// Сохранить параметр и значение
54-
data.emplace(std::move(var_name), std::move(var_value) );
52+
rp.incoming_data.emplace(std::move(var_name), std::move(var_value) );
5553
}
5654
}
5755

httpserver/DataVariantTextPlain.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ namespace HttpServer
1313
virtual bool parse
1414
(
1515
const Socket &,
16-
const std::chrono::milliseconds &,
1716
std::string &,
1817
const size_t,
19-
const std::unordered_map<std::string, std::string> &,
20-
std::unordered_multimap<std::string, std::string> &,
21-
std::unordered_multimap<std::string, FileIncoming> &
18+
std::unordered_map<std::string, std::string> &contentParams,
19+
struct request_parameters &rp
2220
) override;
2321
};
2422
};

httpserver/Event.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace HttpServer
2626
{
2727
std::unique_lock<std::mutex> lck(mtx);
2828

29-
auto status = cv.wait_for(lck, ms);
29+
auto const status = cv.wait_for(lck, ms);
3030

3131
if (false == manualy)
3232
{
@@ -40,7 +40,7 @@ namespace HttpServer
4040
{
4141
std::unique_lock<std::mutex> lck(mtx);
4242

43-
auto status = cv.wait_until(lck, tp);
43+
auto const status = cv.wait_until(lck, tp);
4444

4545
if (false == manualy)
4646
{

0 commit comments

Comments
 (0)