+partToFormData :: Part -> FormData
+partToFormData part@(Part _ body)
+ = let name = partName part
+ fName = partFileName part
+ in
+ FormData {
+ fdName = name
+ , fdFileName = fName
+ , fdContent = body
+ }
+
+
+partName :: Part -> String
+partName = getName' . getContDispoFormData
+ where
+ getName' :: ContDispo -> String
+ getName' dispo@(ContDispo _ dParams)
+ = case find ((== "name") . map toLower . fst) dParams of
+ Just (_, name) -> name
+ Nothing
+ -> abortPurely BadRequest []
+ (Just $ "form-data without name: " ++ show dispo)
+
+
+partFileName :: Part -> Maybe String
+partFileName = getFileName' . getContDispoFormData
+ where
+ getFileName' :: ContDispo -> Maybe String
+ getFileName' (ContDispo _ dParams)
+ = do (_, fileName) <- find ((== "filename") . map toLower . fst) dParams
+ return fileName
+
+getContDispoFormData :: Part -> ContDispo
+getContDispoFormData part
+ = let dispo@(ContDispo dType _) = getContDispo part
+ in
+ if map toLower dType == "form-data" then
+ dispo
+ else
+ abortPurely BadRequest []
+ (Just $ "Content-Disposition type is not form-data: " ++ dType)
+
+
+getContDispo :: Part -> ContDispo
+getContDispo part