8 -- |Type class for things behaves like a 'So.Socket'.
9 module Network.HTTP.Lucu.SocketLike
13 import qualified Network.Socket as So
14 import Network.HTTP.Lucu.HandleLike
16 import qualified OpenSSL.Session as SSL
17 import Prelude.Unicode
19 import qualified System.IO as I
21 class (HandleLike (Handle s)) ⇒ SocketLike s where
23 accept ∷ s → IO (Handle s, So.SockAddr)
24 socketPort ∷ s → IO So.PortNumber
26 instance SocketLike So.Socket where
27 type Handle So.Socket = I.Handle
30 = do (soPeer, addr) ← So.accept soSelf
31 hPeer ← So.socketToHandle soPeer I.ReadWriteMode
34 socketPort = So.socketPort
37 instance SocketLike (SSL.SSLContext, So.Socket) where
38 type Handle (SSL.SSLContext, So.Socket) = SSL.SSL
41 = do (soPeer, addr) ← So.accept soSelf
42 ssl ← SSL.connection ctx soPeer
46 socketPort = So.socketPort ∘ snd