Resource.hs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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.Char
  9. data Header = Header (String, String) deriving (Read, Show, Eq, Ord)
  10. data ResourceInfo = ResourceInfo {
  11. mimeType :: Mime.ContentType,
  12. mimeParameters :: Mime.ContentTypeParameters,
  13. revision :: URI.Revision,
  14. bases :: [URI.Revision],
  15. address :: [URI.URI]
  16. } deriving (Eq, Ord, Show)
  17. type ResourceData = LBS.ByteString
  18. getHeader :: [Header] -> String -> Maybe Header
  19. getHeader [] _ = Nothing
  20. getHeader (h@(Header (hk, _)) : hh) k
  21. | map toLower hk == map toLower k = Just h
  22. | otherwise = getHeader hh k
  23. getHeaderValue :: [Header] -> String -> Maybe String
  24. getHeaderValue hh h = case getHeader hh h of
  25. Just (Header (_, v)) -> Just v
  26. Nothing -> Nothing
  27. getMultiple :: [Header] -> String -> [Header]
  28. getMultiple hh h = filter (\(Header (k, _)) -> k == h) hh
  29. getMultipleValue :: [Header] -> String -> [String]
  30. getMultipleValue hh = map (\(Header (_, v)) -> v) . getMultiple hh
  31. revisionHeader :: String
  32. revisionHeader = "fCMTP-Revision"
  33. baseHeader :: String
  34. baseHeader = "fCMTP-Revision-Base"
  35. addressHeader :: String
  36. addressHeader = "fCMTP-Address"
  37. resourceInfo :: [Header] -> Maybe ResourceInfo
  38. resourceInfo hh = do
  39. (mimet, mimep) <- getHeaderValue hh Mime.contentTypeHeaderName >>= bparse PMime.parseContentType
  40. curr <- URI.Revision <$> getHeaderValue hh revisionHeader
  41. let bb = map URI.Revision $ getMultipleValue hh baseHeader
  42. uu <- mapM (bparse URI.parseURI) $ getMultipleValue hh addressHeader
  43. return $ ResourceInfo mimet mimep curr bb uu
  44. where
  45. bparse :: BA.Parser a -> String -> Maybe a
  46. bparse p v = eitherToMaybe . BA.parseOnly p $ SC.s v
  47. eitherToMaybe (Left _) = Nothing
  48. eitherToMaybe (Right v) = Just v