Stroika Library 3.0d23x
 
Loading...
Searching...
No Matches
LoggingInterceptor.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#include "Stroika/Frameworks/StroikaPreComp.h"
5
7#include "Stroika/Foundation/IO/Network/HTTP/Exception.h"
9
10#include "LoggingInterceptor.h"
11
12using namespace Stroika::Foundation;
14using namespace Stroika::Foundation::Execution;
15using namespace Stroika::Foundation::Memory;
16
17using namespace Stroika::Frameworks;
18using namespace Stroika::Frameworks::WebServer;
19
20/*
21 ********************************************************************************
22 ******************************* WebServer::ILogHandler *************************
23 ********************************************************************************
24 */
25shared_ptr<ILogHandler::MessageInstance> ILogHandler::Started (Message& m)
26{
27 return Memory::MakeSharedPtr<MessageInstance> (m, Time::GetTickCount ());
28}
29
30/*
31 ********************************************************************************
32 *********************** WebServer::LoggingInterceptor **************************
33 ********************************************************************************
34 */
35struct LoggingInterceptor::Rep_ : Interceptor::_IRep {
36 Rep_ (const shared_ptr<ILogHandler>& logger)
37 : fLogger_{logger}
38 {
39 }
40 virtual void HandleFault (Message& m, [[maybe_unused]] const exception_ptr& e) const noexcept override
41 {
42 shared_ptr<ILogHandler::MessageInstance> logID;
43 {
44 auto rwLock = fOngoingMessages_.rwget ();
45 Assert (rwLock->Lookup (&m));
46 logID = *rwLock->Lookup (&m);
47 rwLock->Remove (&m);
48 }
49 fLogger_->Completed (logID);
50 }
51 virtual void HandleMessage (Message& m) const override
52 {
53 shared_ptr<ILogHandler::MessageInstance> logID = fLogger_->Started (m);
54 Assert (not fOngoingMessages_->Lookup (&m).has_value ());
55 fOngoingMessages_.rwget ().rwref ().Add (&m, logID);
56 }
57 virtual void CompleteNormally (Message& m) const override
58 {
59 shared_ptr<ILogHandler::MessageInstance> logID;
60 {
61 auto rwLock = fOngoingMessages_.rwget ();
62 Assert (rwLock->Lookup (&m));
63 logID = *rwLock->Lookup (&m);
64 rwLock->Remove (&m);
65 }
66 fLogger_->Completed (logID);
67 }
68 virtual String ToString () const override
69 {
70 return "LoggingInterceptor"sv;
71 }
72 shared_ptr<ILogHandler> fLogger_;
74};
75
76LoggingInterceptor::LoggingInterceptor (const shared_ptr<ILogHandler>& logger)
77 : inherited{Memory::MakeSharedPtr<Rep_> (logger)}
78{
79}
auto MakeSharedPtr(ARGS_TYPE &&... args) -> shared_ptr< T >
same as make_shared, but if type T has block allocation, then use block allocation for the 'shared pa...
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
Wrap any object with Synchronized<> and it can be used similarly to the base type,...
STRING_TYPE ToString(FLOAT_TYPE f, const ToStringOptions &options={})