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