network-attoparsec 0.11.0 → 0.11.1
raw patch · 3 files changed
+28/−29 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Network.Attoparsec: parseMany :: (MonadIO m, MonadMask m) => Socket -> ParseC a -> ParseC a -> m (ParseC a, [a])
+ Network.Attoparsec: parseMany :: (MonadIO m, MonadMask m, Show a) => Socket -> ParseC a -> ParseC a -> m (ParseC a, [a])
- Network.Attoparsec: parseOne :: (MonadIO m, MonadMask m) => Socket -> ParseC a -> m a
+ Network.Attoparsec: parseOne :: (MonadIO m, MonadMask m, Show a) => Socket -> ParseC a -> m a
Files
- network-attoparsec.cabal +2/−4
- src/Network/Attoparsec.hs +23/−13
- test/Network/AttoparsecSpec.hs +3/−12
network-attoparsec.cabal view
@@ -1,6 +1,6 @@ name: network-attoparsec category: Network, Parsing -version: 0.11.0 +version: 0.11.1 license: MIT license-file: LICENSE copyright: (c) 2015 Leon Mergen @@ -27,12 +27,11 @@ , lifted-base , monad-control , transformers - , enclosed-exceptions , exceptions + , enclosed-exceptions , mtl , network - , network-simple , attoparsec , bytestring @@ -51,7 +50,6 @@ , hspec , exceptions - , enclosed-exceptions , transformers , bytestring , mtl
src/Network/Attoparsec.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} {-| @@ -15,15 +15,14 @@ module Network.Attoparsec (ParseC, parseMany, parseOne) where -import Control.Monad.IO.Class import Control.Monad.Catch +import Control.Monad.IO.Class import Control.Exception.Enclosed (tryAny) +import qualified Data.Attoparsec.ByteString as Atto import qualified Data.ByteString as BS import qualified Network.Socket as NS import qualified Network.Socket.ByteString as NSB -import qualified Network.Simple.TCP as Network -import qualified Data.Attoparsec.ByteString as Atto -- | The parsing continuation form of a "Data.Attoparsec" parser. This is -- typically created by running the attoparsec "parse" function: @@ -48,13 +47,15 @@ -- -- For more usage examples, see the test directory. parseMany :: ( MonadIO m - , MonadMask m) + , MonadMask m + , Show a) => NS.Socket -- ^ Socket to read data from -> ParseC a -- ^ Initial parser state -> ParseC a -- ^ Continuation parser state -> m (ParseC a, [a]) -- ^ Next parser state with parsed values parseMany s p0 pCur = do buf <- readAvailable s + liftIO $ putStrLn ("got buf: " ++ show buf) (p1, xs) <- parseBuffer p0 Many buf pCur return (p1, xs) @@ -71,12 +72,14 @@ -- -- > doParse sock = parseOne sock (AttoParsec.parse myParser) parseOne :: ( MonadIO m - , MonadMask m) + , MonadMask m + , Show a) => NS.Socket -- ^ Socket to read data from -> ParseC a -- ^ Initial parser state -> m a -- ^ Parsed value parseOne s p0 = do buf <- readAvailable s + liftIO $ putStrLn ("got buf: " ++ show buf) (p1, value) <- parseBuffer p0 Single buf p0 case value of @@ -89,7 +92,8 @@ _ -> error "More than one element parsed" parseBuffer :: ( MonadIO m - , MonadMask m) + , MonadMask m + , Show a) => ParseC a -- ^ Initial parser state -> ParseMode -- ^ Whether to perform greedy or non-greedy parsing -> BS.ByteString -- ^ Unconsumed buffer from previous run @@ -128,9 +132,15 @@ , MonadMask m) => NS.Socket -> m BS.ByteString -readAvailable s = do - buf <- liftIO $ Network.recv s 4096 - liftIO $ putStrLn ("received buffer: " ++ show buf) - case buf of - Just d -> return d - Nothing -> return BS.empty +readAvailable s = + let buf :: IO (Maybe BS.ByteString) + buf = do + -- For some reason, Windows seems to be generating an exception sometimes + -- when the remote has closed the connection + result <- tryAny $ NSB.recv s 2048 + + case result of + Left _ -> return Nothing + Right v -> return (Just v) + + in maybe (return BS.empty) return =<< liftIO buf
test/Network/AttoparsecSpec.hs view
@@ -3,10 +3,10 @@ module Network.AttoparsecSpec where import Control.Concurrent (ThreadId, forkIO, killThread, - threadDelay, myThreadId) + threadDelay) -import Control.Monad.IO.Class import Control.Monad.Catch +import Control.Monad.IO.Class import qualified Data.Attoparsec.ByteString as Atto @@ -28,10 +28,7 @@ let handleWrite :: NS.Socket -> IO () handleWrite s = do - putStrLn "handling writing" _ <- writeCallback s - myTid <- myThreadId - putStrLn ("handled write, my thread id = " ++ show myTid) return () handleRead s = do @@ -44,17 +41,11 @@ NS.accept lsock (handleWrite . fst) in do - liftIO $ putStrLn "starting server" serverThread <- liftIO $ handleServer - - liftIO $ putStrLn ("started server, thread id = " ++ show serverThread) liftIO $ threadDelay 100000 - result <- NS.connect "127.0.0.1" "1234" (handleRead . fst) - liftIO $ putStrLn "killing server" liftIO $ killThread serverThread - liftIO $ putStrLn "killed server" return result @@ -144,7 +135,7 @@ in (pairSockets writeSocket readSocket) `shouldReturn` [1234, 5678, 9012] - it "should return nothing objects when using multi object parser and providing not enough data" $ + it "should return nothing when using multi object parser and providing not enough data" $ let writeSocket s = NS.send s "12" readSocket s = do (_, xs) <- Atto.parseMany s (Atto.parse numberParser) (Atto.parse numberParser)