X-Git-Url: http://git.lukelau.me/?p=lsp-test.git;a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FParsing.hs;fp=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FParsing.hs;h=c29e0f3a2a44b69d875b823cea21d42a183c9fd5;hp=0000000000000000000000000000000000000000;hb=93bbb70d531238c46a28eb356a68c3648b88082f;hpb=e728814eed6134acf8281a1ad08eecaf438a736a diff --git a/src/Language/Haskell/LSP/Test/Parsing.hs b/src/Language/Haskell/LSP/Test/Parsing.hs new file mode 100644 index 0000000..c29e0f3 --- /dev/null +++ b/src/Language/Haskell/LSP/Test/Parsing.hs @@ -0,0 +1,39 @@ +{-# LANGUAGE OverloadedStrings #-} +module Language.Haskell.LSP.Test.Parsing where + +import qualified Data.ByteString.Lazy.Char8 as B +import System.IO + +getAllMessages :: Handle -> IO [B.ByteString] +getAllMessages h = do + done <- hIsEOF h + if done + then return [] + else do + msg <- getNextMessage h + + (msg :) <$> getAllMessages h + +-- | Fetches the next message bytes based on +-- the Content-Length header +getNextMessage :: Handle -> IO B.ByteString +getNextMessage h = do + headers <- getHeaders h + case read . init <$> lookup "Content-Length" headers of + Nothing -> error "Couldn't read Content-Length header" + Just size -> B.hGet h size + +addHeader :: B.ByteString -> B.ByteString +addHeader content = B.concat + [ "Content-Length: " + , B.pack $ show $ B.length content + , "\r\n" + , "\r\n" + , content + ] + +getHeaders :: Handle -> IO [(String, String)] +getHeaders h = do + l <- hGetLine h + let (name, val) = span (/= ':') l + if null val then return [] else ((name, drop 2 val) :) <$> getHeaders h