summaryrefslogtreecommitdiffstats
path: root/BrowserSource/Proxy/HTTPMapper.cpp
blob: af4f6d0669d7cec3464b1fe8074f254623f30453 (plain)
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();
	}
}