ftp-client 0.1.0.2 → 0.2.0.0
raw patch · 2 files changed
+44/−40 lines, 2 filesdep ~ftp-clientPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: ftp-client
API changes (from Hackage documentation)
- Network.FTP.Client: createDataSocket :: PortActivity -> Handle -> IO Socket
- Network.FTP.Client: createSendDataCommand :: Handle -> PortActivity -> [FTPCommand] -> IO Handle
+ Network.FTP.Client: createSendDataCommand :: Handle -> PortActivity -> [FTPCommand] -> IO (Handle)
Files
- ftp-client.cabal +2/−2
- src/Network/FTP/Client.hs +42/−38
ftp-client.cabal view
@@ -1,5 +1,5 @@ name: ftp-client-version: 0.1.0.2+version: 0.2.0.0 cabal-version: >=1.10 build-type: Simple license: PublicDomain@@ -37,7 +37,7 @@ main-is: Spec.hs build-depends: base >=4.9.0.0 && <4.10,- ftp-client >=0.1.0.2 && <0.2+ ftp-client >=0.2.0.0 && <0.3 default-language: Haskell2010 hs-source-dirs: test ghc-options: -threaded -rtsopts -with-rtsopts=-N
src/Network/FTP/Client.hs view
@@ -46,7 +46,6 @@ getLineResp, getMultiLineResp, sendCommandLine,- createDataSocket, createSendDataCommand, createTLSSendDataCommand ) where@@ -253,32 +252,39 @@ (S.addrProtocol addr) return (sock, addr) -createSocketPassive :: String -> Int -> IO S.Socket-createSocketPassive host portNum = do+withSocketPassive :: String -> Int -> (S.Socket -> IO a) -> IO a+withSocketPassive host portNum f = do let hints = S.defaultHints { S.addrSocketType = S.Stream }- (sock, addr) <- createSocket (Just host) portNum hints- S.connect sock (S.addrAddress addr)- debugPrint "Connected"- return sock+ bracketOnError+ (createSocket (Just host) portNum hints)+ (\(sock, _) -> S.close sock)+ (\(sock, addr) -> do+ S.connect sock (S.addrAddress addr)+ debugPrint "Connected"+ f sock+ ) -createSocketActive :: IO S.Socket-createSocketActive = do+withSocketActive :: (S.Socket -> IO a) -> IO a+withSocketActive f = do let hints = S.defaultHints { S.addrSocketType = S.Stream, S.addrFlags = [S.AI_PASSIVE] }- (sock, addr) <- createSocket Nothing 0 hints- S.bind sock (S.addrAddress addr)- S.listen sock 1- debugPrint "Listening"- return sock+ bracketOnError+ (createSocket Nothing 0 hints)+ (\(sock, _) -> S.close sock)+ (\(sock, addr) -> do+ S.bind sock (S.addrAddress addr)+ S.listen sock 1+ debugPrint "Listening"+ f sock+ ) createSIOHandle :: String -> Int -> IO SIO.Handle-createSIOHandle host portNum = do- sock <- createSocketPassive host portNum- S.socketToHandle sock SIO.ReadWriteMode+createSIOHandle host portNum = withSocketPassive host portNum+ (\sock -> S.socketToHandle sock SIO.ReadWriteMode) sIOHandleImpl :: SIO.Handle -> Handle sIOHandleImpl h = Handle@@ -310,24 +316,23 @@ -- Data connection -createDataSocketPasv :: Handle -> IO S.Socket-createDataSocketPasv h = do+withDataSocketPasv :: Handle -> (S.Socket -> IO a) -> IO a+withDataSocketPasv h f = do (host, portNum) <- pasv h debugPrint $ "Host: " <> host debugPrint $ "Port: " <> show portNum- createSocketPassive host portNum+ withSocketPassive host portNum f -createDataSocketActive :: Handle -> IO S.Socket-createDataSocketActive h = do- socket <- createSocketActive+withDataSocketActive :: Handle -> (S.Socket -> IO a) -> IO a+withDataSocketActive h f = withSocketActive $ \socket -> do (S.SockAddrInet sPort sHost) <- S.getSocketName socket port h sHost sPort- return socket+ f socket -- | Open a socket that can be used for data transfers-createDataSocket :: PortActivity -> Handle -> IO S.Socket-createDataSocket Active = createDataSocketActive-createDataSocket Passive = createDataSocketPasv+withDataSocket :: PortActivity -> Handle -> (S.Socket -> IO a) -> IO a+withDataSocket Active = withDataSocketActive+withDataSocket Passive = withDataSocketPasv acceptData :: S.Socket -> PortActivity -> IO S.Socket acceptData sock Passive = return sock@@ -341,9 +346,8 @@ :: Handle -> PortActivity -> [FTPCommand]- -> IO SIO.Handle-createSendDataCommand h pa cmds = do- socket <- createDataSocket pa h+ -> IO (SIO.Handle)+createSendDataCommand h pa cmds = withDataSocket pa h $ \socket -> do sendCommands h cmds acceptedSock <- acceptData socket pa S.socketToHandle acceptedSock SIO.ReadWriteMode@@ -449,14 +453,14 @@ -> IO Connection createTLSSendDataCommand ch pa cmds = do sendCommands ch [Pbsz 0, Prot P]- socket <- createDataSocket pa ch- sendCommands ch cmds- acceptedSock <- acceptData socket pa- (S.SockAddrInet sPort sHost) <- S.getSocketName acceptedSock- let (h1, h2, h3, h4) = S.hostAddressToTuple sHost- hostName = intercalate "." $ (show . fromEnum) <$> [h1, h2, h3, h4]- h <- S.socketToHandle acceptedSock SIO.ReadWriteMode- connectTLS h hostName (fromEnum sPort)+ withDataSocket pa ch $ \socket -> do+ sendCommands ch cmds+ acceptedSock <- acceptData socket pa+ (S.SockAddrInet sPort sHost) <- S.getSocketName acceptedSock+ let (h1, h2, h3, h4) = S.hostAddressToTuple sHost+ hostName = intercalate "." $ (show . fromEnum) <$> [h1, h2, h3, h4]+ h <- S.socketToHandle acceptedSock SIO.ReadWriteMode+ connectTLS h hostName (fromEnum sPort) withTLSDataCommand :: Handle