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