-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Server-side WebSocket protocol handshake and communication. -- -- A library for creating WebSocket-capable servers, where the -- implemented protocol is defined here: http://is.gd/eSdLB. -- -- This library is only tested with Chromium >=7 and Firefox >=4 -- and is a work in progress. -- -- How do you use this library? Here's how: -- --
-- import Network.WebSockets (shakeHands, getFrame, putFrame) -- import Network (listenOn, PortID(PortNumber), accept, withSocketsDo) -- import System.IO (Handle, hClose) -- import qualified Data.ByteString as B (append, null) -- import Data.ByteString.UTF8 (fromString) -- this is from utf8-string -- import Control.Monad (forever) -- import Control.Concurrent (forkIO) -- -- main :: IO () -- main = withSocketsDo $ do -- socket <- listenOn (PortNumber 12345) -- putStrLn "Listening on port 12345." -- forever $ do -- (h, _, _) <- accept socket -- forkIO (talkTo h) -- -- -- talkTo :: Handle -> IO () -- talkTo h = do -- request <- shakeHands h -- case request of -- Left error -> putStrLn error -- Right rqst -> do -- putFrame h (fromString "滴水之恩当以涌泉相报") -- putStrLn "Shook hands, sent welcome message." -- talkLoop h -- -- hClose h -- putStrLn "Client quit, closed handle." -- -- -- talkLoop :: Handle -> IO () -- talkLoop h = do -- msg <- getFrame h -- if B.null msg -- then return () -- else do -- putFrame h $ B.append msg (fromString ", MEOW!") -- talkLoop h ---- -- The example above will suffice if you wish to accept any -- WebSocket-capable client, regardless of its origin or target. It won't -- suffice if you have to filter the incoming clients by the contents of -- their requests. For that, you can use getRequest and -- putResponse, which allow you to inspect the request details -- before you send back a response, if any. -- -- If you have any suggestions, bug reports and/or fixes, feel free to -- send them to mailto:sinisa@bidin.cc. @package websockets @version 0.1.2.5 module Network.WebSockets -- | Accept and perform a handshake, no matter the request contents. -- -- As long as the request is well-formed, the client will receive a -- response saying, essentially, "proceed". Use this function if you -- don't care who you're connected to, as long as that someone speaks the -- WebSocket protocol. -- -- The function returns either a String in case of error, or a -- Request on success. The Request is returned purely for -- logging purposes, since the handshake has already been executed. Use -- this function immediately after establishing the WebSocket connection. -- -- If you wish not to blindly accept requests but to filter them -- according to their contents, use the getRequest and -- putResponse functions. shakeHands :: Handle -> IO (Either String Request) -- | Reads the client's opening handshake and returns either a -- Request based on its contents, or a String in case of an error. getRequest :: Handle -> IO (Either String Request) -- | Sends an accepting response based on the given Request, thus -- accepting and ending the handshake. putResponse :: Handle -> Request -> IO () -- | Receive a strict ByteString. Call this function only after having -- performed the handshake. This function will block until an entire -- frame is read. If the writing end of the handle is closed, the -- function returns an empty ByteString. getFrame :: Handle -> IO ByteString -- | Send a strict ByteString. Call this function only after having -- performed the handshake. putFrame :: Handle -> ByteString -> IO () -- | Returns the requested host. reqHost :: Request -> String -- | Returns the requested path. reqPath :: Request -> String -- | Returns the origin of the request. reqOrigin :: Request -> String -- | Returns the requested location. Equal to (\r -> "ws://" ++ -- reqHost r ++ reqPath r). reqLocation :: Request -> String -- | Contains the request details, accessible via the reqHost, -- reqPath, reqOrigin and reqLocation functions. data Request instance Show Request