{-# LANGUAGE FlexibleContexts , FlexibleInstances , TypeFamilies , UnicodeSyntax #-} module Network.HTTP.Lucu.SocketLike ( SocketLike(..) ) where import qualified Network.Socket as So import Network.HTTP.Lucu.HandleLike import qualified OpenSSL.Session as SSL import Prelude.Unicode import qualified System.IO as I class (HandleLike (Handle s)) ⇒ SocketLike s where type Handle s ∷ ★ accept ∷ s → IO (Handle s, So.SockAddr) socketPort ∷ s → IO So.PortNumber instance SocketLike So.Socket where type Handle So.Socket = I.Handle accept soSelf = do (soPeer, addr) ← So.accept soSelf hPeer ← So.socketToHandle soPeer I.ReadWriteMode return (hPeer, addr) socketPort = So.socketPort instance SocketLike (SSL.SSLContext, So.Socket) where type Handle (SSL.SSLContext, So.Socket) = SSL.SSL accept (ctx, soSelf) = do (soPeer, addr) ← So.accept soSelf ssl ← SSL.connection ctx soPeer SSL.accept ssl return (ssl, addr) socketPort = So.socketPort ∘ snd