]> gitweb @ CieloNegro.org - Lucu.git/blob - Network/HTTP/Lucu/SocketLike.hs
Code clean-up (and close ditz/lucu-1)
[Lucu.git] / Network / HTTP / Lucu / SocketLike.hs
1 module Network.HTTP.Lucu.SocketLike
2     ( SocketLike(..)
3     )
4     where
5
6 import qualified Network.Socket as So
7 import           Network.HTTP.Lucu.HandleLike
8 import qualified OpenSSL.Session as SSL
9 import qualified System.IO as I
10
11
12 class (HandleLike (Handle s)) => SocketLike s where
13     type Handle s :: *
14     accept        :: s -> IO (Handle s, So.SockAddr)
15     socketPort    :: s -> IO So.PortNumber
16
17
18 instance SocketLike So.Socket where
19     type Handle So.Socket = I.Handle
20
21     accept soSelf
22         = do (soPeer, addr) <- So.accept soSelf
23              hPeer          <- So.socketToHandle soPeer I.ReadWriteMode
24              return (hPeer, addr)
25
26     socketPort = So.socketPort
27
28
29 instance SocketLike (SSL.SSLContext, So.Socket) where
30     type Handle (SSL.SSLContext, So.Socket) = SSL.SSL
31
32     accept (ctx, soSelf)
33         = do (soPeer, addr) <- So.accept soSelf
34              ssl            <- SSL.connection ctx soPeer
35              SSL.accept ssl
36              return (ssl, addr)
37
38     socketPort = So.socketPort . snd