module Network.HTTP.Lucu.ETag
( ETag
- , mkETag -- Bool -> String -> ETag
+ , mkETag -- Bool -> String -> ETag
+ , strongETag -- String -> ETag
+ , weakETag -- String -> ETag
, eTagP -- Parser ETag
, eTagListP -- Parser [ETag]
)
where
+import Control.Monad
import Network.HTTP.Lucu.Parser
import Network.HTTP.Lucu.Parser.Http
+import Network.HTTP.Lucu.Utils
data ETag = ETag {
, etagToken :: String
} deriving (Eq)
-
instance Show ETag where
show (ETag isWeak token) = (if isWeak then
"W/"
else
"")
++
- foldr (++) "" (["\""] ++ map quote token ++ ["\""])
- where
- quote :: Char -> String
- quote '"' = "\\\""
- quote c = [c]
+ quoteStr token
mkETag :: Bool -> String -> ETag
mkETag = ETag
+strongETag :: String -> ETag
+strongETag = ETag False
+
+
+weakETag :: String -> ETag
+weakETag = ETag True
+
+
eTagP :: Parser ETag
eTagP = do isWeak <- option False (string "W/" >> return True)
str <- quotedStr
eTagListP :: Parser [ETag]
eTagListP = allowEOF
- $ sepBy1 eTagP (do many sp
- char ','
- many sp)
+ $ do xs <- listOf eTagP
+ when (null xs)
+ $ fail ""
+ return xs