18#ifndef TRINITYCORE_BASE_HTTP_SOCKET_H
19#define TRINITYCORE_BASE_HTTP_SOCKET_H
26#include <boost/beast/core/basic_stream.hpp>
27#include <boost/beast/http/parser.hpp>
28#include <boost/beast/http/string_body.hpp>
32using IoContextHttpSocket = boost::beast::basic_stream<boost::asio::ip::tcp, boost::asio::io_context::executor_type, boost::beast::unlimited_rate_policy>;
39 using IoContextHttpSocket::basic_stream;
43 return socket().is_open();
46 void close(boost::system::error_code& )
48 IoContextHttpSocket::close();
51 void shutdown(boost::asio::socket_base::shutdown_type what, boost::system::error_code& shutdownError)
53 socket().shutdown(what, shutdownError);
56 template<
typename WaitHandlerType>
57 void async_wait(boost::asio::socket_base::wait_type type, WaitHandlerType&& handler)
59 socket().async_wait(type, std::forward<WaitHandlerType>(handler));
62 template <
typename SettableSocketOption>
63 void set_option(SettableSocketOption
const& option, boost::system::error_code& ec)
65 socket().set_option(option, ec);
70 return socket().remote_endpoint();
100 static std::string GetClientInfo(boost::asio::ip::address
const& address,
uint16 port,
SessionState const* state);
123template <
typename SocketImpl>
139template<
typename Stream>
196 context.response.prepare_payload();
204 if (!context.response.keep_alive())
std::optional< T > Optional
Optional helper class to wrap optional values within.
size_type GetActiveSize() const
AbstractSocket(AbstractSocket &&other)=default
virtual std::string GetClientInfo() const =0
virtual void SendResponse(RequestContext &context)=0
Optional< boost::uuids::uuid > GetSessionId() const
virtual ~AbstractSocket()=default
virtual bool IsOpen() const =0
AbstractSocket & operator=(AbstractSocket &&other)=default
AbstractSocket(AbstractSocket const &other)=default
virtual void CloseSocket()=0
static bool ParseRequest(MessageBuffer &packet, RequestParser &parser)
virtual SessionState * GetSessionState() const =0
void LogRequestAndResponse(RequestContext const &context, MessageBuffer &buffer) const
static MessageBuffer SerializeResponse(Request const &request, Response const &response)
AbstractSocket & operator=(AbstractSocket const &other)=default
virtual boost::asio::ip::address const & GetRemoteIpAddress() const =0
Optional< RequestParser > _httpParser
virtual std::shared_ptr< SessionState > ObtainSessionState(RequestContext &context) const =0
BaseSocket & operator=(BaseSocket const &other)=delete
BaseSocket(BaseSocket const &other)=delete
bool IsOpen() const final
std::string GetClientInfo() const override
virtual RequestHandlerResult RequestHandler(RequestContext &context)=0
SocketReadCallbackResult ReadHandler() final
SessionState * GetSessionState() const override
BaseSocket(BaseSocket &&other)=delete
void SendResponse(RequestContext &context) final
boost::asio::ip::address const & GetRemoteIpAddress() const final
BaseSocket & operator=(BaseSocket &&other)=delete
bool HandleMessage(Request &request)
std::shared_ptr< SessionState > _state
void shutdown(boost::asio::socket_base::shutdown_type what, boost::system::error_code &shutdownError)
IoContextTcpSocket::endpoint_type remote_endpoint() const
void async_wait(boost::asio::socket_base::wait_type type, WaitHandlerType &&handler)
void set_option(SettableSocketOption const &option, boost::system::error_code &ec)
void close(boost::system::error_code &)
uint16 GetRemotePort() const
boost::asio::ip::address const & GetRemoteIpAddress() const
void QueuePacket(MessageBuffer &&buffer)
void DelayedCloseSocket()
Marks the socket for closing after write buffer becomes empty.
MessageBuffer & GetReadBuffer()
boost::beast::http::response< ResponseBody > Response
boost::beast::http::request_parser< RequestBody > RequestParser
boost::beast::http::response_parser< RequestBody > ResponseParser
boost::beast::basic_stream< boost::asio::ip::tcp, boost::asio::io_context::executor_type, boost::beast::unlimited_rate_policy > IoContextHttpSocket
boost::beast::http::request< RequestBody > Request
HttpConnectionInitializer(SocketImpl *socket)