Resource.hs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. module Data.SMTP.Types.Resource where
  2. import qualified Data.SMTP.URI as URI
  3. import qualified Data.SMTP.Types.Mime as Mime
  4. import qualified Data.SMTP.Parser.Mime as PMime
  5. import qualified Data.Attoparsec.ByteString as BA
  6. import qualified Data.ByteString.Lazy as LBS
  7. import qualified Text.StringConvert as SC
  8. import Data.Maybe
  9. import Data.Default.Class
  10. import Data.Char
  11. data Header = Header (String, String) deriving (Read, Show, Eq, Ord)
  12. data ResourceInfo = ResourceInfo {
  13. mimeType :: Mime.ContentType,
  14. mimeParameters :: Mime.ContentTypeParameters,
  15. revision :: URI.Revision,
  16. bases :: [URI.Revision],
  17. address :: [URI.URI]
  18. } deriving (Eq, Ord, Show)
  19. instance Default ResourceInfo where
  20. def = ResourceInfo def def URI.NoRevision [] []
  21. type ResourceData = LBS.ByteString
  22. getHeader :: [Header] -> String -> Maybe Header
  23. getHeader [] _ = Nothing
  24. getHeader (h@(Header (hk, _)) : hh) k
  25. | map toLower hk == map toLower k = Just h
  26. | otherwise = getHeader hh k
  27. getHeaderValue :: [Header] -> String -> Maybe String
  28. getHeaderValue hh h = case getHeader hh h of
  29. Just (Header (_, v)) -> Just v
  30. Nothing -> Nothing
  31. getMultiple :: [Header] -> String -> [Header]
  32. getMultiple hh h = filter (\(Header (k, _)) -> k == h) hh
  33. getMultipleValue :: [Header] -> String -> [String]
  34. getMultipleValue hh = map (\(Header (_, v)) -> v) . getMultiple hh
  35. revisionHeader :: String
  36. revisionHeader = "fCMTP-Revision"
  37. baseHeader :: String
  38. baseHeader = "fCMTP-Revision-Base"
  39. addressHeader :: String
  40. addressHeader = "fCMTP-Address"
  41. resourceInfo :: [Header] -> ResourceInfo
  42. resourceInfo hh = let
  43. (mimet, mimep) = fromMaybe (def, def) $ getHeaderValue hh Mime.contentTypeHeaderName >>= bparse PMime.parseContentType
  44. curr = fromMaybe URI.NoRevision $ URI.Revision <$> getHeaderValue hh revisionHeader
  45. bb = map URI.Revision $ getMultipleValue hh baseHeader
  46. uu = catMaybes . map (bparse URI.parseURI) $ getMultipleValue hh addressHeader
  47. in ResourceInfo mimet mimep curr bb uu
  48. where
  49. bparse :: BA.Parser a -> String -> Maybe a
  50. bparse p v = eitherToMaybe . BA.parseOnly p $ SC.s v
  51. eitherToMaybe (Left _) = Nothing
  52. eitherToMaybe (Right v) = Just v