aboutsummaryrefslogtreecommitdiff
path: root/src/common/network/Http
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-12-22 13:06:28 +0100
committerShauren <shauren.trinity@gmail.com>2025-12-22 13:06:28 +0100
commitb69a1a71c6b3c604f5eed1d0752f66981a4efc25 (patch)
tree762aefb04270e86b8aa2b6f2d527291baae8b6f5 /src/common/network/Http
parenta4bbb6197002d76d084ced8a0f6fa79ff7bcc922 (diff)
Core/Network: Fix invalid NetworkThread array access for derived classes that have additional data members (only HttpService threads were affected)
Diffstat (limited to 'src/common/network/Http')
-rw-r--r--src/common/network/Http/HttpService.h46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/common/network/Http/HttpService.h b/src/common/network/Http/HttpService.h
index 1549893576f..bca573f431d 100644
--- a/src/common/network/Http/HttpService.h
+++ b/src/common/network/Http/HttpService.h
@@ -113,9 +113,28 @@ template<typename Callable, typename SessionImpl>
concept HttpRequestHandler = invocable_r<Callable, RequestHandlerResult, std::shared_ptr<SessionImpl>, RequestContext&>;
template<typename SessionImpl>
-class HttpService : public SocketMgr<SessionImpl>, public DispatcherService, public SessionService
+class HttpNetworkThread final : public NetworkThread<SessionImpl>
{
public:
+ explicit HttpNetworkThread(SessionService* service) : _service(service) { }
+
+protected:
+ void SocketRemoved(std::shared_ptr<SessionImpl> const& session) override
+ {
+ if (Optional<boost::uuids::uuid> id = session->GetSessionId())
+ _service->MarkSessionInactive(*id);
+ }
+
+private:
+ SessionService* _service = nullptr;
+};
+
+template<typename SessionImpl>
+class HttpService : public SocketMgr<SessionImpl, HttpNetworkThread<SessionImpl>>, public DispatcherService, public SessionService
+{
+ using BaseSocketMgr = SocketMgr<SessionImpl, HttpNetworkThread<SessionImpl>>;
+
+public:
HttpService(std::string_view loggerSuffix) : DispatcherService(loggerSuffix), SessionService(loggerSuffix), _ioContext(nullptr), _logger("server.http.")
{
_logger.append(loggerSuffix);
@@ -123,7 +142,7 @@ public:
bool StartNetwork(Asio::IoContext& ioContext, std::string const& bindIp, uint16 port, int32 threadCount = 1) override
{
- if (!SocketMgr<SessionImpl>::StartNetwork(ioContext, bindIp, port, threadCount))
+ if (!BaseSocketMgr::StartNetwork(ioContext, bindIp, port, threadCount))
return false;
SessionService::Start(ioContext);
@@ -133,7 +152,7 @@ public:
void StopNetwork() override
{
SessionService::Stop();
- SocketMgr<SessionImpl>::StopNetwork();
+ BaseSocketMgr::StopNetwork();
}
// http handling
@@ -157,26 +176,11 @@ public:
}
protected:
- class Thread : public NetworkThread<SessionImpl>
- {
- protected:
- void SocketRemoved(std::shared_ptr<SessionImpl> const& session) override
- {
- if (Optional<boost::uuids::uuid> id = session->GetSessionId())
- _service->MarkSessionInactive(*id);
- }
-
- private:
- friend HttpService;
-
- SessionService* _service;
- };
-
- NetworkThread<SessionImpl>* CreateThreads() const override
+ HttpNetworkThread<SessionImpl>* CreateThreads() const final
{
- Thread* threads = new Thread[this->GetNetworkThreadCount()];
+ HttpNetworkThread<SessionImpl>* threads = static_cast<HttpNetworkThread<SessionImpl>*>(::operator new(sizeof(HttpNetworkThread<SessionImpl>) * this->GetNetworkThreadCount()));
for (int32 i = 0; i < this->GetNetworkThreadCount(); ++i)
- threads[i]._service = const_cast<HttpService*>(this);
+ new (&threads[i]) HttpNetworkThread<SessionImpl>(const_cast<HttpService*>(this));
return threads;
}