uvco 0.1
Loading...
Searching...
No Matches
uvco::examples::anonymous_namespace{http_server.cc} Namespace Reference

Functions

Promise< std::optional< std::string > > readHeaders (TcpStream &stream)
std::optional< std::tuple< std::string_view, std::string_view, std::string_view > > parseRequestLine (std::string_view requestLine)
void parseHeaders (std::string_view headersBlock, HttpRequest &request)
std::optional< HttpRequestparseRequest (std::string_view headersSection)
Promise< void > handleBadRequest (TcpStream &stream)

Variables

const size_t MAX_HEADER_SIZE = 8192

Function Documentation

◆ handleBadRequest()

Promise< void > uvco::examples::anonymous_namespace{http_server.cc}::handleBadRequest ( TcpStream & stream)
148 {
149 HttpResponse response;
150 response.statusCode = 400;
151 response.statusMessage = "Bad Request";
152 response.body = "Bad Request";
153 co_await stream.write(response.toString());
154 stream.close();
155}
Promise< size_t > write(std::string buf)
Definition stream.cc:114
void close()
Definition stream.cc:155
Definition http_server.h:31
std::string statusMessage
Definition http_server.h:33
std::string body
Definition http_server.h:35
std::string toString()
Definition http_server.cc:23
int statusCode
Definition http_server.h:32

◆ parseHeaders()

void uvco::examples::anonymous_namespace{http_server.cc}::parseHeaders ( std::string_view headersBlock,
HttpRequest & request )
103 {
104 size_t start = 0;
105 while (start < headersBlock.size()) {
106 const size_t end = headersBlock.find("\r\n", start);
107 if (end == std::string_view::npos) {
108 break;
109 }
110 const std::string_view headerLine = headersBlock.substr(start, end - start);
111 if (headerLine.empty()) {
112 start = end + 2;
113 continue;
114 }
115 const size_t colonPos = headerLine.find(": ");
116 if (colonPos != std::string_view::npos) {
117 request.headers.emplace_back(headerLine.substr(0, colonPos),
118 headerLine.substr(colonPos + 2));
119 }
120 start = end + 2;
121 }
122}
std::vector< std::pair< std::string_view, std::string_view > > headers
Definition http_server.h:28

◆ parseRequest()

std::optional< HttpRequest > uvco::examples::anonymous_namespace{http_server.cc}::parseRequest ( std::string_view headersSection)
124 {
125 const size_t requestLineEnd = headersSection.find("\r\n");
126 if (requestLineEnd == std::string_view::npos) {
127 return std::nullopt;
128 }
129
130 const std::optional<
131 std::tuple<std::string_view, std::string_view, std::string_view>>
132 requestLineParts =
133 parseRequestLine(headersSection.substr(0, requestLineEnd));
134 if (!requestLineParts) {
135 return std::nullopt;
136 }
137
138 HttpRequest request;
139 std::tie(request.method, request.path, request.version) = *requestLineParts;
140
141 const std::string_view headersBlock =
142 headersSection.substr(requestLineEnd + 2);
143 parseHeaders(headersBlock, request);
144
145 return request;
146}
std::optional< std::tuple< std::string_view, std::string_view, std::string_view > > parseRequestLine(std::string_view requestLine)
Definition http_server.cc:81
void parseHeaders(std::string_view headersBlock, HttpRequest &request)
Definition http_server.cc:103

◆ parseRequestLine()

std::optional< std::tuple< std::string_view, std::string_view, std::string_view > > uvco::examples::anonymous_namespace{http_server.cc}::parseRequestLine ( std::string_view requestLine)
81 {
82 const size_t methodEnd = requestLine.find(' ');
83 if (methodEnd == std::string_view::npos) {
84 return std::nullopt;
85 }
86 const std::string_view method = requestLine.substr(0, methodEnd);
87 requestLine.remove_prefix(methodEnd + 1);
88
89 const size_t pathEnd = requestLine.find(' ');
90 if (pathEnd == std::string_view::npos) {
91 return std::nullopt;
92 }
93 const std::string_view path = requestLine.substr(0, pathEnd);
94 const std::string_view version = requestLine.substr(pathEnd + 1);
95
96 if (method.empty() || path.empty() || version.empty()) {
97 return std::nullopt;
98 }
99
100 return std::make_tuple(method, path, version);
101}

◆ readHeaders()

Promise< std::optional< std::string > > uvco::examples::anonymous_namespace{http_server.cc}::readHeaders ( TcpStream & stream)
60 {
61 std::string requestBuffer;
62 char buffer[4096];
63 size_t headersEndPos = std::string::npos;
64
65 while (headersEndPos == std::string::npos) {
66 if (requestBuffer.length() > MAX_HEADER_SIZE) {
67 co_return std::nullopt;
68 }
69 auto bytesRead = co_await stream.read(std::span(buffer));
70 if (bytesRead == 0) {
71 co_return std::nullopt;
72 }
73 requestBuffer.append(buffer, bytesRead);
74 headersEndPos = requestBuffer.find("\r\n\r\n");
75 }
76
77 co_return requestBuffer.substr(0, headersEndPos + 4);
78}
Promise< std::optional< std::string > > read(size_t maxSize=defaultMaxReadSize)
Definition stream.cc:96
const size_t MAX_HEADER_SIZE
Definition http_server.cc:58

Variable Documentation

◆ MAX_HEADER_SIZE

const size_t uvco::examples::anonymous_namespace{http_server.cc}::MAX_HEADER_SIZE = 8192