ExtensionParser.hs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. {-# LANGUAGE OverloadedStrings #-}
  2. -- Parser of mail commands
  3. module Data.SMTP.Parser.ExtensionParser where
  4. import Data.SMTP.Extensions
  5. import Control.Applicative ((<|>))
  6. import qualified Data.Attoparsec.ByteString.Char8 as A
  7. import Data.Attoparsec.ByteString (Parser)
  8. import qualified Data.Char as C
  9. noParameterExtensions :: [ExtName]
  10. noParameterExtensions = [E8BITMIME, CHUNKING, HELP, SMTPUTF8, STARTTLS, PIPELINING,
  11. ATRN, DSN, ETRN, UTF8SMTP, ENHANCEDSTATUSCODES, EXPN, BINARYMIME,
  12. CHECKPOINT, DELIVERBY, NOSOLICITING, MTRK, SUBMITTER, BURL,
  13. FUTURERELEASE, CONPERM, CONNEG, MTPRIORITY, RRVS, SIZE]
  14. parseExtension :: Parser Extension
  15. parseExtension = parseAuth <|> parseSize <|> onlyName noParameterExtensions
  16. onlyName :: [ExtName] -> Parser Extension
  17. onlyName = foldr
  18. (\ e ->
  19. (<|>) ((A.stringCI . printExtName $ e) *> (return . OnlyExt $ e)))
  20. (fail "Unknown extension")
  21. parseAuth :: Parser Extension
  22. parseAuth = do
  23. A.stringCI "AUTH "
  24. skipHor
  25. mets <- parseAuthMethods
  26. return $ AuthExt AUTH mets
  27. parseAuthMethods :: Parser [SaslMethod]
  28. parseAuthMethods = parsePlainAuth
  29. parsePlainAuth :: Parser [SaslMethod]
  30. parsePlainAuth = do
  31. A.stringCI "PLAIN"
  32. skipHor
  33. return [PLAIN]
  34. parseSize :: Parser Extension
  35. parseSize = do
  36. A.stringCI "SIZE "
  37. skipHor
  38. size <- A.decimal
  39. return $ IntExt SIZE size
  40. skipHor :: Parser ()
  41. skipHor = A.skipWhile $ A.isHorizontalSpace . fromIntegral . C.ord