@@ -171,7 +171,7 @@ data PClient v err msg = PClient
171
171
timeoutErrorCount :: TVar Int ,
172
172
clientCorrId :: TVar ChaChaDRG ,
173
173
sentCommands :: TMap CorrId (Request err msg ),
174
- sndQ :: TBQueue (Maybe (TVar Bool ), ByteString ),
174
+ sndQ :: TBQueue (Maybe (Request err msg ), ByteString ),
175
175
rcvQ :: TBQueue (NonEmpty (SignedTransmission err msg )),
176
176
msgQ :: Maybe (TBQueue (ServerTransmissionBatch v err msg ))
177
177
}
@@ -406,6 +406,8 @@ data ProtocolClientConfig v = ProtocolClientConfig
406
406
serverVRange :: VersionRange v ,
407
407
-- | agree shared session secret (used in SMP proxy for additional encryption layer)
408
408
agreeSecret :: Bool ,
409
+ -- | Whether connecting client is a proxy server. See comment in ClientHandshake
410
+ proxyServer :: Bool ,
409
411
-- | send SNI to server, False for SMP
410
412
useSNI :: Bool
411
413
}
@@ -420,6 +422,7 @@ defaultClientConfig clientALPN useSNI serverVRange =
420
422
clientALPN,
421
423
serverVRange,
422
424
agreeSecret = False ,
425
+ proxyServer = False ,
423
426
useSNI
424
427
}
425
428
{-# INLINE defaultClientConfig #-}
@@ -489,7 +492,7 @@ type TransportSession msg = (UserId, ProtoServer msg, Maybe ByteString)
489
492
-- A single queue can be used for multiple 'SMPClient' instances,
490
493
-- as 'SMPServerTransmission' includes server information.
491
494
getProtocolClient :: forall v err msg . Protocol v err msg => TVar ChaChaDRG -> TransportSession msg -> ProtocolClientConfig v -> Maybe (TBQueue (ServerTransmissionBatch v err msg )) -> UTCTime -> (ProtocolClient v err msg -> IO () ) -> IO (Either (ProtocolClientError err ) (ProtocolClient v err msg ))
492
- getProtocolClient g transportSession@ (_, srv, _) cfg@ ProtocolClientConfig {qSize, networkConfig, clientALPN, serverVRange, agreeSecret, useSNI} msgQ proxySessTs disconnected = do
495
+ getProtocolClient g transportSession@ (_, srv, _) cfg@ ProtocolClientConfig {qSize, networkConfig, clientALPN, serverVRange, agreeSecret, proxyServer, useSNI} msgQ proxySessTs disconnected = do
493
496
case chooseTransportHost networkConfig (host srv) of
494
497
Right useHost ->
495
498
(getCurrentTime >>= mkProtocolClient useHost >>= runClient useTransport useHost)
@@ -548,7 +551,7 @@ getProtocolClient g transportSession@(_, srv, _) cfg@ProtocolClientConfig {qSize
548
551
client :: forall c . Transport c => TProxy c -> PClient v err msg -> TMVar (Either (ProtocolClientError err ) (ProtocolClient v err msg )) -> c -> IO ()
549
552
client _ c cVar h = do
550
553
ks <- if agreeSecret then Just <$> atomically (C. generateKeyPair g) else pure Nothing
551
- runExceptT (protocolClientHandshake @ v @ err @ msg h ks (keyHash srv) serverVRange) >>= \ case
554
+ runExceptT (protocolClientHandshake @ v @ err @ msg h ks (keyHash srv) serverVRange proxyServer ) >>= \ case
552
555
Left e -> atomically . putTMVar cVar . Left $ PCETransportError e
553
556
Right th@ THandle {params} -> do
554
557
sessionTs <- getCurrentTime
@@ -563,9 +566,12 @@ getProtocolClient g transportSession@(_, srv, _) cfg@ProtocolClientConfig {qSize
563
566
send :: Transport c => ProtocolClient v err msg -> THandle v c 'TClient -> IO ()
564
567
send ProtocolClient {client_ = PClient {sndQ}} h = forever $ atomically (readTBQueue sndQ) >>= sendPending
565
568
where
566
- sendPending (Nothing , s) = send_ s
567
- sendPending (Just pending, s) = whenM (readTVarIO pending) $ send_ s
568
- send_ = void . tPutLog h
569
+ sendPending (r, s) = case r of
570
+ Nothing -> void $ tPutLog h s
571
+ Just Request {pending, responseVar} ->
572
+ whenM (readTVarIO pending) $ tPutLog h s >>= either responseErr pure
573
+ where
574
+ responseErr = atomically . putTMVar responseVar . Left . PCETransportError
569
575
570
576
receive :: Transport c => ProtocolClient v err msg -> THandle v c 'TClient -> IO ()
571
577
receive ProtocolClient {client_ = PClient {rcvQ, lastReceived, timeoutErrorCount}} h = forever $ do
@@ -1101,12 +1107,12 @@ sendProtocolCommand_ c@ProtocolClient {client_ = PClient {sndQ}, thParams = THan
1101
1107
where
1102
1108
-- two separate "atomically" needed to avoid blocking
1103
1109
sendRecv :: Either TransportError SentRawTransmission -> Request err msg -> IO (Either (ProtocolClientError err ) msg )
1104
- sendRecv t_ r@ Request {pending} = case t_ of
1110
+ sendRecv t_ r = case t_ of
1105
1111
Left e -> pure . Left $ PCETransportError e
1106
1112
Right t
1107
1113
| B. length s > blockSize - 2 -> pure . Left $ PCETransportError TELargeMsg
1108
1114
| otherwise -> do
1109
- atomically $ writeTBQueue sndQ (Just pending , s)
1115
+ atomically $ writeTBQueue sndQ (Just r , s)
1110
1116
response <$> getResponse c tOut r
1111
1117
where
1112
1118
s
0 commit comments