packages feed

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 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)