diff --git a/.clang-tidy b/.clang-tidy index d828b76..819b218 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,5 +1,5 @@ --- -Checks: 'clang-diagnostic-*,clang-analyzer-*,*,-llvmlibc-implementation-in-namespace,-modernize-use-trailing-return-type' +Checks: 'clang-diagnostic-*,clang-analyzer-*,*,-llvmlibc-*,-modernize-use-trailing-return-type' WarningsAsErrors: '' HeaderFilterRegex: '' AnalyzeTemporaryDtors: false diff --git a/CMakeLists.txt b/CMakeLists.txt index 164ebca..d3f6c2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.20) -project(basiccmake LANGUAGES CXX) +project(board LANGUAGES CXX) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(GlobalOptions) @@ -7,7 +7,7 @@ include(GNUInstallDirs) include(Format) # keep PUBLIC dependencies in sync with cmake/config.cmake.in -#find_package(foo REQUIRED) +find_package(Boost REQUIRED) add_subdirectory(src) diff --git a/cmake/GlobalOptions.cmake b/cmake/GlobalOptions.cmake index d13b295..ce3cdfb 100644 --- a/cmake/GlobalOptions.cmake +++ b/cmake/GlobalOptions.cmake @@ -1,3 +1,3 @@ add_compile_options(-Wall -Werror -Wno-unknown-warning-option) set(CMAKE_CXX_STANDARD 23) -set(CMAKE_CXX_CLANG_TIDY clang-tidy --config=) +#set(CMAKE_CXX_CLANG_TIDY clang-tidy --config=) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd5c956..27f65de 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable(${PROJECT_NAME} main.cc) target_link_libraries(${PROJECT_NAME} PRIVATE -) + Boost::boost) target_include_directories(${PROJECT_NAME} PUBLIC $ diff --git a/src/main.cc b/src/main.cc index 4cce7f6..1cf3d1c 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,3 +1,57 @@ +#include +#include +#include + +namespace asio = boost::asio; +namespace beast = boost::beast; +namespace http = beast::http; +using boost::asio::ip::tcp; + +class Server { + using tcp_acceptor = asio::use_awaitable_t<>::as_default_on_t; + using tcp_socket = asio::use_awaitable_t<>::as_default_on_t; + + asio::awaitable HandleRequest(tcp_socket socket) { + bool close; + beast::flat_buffer buffer; + + do { + http::request req; + co_await http::async_read(socket, buffer, req); + + http::response res{http::status::ok, req.version()}; + res.keep_alive(req.keep_alive()); + res.body() = "foo\n"; + co_await http::async_write(socket, res); + close = res.need_eof(); + } while (!close); + + socket.shutdown(tcp::socket::shutdown_send); + co_return; + } + + asio::awaitable Listen() { + auto executor = co_await asio::this_coro::executor; + tcp_acceptor acceptor{executor, {tcp::v4(), 8080}}; + + while (true) { + tcp_socket socket = co_await acceptor.async_accept(); + co_spawn(executor, HandleRequest(std::move(socket)), asio::detached); + } + } + + public: + Server(asio::io_context *context) { + co_spawn(*context, Listen(), asio::detached); + } +}; + int main() { + asio::io_context context; + asio::signal_set signals{context, SIGINT, SIGTERM}; + signals.async_wait([&](auto, auto) { context.stop(); }); + Server server{&context}; + + context.run(); return 0; }