+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 qualified System.IO as I
+
+
+class (HandleLike (Handle s)) => SocketLike s where
+ type Handle s :: *
+ accept :: s -> IO (Handle s, So.SockAddr)
+
+
+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)
+
+
+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)