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
|
#include "HTTPMapper.h"
#include <sstream>
#include <map>
namespace {
// Source: RFC 2616 section 6.1.1
const std::map<int, std::string> kStatusCodeToString{
{100, "Continue" },
{101, "Switching Protocols"},
{200, "OK"},
{201, "Created"},
{202, "Accepted"},
{203, "Non-Authoritative Information"},
{204, "No Content"},
{205, "Reset Content"},
{206, "Partial Content"},
{300, "Multiple Choices"},
{301, "Moved Permanently"},
{302, "Found"},
{303, "See Other"},
{304, "Not Modified"},
{305, "Use Proxy"},
{307, "Temporary Redirect"},
{400, "Bad Request"},
{401, "Unauthorized"},
{402, "Payment Required"},
{403, "Forbidden"},
{404, "Not Found"},
{405, "Method Not Allowed"},
{406, "Not Acceptable"},
};
}
namespace WebServer {
std::string HTTPMapper::Map(const int status_code,
const std::string& payload, const ContentType type) {
switch (type) {
case HTML:
return HTTPMapperHTML().Map(status_code, payload);
case JSON:
return HTTPMapperJSON().Map(status_code, payload);
}
}
std::string HTTPMapperHTML::Map(const int status_code,
const std::string& payload) {
std::ostringstream oss;
// This might throw and crash the app, but that's ok, just don't use an unsupported code.
oss << "HTTP/1.1 " << status_code << " " << kStatusCodeToString.at(status_code) << "\r\n";
oss << "Content-Type: text/html\r\n";
oss << "Content-Length: " << std::to_string(payload.size()) << "\r\n";
oss << "\r\n";
oss << payload;
return oss.str();
}
std::string HTTPMapperJSON::Map(const int status_code,
const std::string& payload) {
std::ostringstream oss;
// This might throw and crash the app, but that's ok, just don't use an unsupported code.
oss << "HTTP/1.1 " << status_code << " " << kStatusCodeToString.at(status_code) << "\r\n";
oss << "Content-Type: application/json\r\n";
oss << "Content-Length: " << std::to_string(payload.size()) << "\r\n";
oss << "\r\n";
oss << payload;
return oss.str();
}
}
|