1 module Databrary.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 Databrary.Has (peeks) 13 import Databrary.HTTP.Form.Data 14 import Databrary.HTTP.Parse 15 import Databrary.Action.Types 16 import qualified Databrary.JSON as 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 $ (\httpReq -> (FormData . Map.fromList . Wai.queryString) httpReq) 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