Skip to content

Instantly share code, notes, and snippets.

@slogsdon
Created February 16, 2016 03:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save slogsdon/d265cf88fb1002f9fc7d to your computer and use it in GitHub Desktop.
Save slogsdon/d265cf88fb1002f9fc7d to your computer and use it in GitHub Desktop.
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Concurrent (forkIO)
import Control.Monad (forever)
import Data.ByteString.Builder (Builder, hPutBuilder, lazyByteString)
import qualified Data.ByteString.Lazy as BS
import Data.Monoid ((<>))
import GHC.IO.Handle (BufferMode (..), hClose,
hSetBinaryMode, hSetBuffering)
import Network.Socket hiding (recv)
import System.IO (IOMode (..))
main :: IO ()
main = withSocketsDo $
do addrinfos <- getAddrInfo
(Just (defaultHints {addrFlags = [AI_PASSIVE]}))
Nothing
(Just "3000")
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Stream defaultProtocol
bindSocket sock (addrAddress serveraddr)
listen sock 5
forever $ accept sock >>= forkIO . handleClientRequest
handleClientRequest :: (Socket, a) -> IO ()
handleClientRequest (conn, _) = do
-- sendAll conn "HTTP/1.1 200 Ok\r\ncontent-length: 0\r\n\r\n"
handle <- socketToHandle conn WriteMode
hSetBinaryMode handle True
hSetBuffering handle (BlockBuffering (Just 1024))
hPutBuilder handle $
buildResponse [ "HTTP/1.1 200 Ok\r\n"
, "content-length: 0\r\n\r\n"
]
hClose handle
buildResponse :: [BS.ByteString] -> Builder
buildResponse = foldr ((<>) . lazyByteString) mempty
-- buildResponse [] = mempty
-- buildResponse (x:xs) = lazyByteString x <> buildResponse xs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment