Skip to content

src/api/transport/impl/http/http_session.hpp

Namespaces

Name
sgns
sgns::api

Classes

Name
class sgns::api::HttpSession
HTTP session for api service.
struct sgns::api::HttpSession::Configuration

Source code

#ifndef SUPERGENIUS_SRC_API_TRANSPORT_BEAST_HTTP_SESSION_HPP
#define SUPERGENIUS_SRC_API_TRANSPORT_BEAST_HTTP_SESSION_HPP

#include <boost/asio/strand.hpp>
#include <boost/beast.hpp>
#include <chrono>
#include <cstdlib>
#include <memory>

#include "api/transport/session.hpp"
#include "base/logger.hpp"

namespace sgns::api {
  class HttpSession : public Session,
                      public std::enable_shared_from_this<HttpSession> {
    template <typename Body>
    using Request = boost::beast::http::request<Body>;

    template <typename Body>
    using Response = boost::beast::http::response<Body>;

    using StringBody = boost::beast::http::string_body;

    template <class Body>
    using RequestParser = boost::beast::http::request_parser<Body>;

    using HttpField = boost::beast::http::field;

    using HttpError = boost::beast::http::error;

   public:
    struct Configuration {
      static constexpr size_t kDefaultRequestSize = 10000u;
      static constexpr Duration kDefaultTimeout = std::chrono::seconds(30);

      size_t max_request_size{kDefaultRequestSize};
      Duration operation_timeout{kDefaultTimeout};
    };

    ~HttpSession() override = default;

    HttpSession(Context &context, Configuration config);

    Socket &socket() override {
      return stream_.socket();
    }

    void start() override;

    void respond(std::string_view response) override;

    SessionId id() const override {
      return 0ull;
    }

    SessionType type() const override {
      return SessionType::kHttp;
    }

   private:
    void stop();

    template <class Body>
    void handleRequest(Request<Body> &&request);

    void asyncRead();

    template <class Message>
    void asyncWrite(Message &&message);

    void onRead(boost::system::error_code ec, std::size_t size);

    void onWrite(boost::system::error_code ec, std::size_t, bool close);

    static auto makeBadResponse( std::string_view message, unsigned version, bool keep_alive );

    void reportError(boost::system::error_code ec, std::string_view message);

    static constexpr boost::beast::string_view kServerName = "SuperGenius";

    boost::asio::strand<boost::asio::io_context::executor_type> strand_;

    Configuration config_;              
    boost::beast::tcp_stream stream_;   
    boost::beast::flat_buffer buffer_;  

    using Parser = RequestParser<StringBody>;

    std::unique_ptr<Parser> parser_;  
    base::Logger logger_ = base::createLogger("http session");
  };

}  // namespace sgns::api

#endif  // SUPERGENIUS_SRC_API_TRANSPORT_BEAST_HTTP_SESSION_HPP

Updated on 2026-03-04 at 13:10:44 -0800