-- 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: -- -- -- -- And here's a short example of a server that accepts clients, greets -- them with a welcome message, checks for disconnects and replies to all -- messages by echoing them back with an appended meow: -- --
--   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