{-# LANGUAGE FlexibleContexts #-}
module Network.Salvia.Handler.SendFile (hSendFileResource) where

import Control.Monad.Trans
import Data.Record.Label
import Network.Protocol.Http
import Network.Salvia
import Network.Socket.SendFile
import System.IO

-- TODO: closing of file after getting filesize?

hSendFileResource :: (MonadIO m, HttpM Response m, SendM m, SocketQueueM m) => FilePath -> m ()
hSendFileResource f =
  hSafeIO (openBinaryFile f ReadMode) $ \fd ->
  hSafeIO (hFileSize fd)              $ \fs ->
    do response $
         do status        =: OK
            contentType   =: Just (fileMime f, Just "utf-8")
            contentLength =: Just fs
       enqueueSock (\s -> sendFile' s f 0 fs)