From 4aa991e7e4450232df4ceda0b2f439bccce1d260 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 8 Apr 2025 19:15:16 +0200 Subject: Core/Network: Socket refactors * Devirtualize calls to Read and Update by marking concrete implementations as final * Removed derived class template argument * Specialize boost::asio::basic_stream_socket for boost::asio::io_context instead of type-erased any_io_executor * Make socket initialization easier composable (before entering Read loop) * Remove use of deprecated boost::asio::null_buffers and boost::beast::ssl_stream (cherry picked from commit e8b2be3527c7683e8bfca70ed7706fc20da566fd) --- src/server/bnetserver/REST/LoginHttpSession.h | 64 +++++++-------------------- 1 file changed, 15 insertions(+), 49 deletions(-) (limited to 'src/server/bnetserver/REST/LoginHttpSession.h') diff --git a/src/server/bnetserver/REST/LoginHttpSession.h b/src/server/bnetserver/REST/LoginHttpSession.h index 6bd1ec113d0..c15442f9e0c 100644 --- a/src/server/bnetserver/REST/LoginHttpSession.h +++ b/src/server/bnetserver/REST/LoginHttpSession.h @@ -18,10 +18,8 @@ #ifndef TRINITYCORE_LOGIN_HTTP_SESSION_H #define TRINITYCORE_LOGIN_HTTP_SESSION_H -#include "HttpSocket.h" -#include "HttpSslSocket.h" +#include "BaseHttpSocket.h" #include "SRP6.h" -#include namespace Battlenet { @@ -30,59 +28,27 @@ struct LoginSessionState : public Trinity::Net::Http::SessionState std::unique_ptr Srp; }; -class LoginHttpSessionWrapper; -std::shared_ptr ObtainSessionState(Trinity::Net::Http::RequestContext& context, boost::asio::ip::address const& remoteAddress); - -template typename SocketImpl> -class LoginHttpSession : public SocketImpl> +class LoginHttpSession : public Trinity::Net::Http::AbstractSocket, public std::enable_shared_from_this { - using BaseSocket = SocketImpl>; - public: - explicit LoginHttpSession(boost::asio::ip::tcp::socket&& socket, LoginHttpSessionWrapper& owner); - ~LoginHttpSession(); - - void Start() override; + static constexpr std::string_view SESSION_ID_COOKIE = "JSESSIONID="; - void CheckIpCallback(PreparedQueryResult result); + explicit LoginHttpSession(Trinity::Net::IoContextTcpSocket&& socket); - Trinity::Net::Http::RequestHandlerResult RequestHandler(Trinity::Net::Http::RequestContext& context) override; - - LoginSessionState* GetSessionState() const { return static_cast(this->_state.get()); } - -protected: - std::shared_ptr ObtainSessionState(Trinity::Net::Http::RequestContext& context) const override - { - return Battlenet::ObtainSessionState(context, this->GetRemoteIpAddress()); - } - - LoginHttpSessionWrapper& _owner; -}; - -class LoginHttpSessionWrapper : public Trinity::Net::Http::AbstractSocket, public std::enable_shared_from_this -{ -public: - static constexpr std::string_view SESSION_ID_COOKIE = "JSESSIONID"; - - explicit LoginHttpSessionWrapper(boost::asio::ip::tcp::socket&& socket); - - void Start() { return std::visit([&](auto&& socket) { return socket->Start(); }, _socket); } - bool Update() { return std::visit([&](auto&& socket) { return socket->Update(); }, _socket); } - boost::asio::ip::address GetRemoteIpAddress() const { return std::visit([&](auto&& socket) { return socket->GetRemoteIpAddress(); }, _socket); } - bool IsOpen() const { return std::visit([&](auto&& socket) { return socket->IsOpen(); }, _socket); } - void CloseSocket() { return std::visit([&](auto&& socket) { return socket->CloseSocket(); }, _socket); } + void Start() override; + bool Update() override { return _socket->Update(); } + boost::asio::ip::address const& GetRemoteIpAddress() const override { return _socket->GetRemoteIpAddress(); } + bool IsOpen() const override { return _socket->IsOpen(); } + void CloseSocket() override { return _socket->CloseSocket(); } - void SendResponse(Trinity::Net::Http::RequestContext& context) override { return std::visit([&](auto&& socket) { return socket->SendResponse(context); }, _socket); } - void QueueQuery(QueryCallback&& queryCallback) override { return std::visit([&](auto&& socket) { return socket->QueueQuery(std::move(queryCallback)); }, _socket); } - std::string GetClientInfo() const override { return std::visit([&](auto&& socket) { return socket->GetClientInfo(); }, _socket); } - Optional GetSessionId() const override { return std::visit([&](auto&& socket) { return socket->GetSessionId(); }, _socket); } - LoginSessionState* GetSessionState() const { return std::visit([&](auto&& socket) { return socket->GetSessionState(); }, _socket); } + void SendResponse(Trinity::Net::Http::RequestContext& context) override { return _socket->SendResponse(context); } + void QueueQuery(QueryCallback&& queryCallback) override { return _socket->QueueQuery(std::move(queryCallback)); } + std::string GetClientInfo() const override { return _socket->GetClientInfo(); } + LoginSessionState* GetSessionState() const override { return static_cast(_socket->GetSessionState()); } private: - std::variant< - std::shared_ptr>, - std::shared_ptr> - > _socket; + std::shared_ptr _socket; }; } + #endif // TRINITYCORE_LOGIN_HTTP_SESSION_H -- cgit v1.2.3