1 module Action.Form
    2   ( getFormData
    3   ) where
    4 
    5 import qualified Data.ByteString as BS
    6 import qualified Data.Map.Strict as Map
    7 import Data.Maybe (fromMaybe)
    8 import Data.Word (Word64)
    9 import qualified Network.Wai as Wai
   10 import Network.Wai.Parse (FileInfo)
   11 
   12 import Has (peeks)
   13 import HTTP.Form.Data
   14 import HTTP.Parse
   15 import Action.Types
   16 import qualified JSON
   17 
   18 getFormData :: FileContent a => [(BS.ByteString, Word64)] -> Handler (FormData a)
   19 getFormData fileLimits = do
   20   (mkFormData
   21    :: Map.Map BS.ByteString BS.ByteString -> Maybe JSON.Value -> Map.Map BS.ByteString (FileInfo a) -> FormData a)
   22     <- peeks (FormData . Map.fromList . Wai.queryString)
   23   (c :: Content a) <- parseRequestContent getFileMaxSizeByFieldName
   24   return $ case c of
   25     ContentForm formParams formFiles -> mkFormData (Map.fromList formParams) Nothing    (Map.fromList formFiles)
   26     ContentJSON val ->                  mkFormData Map.empty                 (Just val) Map.empty
   27     -- text or unknown
   28     _ ->                                mkFormData Map.empty                 Nothing    Map.empty
   29   where
   30     getFileMaxSizeByFieldName :: BS.ByteString -> Word64
   31     getFileMaxSizeByFieldName fieldName = (fromMaybe 0 . (`lookup` fileLimits)) fieldName