-
Notifications
You must be signed in to change notification settings - Fork 63
/
Copy pathcoro_http_200_ok_server.cpp
77 lines (68 loc) · 2.59 KB
/
coro_http_200_ok_server.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
#include <coro/coro.hpp>
auto main() -> int
{
auto make_http_200_ok_server = [](std::shared_ptr<coro::io_scheduler> scheduler) -> coro::task<void>
{
auto make_on_connection_task = [](coro::net::tcp::client client) -> coro::task<void>
{
std::string response =
R"(HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
)";
std::string buf(1024, '\0');
while (true)
{
// Wait for data to be available to read.
co_await client.poll(coro::poll_op::read);
auto [rstatus, rspan] = client.recv(buf);
switch (rstatus)
{
case coro::net::recv_status::ok:
// Make sure the client socket can be written to.
co_await client.poll(coro::poll_op::write);
client.send(std::span<const char>{response});
break;
case coro::net::recv_status::would_block:
break;
case coro::net::recv_status::closed:
default:
co_return;
}
}
};
co_await scheduler->schedule();
coro::net::tcp::server server{scheduler, coro::net::tcp::server::options{.port = 8888}};
while (true)
{
// Wait for a new connection.
auto pstatus = co_await server.poll();
switch (pstatus)
{
case coro::poll_status::event:
{
auto client = server.accept();
if (client.socket().is_valid())
{
scheduler->spawn(make_on_connection_task(std::move(client)));
} // else report error or something if the socket was invalid or could not be accepted.
}
break;
case coro::poll_status::error:
case coro::poll_status::closed:
case coro::poll_status::timeout:
default:
co_return;
}
}
co_return;
};
std::vector<coro::task<void>> workers{};
for (size_t i = 0; i < std::thread::hardware_concurrency(); ++i)
{
auto scheduler = coro::io_scheduler::make_shared(coro::io_scheduler::options{
.execution_strategy = coro::io_scheduler::execution_strategy_t::process_tasks_inline});
workers.push_back(make_http_200_ok_server(scheduler));
}
coro::sync_wait(coro::when_all(std::move(workers)));
}