c29e0f3a2a44b69d875b823cea21d42a183c9fd5
[lsp-test.git] / src / Language / Haskell / LSP / Test / Parsing.hs
1 {-# LANGUAGE OverloadedStrings #-}
2 module Language.Haskell.LSP.Test.Parsing where
3
4 import qualified Data.ByteString.Lazy.Char8    as B
5 import System.IO
6
7 getAllMessages :: Handle -> IO [B.ByteString]
8 getAllMessages h = do
9   done <- hIsEOF h
10   if done
11     then return []
12     else do
13       msg <- getNextMessage h
14
15       (msg :) <$> getAllMessages h
16
17 -- | Fetches the next message bytes based on
18 -- the Content-Length header
19 getNextMessage :: Handle -> IO B.ByteString
20 getNextMessage h = do
21   headers <- getHeaders h
22   case read . init <$> lookup "Content-Length" headers of
23     Nothing   -> error "Couldn't read Content-Length header"
24     Just size -> B.hGet h size
25     
26 addHeader :: B.ByteString -> B.ByteString
27 addHeader content = B.concat
28   [ "Content-Length: "
29   , B.pack $ show $ B.length content
30   , "\r\n"
31   , "\r\n"
32   , content
33   ]
34
35 getHeaders :: Handle -> IO [(String, String)]
36 getHeaders h = do
37   l <- hGetLine h
38   let (name, val) = span (/= ':') l
39   if null val then return [] else ((name, drop 2 val) :) <$> getHeaders h