{"id":15047556,"url":"https://github.com/0xdead4ead/beasthttp","last_synced_at":"2025-04-07T18:15:18.529Z","repository":{"id":34137626,"uuid":"142205246","full_name":"0xdead4ead/BeastHttp","owner":"0xdead4ead","description":"Provides helper tools for creating RESTful services using Boost.Beast","archived":false,"fork":false,"pushed_at":"2023-04-19T19:32:06.000Z","size":777,"stargazers_count":263,"open_issues_count":20,"forks_count":34,"subscribers_count":21,"default_branch":"dev","last_synced_at":"2025-04-07T18:14:56.371Z","etag":null,"topics":["asio","beast","boost","cpp11","cpp14","http","https","server"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/0xdead4ead.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-24T19:42:31.000Z","updated_at":"2025-02-27T14:55:03.000Z","dependencies_parsed_at":"2025-01-15T05:14:49.186Z","dependency_job_id":"b16508c4-40dc-40ec-a1db-e8954f3294e7","html_url":"https://github.com/0xdead4ead/BeastHttp","commit_stats":{"total_commits":368,"total_committers":7,"mean_commits":52.57142857142857,"dds":0.07065217391304346,"last_synced_commit":"f4c3bda9ebc06a2ed127911f6cee39db1236f007"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xdead4ead%2FBeastHttp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xdead4ead%2FBeastHttp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xdead4ead%2FBeastHttp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xdead4ead%2FBeastHttp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/0xdead4ead","download_url":"https://codeload.github.com/0xdead4ead/BeastHttp/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247704571,"owners_count":20982298,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asio","beast","boost","cpp11","cpp14","http","https","server"],"created_at":"2024-09-24T21:00:13.018Z","updated_at":"2025-04-07T18:15:18.511Z","avatar_url":"https://github.com/0xdead4ead.png","language":"C++","readme":"# SYNOPSIS [![license][badge.license]][license] [![build][badge.build]][build] ![badge.cpp](https://img.shields.io/badge/c++-11/14-ff69b4.svg?style=flat-square)\n\n[badge.license]: http://img.shields.io/badge/license-BSD%E2%80%932%E2%80%93Clause-blue.svg?style=flat-square\n[badge.build]: https://img.shields.io/travis/0xdead4ead/BeastHttp.svg?style=flat-square\u0026logo=travis\n\n[license]: https://github.com/0xdead4ead/BeastHttp/blob/master/LICENSE\n[build]: https://travis-ci.org/0xdead4ead/BeastHttp\n\nEasy HTTP (Header-only) library implemented using minimum C++11 and Boost.Beast. Allows you to get or provide REST resources available from an application in C ++. Use all the features of the Boost.Beast when constructing queries and answers.\n\n# FEATURES\n\n* HTTP 1.0 / 1.1\n* TLS/SSL\n* Pipeline request\n* Used I/O multiplexing model (Asio library implementation)\n* Timer manage (default action: Closing connection)\n* Server-Sent Events\n* Simple way to dynamic add REST resources using regex for path, and anonymous functions\n* Support accepted plain and SSL session on the same port\n\n# DEPENDENCIES\n\n* Boost Libraries \u003e= 1.70.0\n* [`Boost.Asio`](https://github.com/boostorg/asio), [`Boost.Beast`](https://github.com/boostorg/beast/tree/develop)\n* [`OpenSSL`](https://github.com/openssl/openssl) (optional)\n* [`Boost.LexicalCast`](https://github.com/boostorg/lexical_cast) (optional)\n\n# USAGE\n\nMore examples is [`here...`](https://github.com/0xdead4ead/BeastHttp/tree/dev/BeastHttp/src/examples)\nThe following notes show the standard syntax for setting up routes and starting a server!\n\nAlias's represent instances of default classes for reactive (select/epool) design.\n\n```cpp\n\n    using namespace _0xdead4ead;\n    namespace beast = boost::beast;\n\n    using http_session = http::reactor::_default::session_type;\n    using http_listener = http::reactor::_default::listener_type;\n\n```\n\nCreating a new callback functions storage and route path for GET request with \"/\" resource:\n\n```cpp\n\n    static const std::regex::flag_type regex_flags = std::regex::ECMAScript;\n\n    http::basic_router\u003chttp_session\u003e router{regex_flags};\n\n    router.get(\"^/$\", [](auto beast_http_request, auto context) {\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"Main page\\n\", \"text/html\"));\n    });\n\n    router.all(\"^.*$\", [](auto beast_http_request, auto context) {\n        context.send(make_404\u003cbeast::http::string_body\u003e(beast_http_request, \"Resource is not found\\n\", \"text/html\"));\n    });\n\n    // or so ...\n\n    using http::literals::operator\"\"_get;\n\n    \"^/$\"_get.advance(router, [](auto beast_http_request, auto context) {\n        // as above...\n    });\n\n    \"^.*$\"_all.advance(router, [](auto beast_http_request, auto context) {\n        // as above...\n    });\n\n```\n\nIt is possible to add multiple handlers for one route. For movement on them `std::next` or `std::advance` is used:\n\n```cpp\n    router.get(\"^/a/b$\",\n       [](auto /*beast_http_request*/, auto /*context*/, auto iterator){\n        // process /a\n        std::next(iterator)();\n    }, [](auto /*beast_http_request*/, auto /*context*/){\n        // process /b\n    });\n\n```\n\nGetting a parameter from a URI. Request send example `curl localhost --request 'GET' --request-target '/user/param?y=1992'`:\n\n```cpp\n\n    using pack = http::param::pack\u003cint\u003e;\n\n    router.param\u003cpack\u003e().get(\"^/user/param[?]y=(\\\\d+)$\",\n       [](auto /*beast_http_request*/, auto /*context*/, auto args){\n        assert(std::get\u003c0\u003e(args) == 1992);\n    });\n\n    // or\n\n    router.param\u003cpack\u003e().get(\"^/user/param[?]y=(\\\\d+)$\",\n       [](auto /*beast_http_request*/, auto /*context*/, auto iterator, auto /*args*/){\n        // process /user\n        std::next(iterator)();\n    }, [](auto /*beast_http_request*/, auto /*context*/, auto args){\n        // process /param\n        assert(std::get\u003c0\u003e(args) == 1992);\n    });\n\n```\n\nGetting a parameter using a string literal (as above) :\n\n```cpp\n\n    // For value f'n is required c++14\n    using http::literals::value;\n    using http::literals::operator\"\"_c;\n\n    auto param = router.param\u003cpack\u003e();\n\n    \"^/user/param[?]y=(\\\\d+)$\"_get.advance(std::move(param),\n       [](auto /*beast_http_request*/, auto /*context*/, auto args){\n        assert(value(args, 0_c) == 1992);\n    });\n\n```\n\nCreate modular, mounted route handlers:\n\n```cpp\n\n    http::basic_router\u003chttp_session\u003e animals{regex_flags};\n\n    animals.get(\"^/cat$\", [](auto beast_http_request, auto context){ // '/animals/cat'\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"me-ow\\n\", \"text/html\"));\n    });\n\n    animals.get(\"^/dog$\", [](auto beast_http_request, auto context){ // '/animals/dog'\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"aw! aw! Rrrrr\\n\", \"text/html\"));\n    });\n\n    animals.get(\"^/mouse$\", [](auto beast_http_request, auto context){ // '/animals/mouse'\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"...\\n\", \"text/html\"));\n    });\n\n    animals.get(\"^[/]??$\", [](auto beast_http_request, auto context){ // '/animals' or '/animals/'\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"animals home page\\n\", \"text/html\"));\n    });\n\n    router.use(\"^/animals$\", animals);\n\n```\n\nCreate handlers routes, forming a chain, for the route path:\n\n```cpp\n\n    http::chain_router\u003chttp_session\u003e books{regex_flags};\n\n    books.route(\"^/book$\")\n            .get([](auto beast_http_request, auto context) {\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"get a random book\\n\", \"text/html\"));\n    })\n            .post([](auto beast_http_request, auto context) {\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"add a book\\n\", \"text/html\"));\n    })\n            .put([](auto beast_http_request, auto context) {\n        context.send(make_200\u003cbeast::http::string_body\u003e(beast_http_request, \"update the book\\n\", \"text/html\"));\n    });\n\n    router.use(\"^/books$\", books);\n\n```\n\nStart listening on 0.0.0.0:8080\n\n```cpp\n\n    // global namespace\n    static boost::asio::io_context ioc;\n    static boost::asio::posix::stream_descriptor out{ioc, ::dup(STDERR_FILENO)};\n    //\n\n    const auto\u0026 onError = [](auto system_error_code, auto from){\n        http::out::pushn\u003cstd::ostream\u003e(\n                    out, \"From:\", from, \"Info:\", system_error_code.message());\n    };\n\n    const auto\u0026 onAccept = [\u0026](auto asio_socket){\n        auto endpoint = asio_socket.remote_endpoint();\n\n        http::out::prefix::version::time::pushn\u003cstd::ostream\u003e(\n                    out, endpoint.address().to_string() + ':' + std::to_string(endpoint.port()), \"connected!\");\n\n        http_session::recv(std::move(asio_socket), router, onError);\n    };\n\n    auto const address = boost::asio::ip::address_v4::any();\n    auto const port = static_cast\u003cunsigned short\u003e(8080);\n\n    http_listener::launch(ioc, {address, port}, onAccept, onError);\n\n```\n\nRun the I/O service on the requested number of threads:\n\n```cpp\n\n    std::thread t{[](){\n        ioc.run();\n    }};\n\n    // do other work...\n\n    t.join();\n\n```\n* Copyright (c) [@Evgeny Tixonow](https://github.com/0xdead4ead) 2018-2019\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xdead4ead%2Fbeasthttp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0xdead4ead%2Fbeasthttp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xdead4ead%2Fbeasthttp/lists"}