packages feed

haskell-ftp-0.1.0.0: Network/FTP/Server.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
module Network.FTP.Server
  ( ftpServer
  ) where

{-| Run ftp server to backend monad.
 -}

import qualified Prelude as P
import BasicPrelude

import Data.Conduit ( ($=), ($$+) )
import qualified Data.Conduit.Binary as C
import Data.Conduit.Network (Application, appSource, appSink, appSockAddr, appLocalAddr)

import Network.FTP.Monad (runFTP, reply, defaultFTPState)
import Network.FTP.Backend (FTPBackend)
import Network.FTP.Commands (commandLoop)

{-| Main ftp server application, should be runned by `runTCPServer`.
 -}
ftpServer :: FTPBackend m => Application m
ftpServer ad = do
    let local = fromMaybe (error "Need to runTCPServer with serverNeedLocalAddr=True.") (appLocalAddr ad)
    (src', _) <- appSource ad $= C.lines $$+ return ()
    void $ runFTP (defaultFTPState src' (appSink ad) (appSockAddr ad) local) $ do
        reply "220" "Welcome to Haskell Ftp Server."
        commandLoop