+{-# LANGUAGE
+ FlexibleContexts
+ , FlexibleInstances
+ , TypeFamilies
+ , UnicodeSyntax
+ #-}
module Network.HTTP.Lucu.SocketLike
( SocketLike(..)
)
class (HandleLike (Handle s)) => SocketLike s where
type Handle s :: *
- accept :: s -> IO (Handle s, So.SockAddr)
+ 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
\ No newline at end of file