159 {
160 while (true) {
161 const std::optional<std::string> headersStrOpt =
162 co_await readHeaders(stream);
163 if (!headersStrOpt) {
164 co_await handleBadRequest(stream);
165 co_return;
166 }
167
168 const std::optional<HttpRequest> requestOpt = parseRequest(*headersStrOpt);
169 if (!requestOpt) {
170 co_await handleBadRequest(stream);
171 co_return;
172 }
173
174 const HttpRequest &request = *requestOpt;
175
176 bool closeConnection = true;
177 for (const auto &header : request.headers) {
178 if (boost::iequals(header.first, "connection") &&
179 boost::iequals(header.second, "keep-alive")) {
180 closeConnection = false;
181 break;
182 }
183 }
184
187 if (handler) {
188 response = co_await handler(request);
189 } else {
191 }
192
193 if (closeConnection) {
194 response.headers.emplace_back("Connection", "close");
195 } else {
196 response.headers.emplace_back("Connection", "keep-alive");
197 }
198
199 co_await stream.
write(response.toString());
200
201 if (closeConnection) {
203 co_return;
204 }
205 }
206}
Promise< size_t > write(std::string buf)
Definition stream.cc:114
void close()
Definition stream.cc:155
HttpHandler getHandler(const std::string &path) const
Definition http_server.cc:41
std::function< Promise< HttpResponse >(const HttpRequest &)> HttpHandler
Definition http_server.h:42
Promise< HttpResponse > notFoundHandler(const HttpRequest &)
A handler returning a 404 error.
Definition http_server.cc:49
Definition http_server.h:31