-
Notifications
You must be signed in to change notification settings - Fork 0
/
post.cpp
153 lines (123 loc) · 7.21 KB
/
post.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include "request.hpp"
#include "response.hpp"
#include "post.hpp"
#include <fcntl.h>
#include <dirent.h>
std::string get_str_between(std::string str, std::string d1, std::string d2) {
size_t start_first = str.find(d1);
size_t end_first = start_first + d1.size() + 1;
size_t start_second = str.find(d2, end_first);
if (int(start_second - end_first - 2) > 0)
return str.substr(end_first, start_second - end_first - 2);
return ("");
}
std::string get_filename(std::string body) {
return get_str_between(body, "filename=", "\n");
}
std::string get_response_body(std::string response_string) {
std::string response;
response += "<!DOCTYPE html>\n<html>\n<head>\n<title>Webserv</title>\n<meta charset=\"UTF-8\">\n";
response += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
response += "<link rel=\"stylesheet\" href=\"https://www.w3schools.com/w3css/4/w3.css\">";
response += "<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Lato\">";
response += "<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\">";
response += "<style>\n\nbody,h1,h2,h3,h4,h5,h6 {font-family: \"Lato\", sans-serif;}";
response += "body, html {\nheight: 100%;\ncolor: rgb(45, 142, 45);\nline-height: 1.8;\n}\n\n";
response += "/* Create a Parallax Effect */\n";
response += ".bgimg-1 {\nbackground-attachment: fixed;\nbackground-position: center;\nbackground-repeat: no-repeat;\nbackground-size: cover;\n}\n\n";
response += "/* First image (Logo. Full height) */\n";
response += ".bgimg-1 {\n/*background-image: url('/w3images/parallax1.jpg');*/\nbackground-image: url('/image/miniRT_showcase.jpg');\nmin-height: 100%;\n}\n\n";
response += ".w3-wide {letter-spacing: 10px;}\nw3-hover-opacity {cursor: pointer;}\n\n";
response += "/* Turn off parallax scrolling for tablets and phones */\n";
response += "@media only screen and (max-device-width: 1600px) {\n";
response += ".bgimg-1 {\nbackground-attachment: scroll;\nmin-height: 400px;\n}\n";
response += "}\n</style>\n</head>\n<body>\n\n";
response += "<!-- Navbar (sit on top) -->\n";
response += "<div class=\"w3-top\">\n<div class=\"w3-bar\" id=\"myNavbar\">\n";
response += "<a class=\"w3-bar-item w3-button w3-hover-green w3-hide-medium w3-hide-large w3-right\" href=\"javascript:void(0);\" onclick=\"toggleFunction()\" title=\"Toggle Navigation Menu\">\n";
response += "<i class=\"fa fa-bars\"></i>\n</a>\n<a href=\"#home\" class=\"w3-bar-item w3-button w3-hover-green\">HOME</a>\n";
response += "<a href=\"#about\" class=\"w3-bar-item w3-button w3-hide-small w3-hover-green\"><i class=\"fa fa-user\"></i> REDIRECT</a>\n</div>\n\n";
response += "<!-- Navbar on small screens -->\n";
response += "<div id=\"navDemo\" class=\"w3-bar-block w3-white w3-hide w3-hide-large w3-hide-medium\">\n<a href=\"#about\" class=\"w3-bar-item w3-button\" onclick=\"toggleFunction()\">ABOUT</a>\n";
response += "<a href=\"#portfolio\" class=\"w3-bar-item w3-button\" onclick=\"toggleFunction()\">PORTFOLIO</a>\n<a href=\"#contact\" class=\"w3-bar-item w3-button\" onclick=\"toggleFunction()\">CONTACT</a>\n";
response += "<a href=\"#\" class=\"w3-bar-item w3-button\">SEARCH</a>\n</div>\n</div>\n\n";
response += "<!-- First Parallax Image with Logo Text -->\n";
response += "<div class=\"bgimg-1 w3-display-container w3-opacity-min\" id=\"home\">\n<div class=\"w3-display-middle\" style=\"white-space:nowrap;\">\n";
response += "<span class=\"w3-center w3-padding-large w3-black w3-text-green w3-xxlarge w3-wide\">" + response_string + "</span>\n</div>\n</div>\n\n";
response += "<!-- Container (About Section) -->\n";
response += "<div class=\"w3-center w3-padding-64\">\n";
response += "<a class=\"w3-xlarge\" href=\"/\">Go to home page</a></div>\n\n";
response += "<!-- Footer -->\n";
response += "<footer class=\"w3-center w3-dark-grey w3-padding-64\">\n";
response += "<a href=\"#home\" class=\"w3-button w3-green w3-xlarge\"><i class=\"fa fa-arrow-up w3-margin-right w3-xlarge\"></i class=\"w3-xlarge\">To the top</a>\n";
response += "<div class=\"w3-xlarge w3-section\">\n</div>\n";
response += "<p>Powered by <a href=\"https://www.w3schools.com/w3css/default.asp\" title=\"W3.CSS\" target=\"_blank\" class=\"w3-hover-text-green w3-large\">w3.css</a></p>\n</footer>\n\n";
response += "<script>\n// Modal Image Gallery\n";
response += "function onClick(element) {\n";
response += "document.getElementById(\"img01\").src = element.src;\ndocument.getElementById(\"modal01\").style.display = \"block\";\n";
response += "var captionText = document.getElementById(\"caption\");\ncaptionText.innerHTML = element.alt;\n}\n\n";
response += "// Change style of navbar on scroll\n";
response += "window.onscroll = function() {myFunction()};\nfunction myFunction() {\n";
response += "var navbar = document.getElementById(\"myNavbar\");\nif (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) {\n";
response += "navbar.className = \"w3-bar\" + \" w3-card\" + \" w3-animate-top\" + \" w3-green\";\n} else {\n";
response += "navbar.className = navbar.className.replace(\" w3-card w3-animate-top w3-green\", \"\");\n}\n}\n\n";
response += "// Used to toggle the menu on small screens when clicking on the menu button\n";
response += "function toggleFunction() {\nvar x = document.getElementById(\"navDemo\");\nif (x.className.indexOf(\"w3-show\") == -1) {";
response += "x.className += \" w3-show\";\n} else {\nx.className = x.className.replace(\" w3-show\", \"\");\n}\n}\n\n";
response += "</script>\n\n</body>\n</html>\n\n";
return response;
}
std::string get_post(t_request request, t_server server) {
std::string response_string;
unsigned int start = 0;
unsigned int end = 0;
if (!request.body.size()) {
return get_response("There's no body!", 400, 0);
} else if (request.body.size() > static_cast<unsigned long>(server.size_string)) {
response_string = "YOUR FILE WAS TOO BIG!\n";
return get_response(get_response_body(response_string), 413, 1);
}
while (start < request.body.size() - 1) {
if (request.body[start] == '\n' && request.body[start + 1] == '\r') {
break;
}
start++;
}
start += 3;
if (request.body.size() >= 3)
end = request.body.size() - 3;
while (end > 0) {
if (request.body[end] == '\r' || request.body[end] == '\n')
break;
end--;
}
end--;
std::string filename = get_filename(request.body);
if (filename.empty())
return get_response("There's no filename!", 400, 0);
DIR *dir;
struct dirent *ent;
if ((dir = opendir("tests/webpages/uploads/")) != NULL) {
while ((ent = readdir(dir)) != NULL) {
if (!filename.compare(std::string(ent->d_name))) {
response_string = "FILENAME ALREADY EXISTS";
closedir(dir);
return get_response(get_response_body(response_string), 200, 1);
}
}
closedir(dir);
} else {
perror("");
return get_response("", 500, 0);
}
std::string filepath = "tests/webpages/uploads/" + filename;
int fd = open(filepath.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0700);
if (fd < 0) {
perror("");
return get_response("", 500, 0);
}
write (fd, &request.body[start], end - start);
close(fd);
response_string = "YOUR FILE HAS BEEN SAVED!\n";
return get_response(get_response_body(response_string), 200, 1);
}