김민수

Initial commit

1 *.swp 1 *.swp
2 *.o 2 *.o
3 WebServer.exe 3 WebServer.exe
4 +/.vs/Web/v15
5 +/Debug
6 +/Web/Debug
......
1 +
2 +Microsoft Visual Studio Solution File, Format Version 12.00
3 +# Visual Studio 15
4 +VisualStudioVersion = 15.0.28010.2003
5 +MinimumVisualStudioVersion = 10.0.40219.1
6 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Web", "Web\Web.vcxproj", "{C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}"
7 +EndProject
8 +Global
9 + GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 + Debug|x64 = Debug|x64
11 + Debug|x86 = Debug|x86
12 + Release|x64 = Release|x64
13 + Release|x86 = Release|x86
14 + EndGlobalSection
15 + GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Debug|x64.ActiveCfg = Debug|x64
17 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Debug|x64.Build.0 = Debug|x64
18 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Debug|x86.ActiveCfg = Debug|Win32
19 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Debug|x86.Build.0 = Debug|Win32
20 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Release|x64.ActiveCfg = Release|x64
21 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Release|x64.Build.0 = Release|x64
22 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Release|x86.ActiveCfg = Release|Win32
23 + {C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}.Release|x86.Build.0 = Release|Win32
24 + EndGlobalSection
25 + GlobalSection(SolutionProperties) = preSolution
26 + HideSolutionNode = FALSE
27 + EndGlobalSection
28 + GlobalSection(ExtensibilityGlobals) = postSolution
29 + SolutionGuid = {634C2117-66CB-4787-A0DB-0B4C39468EBB}
30 + EndGlobalSection
31 +EndGlobal
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 + <ItemGroup Label="ProjectConfigurations">
4 + <ProjectConfiguration Include="Debug|Win32">
5 + <Configuration>Debug</Configuration>
6 + <Platform>Win32</Platform>
7 + </ProjectConfiguration>
8 + <ProjectConfiguration Include="Release|Win32">
9 + <Configuration>Release</Configuration>
10 + <Platform>Win32</Platform>
11 + </ProjectConfiguration>
12 + <ProjectConfiguration Include="Debug|x64">
13 + <Configuration>Debug</Configuration>
14 + <Platform>x64</Platform>
15 + </ProjectConfiguration>
16 + <ProjectConfiguration Include="Release|x64">
17 + <Configuration>Release</Configuration>
18 + <Platform>x64</Platform>
19 + </ProjectConfiguration>
20 + </ItemGroup>
21 + <PropertyGroup Label="Globals">
22 + <VCProjectVersion>15.0</VCProjectVersion>
23 + <ProjectGuid>{C5BB1A73-D2D1-4ECA-A57E-9FB64796750E}</ProjectGuid>
24 + <RootNamespace>Web</RootNamespace>
25 + <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
26 + </PropertyGroup>
27 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
28 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
29 + <ConfigurationType>Application</ConfigurationType>
30 + <UseDebugLibraries>true</UseDebugLibraries>
31 + <PlatformToolset>v141</PlatformToolset>
32 + <CharacterSet>MultiByte</CharacterSet>
33 + </PropertyGroup>
34 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
35 + <ConfigurationType>Application</ConfigurationType>
36 + <UseDebugLibraries>false</UseDebugLibraries>
37 + <PlatformToolset>v141</PlatformToolset>
38 + <WholeProgramOptimization>true</WholeProgramOptimization>
39 + <CharacterSet>MultiByte</CharacterSet>
40 + </PropertyGroup>
41 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
42 + <ConfigurationType>Application</ConfigurationType>
43 + <UseDebugLibraries>true</UseDebugLibraries>
44 + <PlatformToolset>v141</PlatformToolset>
45 + <CharacterSet>MultiByte</CharacterSet>
46 + </PropertyGroup>
47 + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
48 + <ConfigurationType>Application</ConfigurationType>
49 + <UseDebugLibraries>false</UseDebugLibraries>
50 + <PlatformToolset>v141</PlatformToolset>
51 + <WholeProgramOptimization>true</WholeProgramOptimization>
52 + <CharacterSet>MultiByte</CharacterSet>
53 + </PropertyGroup>
54 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
55 + <ImportGroup Label="ExtensionSettings">
56 + </ImportGroup>
57 + <ImportGroup Label="Shared">
58 + </ImportGroup>
59 + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
60 + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
61 + </ImportGroup>
62 + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
63 + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
64 + </ImportGroup>
65 + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
66 + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
67 + </ImportGroup>
68 + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
69 + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
70 + </ImportGroup>
71 + <PropertyGroup Label="UserMacros" />
72 + <PropertyGroup />
73 + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
74 + <ClCompile>
75 + <WarningLevel>Level3</WarningLevel>
76 + <Optimization>Disabled</Optimization>
77 + <SDLCheck>true</SDLCheck>
78 + <ConformanceMode>true</ConformanceMode>
79 + </ClCompile>
80 + <Link>
81 + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
82 + </Link>
83 + </ItemDefinitionGroup>
84 + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
85 + <ClCompile>
86 + <WarningLevel>Level3</WarningLevel>
87 + <Optimization>Disabled</Optimization>
88 + <SDLCheck>true</SDLCheck>
89 + <ConformanceMode>true</ConformanceMode>
90 + </ClCompile>
91 + </ItemDefinitionGroup>
92 + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
93 + <ClCompile>
94 + <WarningLevel>Level3</WarningLevel>
95 + <Optimization>MaxSpeed</Optimization>
96 + <FunctionLevelLinking>true</FunctionLevelLinking>
97 + <IntrinsicFunctions>true</IntrinsicFunctions>
98 + <SDLCheck>true</SDLCheck>
99 + <ConformanceMode>true</ConformanceMode>
100 + </ClCompile>
101 + <Link>
102 + <EnableCOMDATFolding>true</EnableCOMDATFolding>
103 + <OptimizeReferences>true</OptimizeReferences>
104 + </Link>
105 + </ItemDefinitionGroup>
106 + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
107 + <ClCompile>
108 + <WarningLevel>Level3</WarningLevel>
109 + <Optimization>MaxSpeed</Optimization>
110 + <FunctionLevelLinking>true</FunctionLevelLinking>
111 + <IntrinsicFunctions>true</IntrinsicFunctions>
112 + <SDLCheck>true</SDLCheck>
113 + <ConformanceMode>true</ConformanceMode>
114 + </ClCompile>
115 + <Link>
116 + <EnableCOMDATFolding>true</EnableCOMDATFolding>
117 + <OptimizeReferences>true</OptimizeReferences>
118 + </Link>
119 + </ItemDefinitionGroup>
120 + <ItemGroup>
121 + <ClCompile Include="..\base64\base64.cpp" />
122 + <ClCompile Include="..\main.cpp" />
123 + <ClCompile Include="..\socket\src\Socket.cpp" />
124 + <ClCompile Include="..\stdHelpers.cpp" />
125 + <ClCompile Include="..\UrlHelper.cpp" />
126 + <ClCompile Include="..\webserver.cpp" />
127 + </ItemGroup>
128 + <ItemGroup>
129 + <ClInclude Include="..\base64\base64.h" />
130 + <ClInclude Include="..\nlohmann\json.hpp" />
131 + <ClInclude Include="..\socket\src\Socket.h" />
132 + <ClInclude Include="..\stdHelpers.h" />
133 + <ClInclude Include="..\Tracer.h" />
134 + <ClInclude Include="..\UrlHelper.h" />
135 + <ClInclude Include="..\webserver.h" />
136 + </ItemGroup>
137 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
138 + <ImportGroup Label="ExtensionTargets">
139 + </ImportGroup>
140 +</Project>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 + <ItemGroup>
4 + <Filter Include="소스 파일">
5 + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
6 + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
7 + </Filter>
8 + <Filter Include="헤더 파일">
9 + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
10 + <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
11 + </Filter>
12 + <Filter Include="리소스 파일">
13 + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
14 + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
15 + </Filter>
16 + </ItemGroup>
17 + <ItemGroup>
18 + <ClCompile Include="..\main.cpp">
19 + <Filter>소스 파일</Filter>
20 + </ClCompile>
21 + <ClCompile Include="..\socket\src\Socket.cpp">
22 + <Filter>소스 파일</Filter>
23 + </ClCompile>
24 + <ClCompile Include="..\base64\base64.cpp">
25 + <Filter>소스 파일</Filter>
26 + </ClCompile>
27 + <ClCompile Include="..\stdHelpers.cpp">
28 + <Filter>소스 파일</Filter>
29 + </ClCompile>
30 + <ClCompile Include="..\UrlHelper.cpp">
31 + <Filter>소스 파일</Filter>
32 + </ClCompile>
33 + <ClCompile Include="..\webserver.cpp">
34 + <Filter>소스 파일</Filter>
35 + </ClCompile>
36 + </ItemGroup>
37 + <ItemGroup>
38 + <ClInclude Include="..\stdHelpers.h">
39 + <Filter>헤더 파일</Filter>
40 + </ClInclude>
41 + <ClInclude Include="..\Tracer.h">
42 + <Filter>헤더 파일</Filter>
43 + </ClInclude>
44 + <ClInclude Include="..\UrlHelper.h">
45 + <Filter>헤더 파일</Filter>
46 + </ClInclude>
47 + <ClInclude Include="..\webserver.h">
48 + <Filter>헤더 파일</Filter>
49 + </ClInclude>
50 + <ClInclude Include="..\base64\base64.h">
51 + <Filter>헤더 파일</Filter>
52 + </ClInclude>
53 + <ClInclude Include="..\socket\src\Socket.h">
54 + <Filter>헤더 파일</Filter>
55 + </ClInclude>
56 + <ClInclude Include="..\nlohmann\json.hpp">
57 + <Filter>헤더 파일</Filter>
58 + </ClInclude>
59 + </ItemGroup>
60 +</Project>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 + <PropertyGroup />
4 +</Project>
...\ No newline at end of file ...\ No newline at end of file
1 #include "webserver.h" 1 #include "webserver.h"
2 -#include "Socket.h" 2 +#include "socket/src/Socket.h"
3 +#include "nlohmann/json.hpp"
4 +
5 +std::string urlDecode(std::string const &eString) {
6 + std::string ret;
7 + int j;
8 + for (int i = 0; i < int(eString.length()); i++) {
9 + if (int(eString[i]) == 37) {
10 + sscanf_s(eString.substr(i + 1, 2).c_str(), "%x", &j);
11 + const auto ch = static_cast<char>(j);
12 + ret += ch;
13 + i = i + 2;
14 + }
15 + else {
16 + ret += eString[i];
17 + }
18 + }
19 + return (ret);
20 +}
3 21
4 void Request_Handler(webserver::http_request* r) { 22 void Request_Handler(webserver::http_request* r) {
5 Socket s = *(r->s_); 23 Socket s = *(r->s_);
...@@ -46,8 +64,9 @@ void Request_Handler(webserver::http_request* r) { ...@@ -46,8 +64,9 @@ void Request_Handler(webserver::http_request* r) {
46 for (std::map<std::string, std::string>::const_iterator i = r->params_.begin(); 64 for (std::map<std::string, std::string>::const_iterator i = r->params_.begin();
47 i != r->params_.end(); 65 i != r->params_.end();
48 i++) { 66 i++) {
67 +
49 68
50 - body += "<br>" + i->first + " = " + i->second; 69 + body += "<br>" + urlDecode( i->first) + " = " + i->second;
51 } 70 }
52 71
53 72
......
This diff could not be displayed because it is too large.
...@@ -36,14 +36,14 @@ ...@@ -36,14 +36,14 @@
36 36
37 37
38 #include "webserver.h" 38 #include "webserver.h"
39 -#include "socket.h" 39 +#include "socket/src/Socket.h"
40 #include "UrlHelper.h" 40 #include "UrlHelper.h"
41 -#include "base64.h" 41 +#include "base64/base64.h"
42 42
43 webserver::request_func webserver::request_func_=0; 43 webserver::request_func webserver::request_func_=0;
44 44
45 -unsigned webserver::Request(void* ptr_s) { 45 +unsigned webserver::Request(Socket* ptr_s) {
46 - Socket s = *(reinterpret_cast<Socket*>(ptr_s)); 46 + Socket s = *ptr_s;
47 47
48 std::string line = s.ReceiveLine(); 48 std::string line = s.ReceiveLine();
49 if (line.empty()) { 49 if (line.empty()) {
...@@ -62,7 +62,7 @@ unsigned webserver::Request(void* ptr_s) { ...@@ -62,7 +62,7 @@ unsigned webserver::Request(void* ptr_s) {
62 std::string path; 62 std::string path;
63 std::map<std::string, std::string> params; 63 std::map<std::string, std::string> params;
64 64
65 - size_t posStartPath = line.find_first_not_of(" ",3); 65 + const size_t posStartPath = line.find_first_not_of(" ",3);
66 66
67 SplitGetReq(line.substr(posStartPath), path, params); 67 SplitGetReq(line.substr(posStartPath), path, params);
68 68
...@@ -77,12 +77,12 @@ unsigned webserver::Request(void* ptr_s) { ...@@ -77,12 +77,12 @@ unsigned webserver::Request(void* ptr_s) {
77 static const std::string accept_encoding = "Accept-Encoding: " ; 77 static const std::string accept_encoding = "Accept-Encoding: " ;
78 static const std::string user_agent = "User-Agent: " ; 78 static const std::string user_agent = "User-Agent: " ;
79 79
80 - while(1) { 80 + while(true) {
81 line=s.ReceiveLine(); 81 line=s.ReceiveLine();
82 82
83 if (line.empty()) break; 83 if (line.empty()) break;
84 84
85 - unsigned int pos_cr_lf = line.find_first_of("\x0a\x0d"); 85 + const unsigned int pos_cr_lf = line.find_first_of("\x0a\x0d");
86 if (pos_cr_lf == 0) break; 86 if (pos_cr_lf == 0) break;
87 87
88 line = line.substr(0,pos_cr_lf); 88 line = line.substr(0,pos_cr_lf);
...@@ -92,7 +92,7 @@ unsigned webserver::Request(void* ptr_s) { ...@@ -92,7 +92,7 @@ unsigned webserver::Request(void* ptr_s) {
92 std::string encoded = line.substr(authorization.size()); 92 std::string encoded = line.substr(authorization.size());
93 std::string decoded = base64_decode(encoded); 93 std::string decoded = base64_decode(encoded);
94 94
95 - unsigned int pos_colon = decoded.find(":"); 95 + const unsigned int pos_colon = decoded.find(":");
96 96
97 req.username_ = decoded.substr(0, pos_colon); 97 req.username_ = decoded.substr(0, pos_colon);
98 req.password_ = decoded.substr(pos_colon+1 ); 98 req.password_ = decoded.substr(pos_colon+1 );
...@@ -118,11 +118,23 @@ unsigned webserver::Request(void* ptr_s) { ...@@ -118,11 +118,23 @@ unsigned webserver::Request(void* ptr_s) {
118 118
119 time_t ltime; 119 time_t ltime;
120 time(&ltime); 120 time(&ltime);
121 +
122 +#ifdef _CRT_SECURE_NO_WARNINGS
121 tm* gmt= gmtime(&ltime); 123 tm* gmt= gmtime(&ltime);
124 +#else
125 + tm gmt{};
126 + gmtime_s(&gmt, &ltime);
127 +#endif
122 128
123 static std::string const serverName = "RenesWebserver (Windows)"; 129 static std::string const serverName = "RenesWebserver (Windows)";
124 - 130 +
131 +#ifdef _CRT_SECURE_NO_WARNINGS
125 char* asctime_remove_nl = asctime(gmt); 132 char* asctime_remove_nl = asctime(gmt);
133 +#else
134 + char asctime_remove_nl[26];
135 + asctime_s(asctime_remove_nl,&gmt);
136 +#endif
137 +
126 asctime_remove_nl[24] = 0; 138 asctime_remove_nl[24] = 0;
127 139
128 s.SendBytes("HTTP/1.1 "); 140 s.SendBytes("HTTP/1.1 ");
...@@ -139,7 +151,7 @@ unsigned webserver::Request(void* ptr_s) { ...@@ -139,7 +151,7 @@ unsigned webserver::Request(void* ptr_s) {
139 s.SendLine(std::string("Date: ") + asctime_remove_nl + " GMT"); 151 s.SendLine(std::string("Date: ") + asctime_remove_nl + " GMT");
140 s.SendLine(std::string("Server: ") +serverName); 152 s.SendLine(std::string("Server: ") +serverName);
141 s.SendLine("Connection: close"); 153 s.SendLine("Connection: close");
142 - s.SendLine("Content-Type: text/html; charset=ISO-8859-1"); 154 + s.SendLine("Content-Type: text/html; charset=UTF-8");
143 s.SendLine("Content-Length: " + str_str.str()); 155 s.SendLine("Content-Length: " + str_str.str());
144 s.SendLine(""); 156 s.SendLine("");
145 s.SendLine(req.answer_); 157 s.SendLine(req.answer_);
...@@ -154,11 +166,11 @@ webserver::webserver(unsigned int port_to_listen, request_func r) { ...@@ -154,11 +166,11 @@ webserver::webserver(unsigned int port_to_listen, request_func r) {
154 SocketServer in(port_to_listen,5); 166 SocketServer in(port_to_listen,5);
155 167
156 request_func_ = r; 168 request_func_ = r;
157 - 169 + std::cout<<"Listening on port "<<port_to_listen<<std::endl;
158 - while (1) { 170 + while (true) {
159 Socket* ptr_s=in.Accept(); 171 Socket* ptr_s=in.Accept();
160 172
161 unsigned ret; 173 unsigned ret;
162 - _beginthreadex(0,0,Request,(void*) ptr_s,0,&ret); 174 + _beginthreadex(nullptr,0,Request, ptr_s,0,&ret);
163 } 175 }
164 } 176 }
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
25 25
26 */ 26 */
27 27
28 +#pragma once
28 #include <string> 29 #include <string>
29 #include <map> 30 #include <map>
30 31
...@@ -70,7 +71,11 @@ class webserver { ...@@ -70,7 +71,11 @@ class webserver {
70 71
71 72
72 private: 73 private:
73 - static unsigned __stdcall Request(void*); 74 + static unsigned __stdcall Request(void* ptr)
75 + {
76 + return Request(static_cast<Socket*>(ptr));
77 + }
78 + static unsigned __stdcall Request(Socket*);
74 static request_func request_func_; 79 static request_func request_func_;
75 }; 80 };
76 81
......