99-- of inbound connections) and thus should only be used in a safe environment.
1010--
1111-- The module should be imported qualified.
12- module Ouroboros.Network.Server.Simple where
12+ module Ouroboros.Network.Server.Simple
13+ ( with
14+ , ServerTracer (.. )
15+ ) where
1316
1417import Control.Applicative (Alternative )
1518import Control.Concurrent.JobPool qualified as JobPool
@@ -18,6 +21,7 @@ import Control.Monad.Class.MonadFork (MonadFork)
1821import Control.Monad.Class.MonadSTM
1922import Control.Monad.Class.MonadThrow
2023import Control.Monad.Class.MonadTimer.SI (MonadDelay , MonadTimer )
24+ import Control.Tracer (Tracer , traceWith )
2125import Data.ByteString.Lazy qualified as BL
2226import Data.Functor (void )
2327import Data.Typeable (Typeable )
@@ -33,13 +37,11 @@ import Ouroboros.Network.Snocket (Snocket)
3337import Ouroboros.Network.Snocket qualified as Snocket
3438import Ouroboros.Network.Socket
3539
40+ data ServerTracer addr
41+ = AcceptException SomeException
42+ | ConnectionHandlerException (ConnectionId addr ) SomeException
43+ deriving Show
3644
37- -- TODO: add tracers:
38- --
39- -- * accept errors,
40- -- * errors thrown by a connection handler thread,
41- -- * mux tracers
42- --
4345with :: forall fd addr vNumber vData m a b .
4446 ( Alternative (STM m ),
4547 MonadAsync m ,
@@ -54,14 +56,16 @@ with :: forall fd addr vNumber vData m a b.
5456 Show vNumber
5557 )
5658 => Snocket m fd addr
59+ -> Tracer m (ServerTracer addr )
60+ -> Mx. TracersWithBearer (ConnectionId addr ) m
5761 -> Mx. MakeBearer m fd
5862 -> (fd -> addr -> m () )
5963 -> addr
6064 -> HandshakeArguments (ConnectionId addr ) vNumber vData m
6165 -> Versions vNumber vData (SomeResponderApplication addr BL. ByteString m b )
6266 -> (addr -> Async m Void -> m a )
6367 -> m a
64- with sn makeBearer configureSock addr handshakeArgs versions k =
68+ with sn tracer muxTracers makeBearer configureSock addr handshakeArgs versions k =
6569 JobPool. withJobPool $ \ jobPool ->
6670 bracket
6771 (do sd <- Snocket. open sn (Snocket. addrFamily sn addr)
@@ -71,49 +75,59 @@ with sn makeBearer configureSock addr handshakeArgs versions k =
7175 addr' <- Snocket. getLocalAddr sn sd
7276 pure (sd, addr'))
7377 (Snocket. close sn . fst )
74- (\ (sock, addr' ) ->
78+ (\ (sock, localAddress ) ->
7579 -- accept loop
76- withAsync (Snocket. accept sn sock >>= acceptLoop jobPool) (k addr')
80+ withAsync (Snocket. accept sn sock >>= acceptLoop jobPool localAddress)
81+ (k localAddress)
7782 )
7883 where
7984 acceptLoop :: JobPool. JobPool () m ()
85+ -> addr
8086 -> Snocket. Accept m fd addr
8187 -> m Void
82- acceptLoop jobPool Snocket. Accept { Snocket. runAccept } = do
88+ acceptLoop
89+ jobPool
90+ localAddress
91+ Snocket. Accept { Snocket. runAccept }
92+ = do
8393 (accepted, acceptNext) <- runAccept
8494 acceptOne accepted
85- acceptLoop jobPool acceptNext
95+ acceptLoop jobPool
96+ localAddress
97+ acceptNext
8698 where
8799 -- handle accept failures and fork a connection thread which performs
88100 -- a handshake and runs mux
89101 acceptOne :: Snocket. Accepted fd addr -> m ()
90102 acceptOne (Snocket. AcceptFailure e)
91103 | Just ioErr <- fromException e
92104 , isECONNABORTED ioErr
93- = return ( )
105+ = traceWith tracer ( AcceptException e )
94106 acceptOne (Snocket. AcceptFailure e)
95- = throwIO e
107+ = do traceWith tracer (AcceptException e)
108+ throwIO e
96109
97- acceptOne (Snocket. Accepted sock' remoteAddr) = do
98- let connThread = do
110+ acceptOne (Snocket. Accepted sock' remoteAddress) = do
111+ let connId = ConnectionId { localAddress, remoteAddress }
112+ connThread = do
99113 -- connection responder thread
100- let connId = ConnectionId addr remoteAddr
101114 bearer <- Mx. getBearer makeBearer (- 1 ) sock' Nothing
102- configureSock sock' addr
115+ configureSock sock' localAddress
103116 r <- runHandshakeServer bearer connId handshakeArgs versions
104117 case r of
105118 Left (HandshakeProtocolLimit e) -> throwIO e
106119 Left (HandshakeProtocolError e) -> throwIO e
107120 Right HandshakeQueryResult {} -> error " handshake query is not supported"
108121 Right (HandshakeNegotiationResult (SomeResponderApplication app) vNumber vData) -> do
109- mux <- Mx. new Mx. nullTracers
122+ mux <- Mx. new (connId ` Mx.tracersWithBearer` muxTracers)
110123 (toMiniProtocolInfos
111- (runForkPolicy noBindForkPolicy ( remoteAddress connId) )
124+ (runForkPolicy noBindForkPolicy remoteAddress)
112125 app)
113126 withAsync (Mx. run mux bearer) $ \ aid -> do
114127 void $ simpleMuxCallback connId vNumber vData app mux aid
115128
116- errorHandler = \ e -> throwIO e
129+ errorHandler = \ e -> traceWith tracer (ConnectionHandlerException connId e)
130+ >> throwIO e
117131 JobPool. forkJob jobPool
118132 $ JobPool. Job connThread
119133 errorHandler
0 commit comments