module Network.HTTP.Lucu.HandleLike ( HandleLike(..) ) where import qualified Data.ByteString as B import qualified Data.ByteString.Lazy.Char8 as L import qualified OpenSSL.Session as SSL import OpenSSL.X509 import qualified System.IO as I class HandleLike h where hGetLBS :: h -> IO L.ByteString hPutLBS :: h -> L.ByteString -> IO () hGetBS :: h -> Int -> IO B.ByteString hPutBS :: h -> B.ByteString -> IO () hPutChar :: h -> Char -> IO () hPutStr :: h -> String -> IO () hPutStrLn :: h -> String -> IO () hGetPeerCert :: h -> IO (Maybe X509) hGetPeerCert = const $ return Nothing hFlush :: h -> IO () hClose :: h -> IO () instance HandleLike I.Handle where hGetLBS = L.hGetContents hPutLBS = L.hPut hGetBS = B.hGet hPutBS = B.hPut hPutChar = I.hPutChar hPutStr = I.hPutStr hPutStrLn = I.hPutStrLn hFlush = I.hFlush hClose = I.hClose instance HandleLike SSL.SSL where hGetLBS = SSL.lazyRead hPutLBS = SSL.lazyWrite hGetBS = SSL.read hPutBS = SSL.write hPutChar s = hPutLBS s . L.singleton hPutStr s = hPutLBS s . L.pack hPutStrLn s = hPutLBS s . L.pack . (++ "\n") hGetPeerCert s = do isValid <- SSL.getVerifyResult s if isValid then SSL.getPeerCertificate s else return Nothing hFlush _ = return () -- unneeded hClose s = SSL.shutdown s SSL.Bidirectional