]> gitweb @ CieloNegro.org - Lucu.git/blob - Network/HTTP/Lucu/ETag.hs
The attoparsec branch. It doesn't even compile for now.
[Lucu.git] / Network / HTTP / Lucu / ETag.hs
1 {-# OPTIONS_HADDOCK prune #-}
2
3 -- |Manipulation of entity tags.
4 module Network.HTTP.Lucu.ETag
5     ( ETag(..)
6     , strongETag
7     , weakETag
8     , eTagP
9     , eTagListP
10     )
11     where
12 import Control.Monad
13 import Network.HTTP.Lucu.Parser.Http hiding (token)
14 import Network.HTTP.Lucu.Utils
15
16 -- |An entity tag is made of a weakness flag and a opaque string.
17 data ETag = ETag {
18       -- |The weakness flag. Weak tags looks like W\/\"blahblah\" and
19       -- strong tags are like \"blahblah\".
20       etagIsWeak :: !Bool
21       -- |An opaque string. Only characters from 0x20 (sp) to 0x7e (~)
22       -- are allowed.
23     , etagToken  :: !String
24     } deriving (Eq)
25
26 instance Show ETag where
27     show (ETag isWeak token) = (if isWeak then
28                                     "W/"
29                                 else
30                                     "")
31                                ++
32                                quoteStr token
33
34 -- |This is equivalent to @'ETag' 'Prelude.False'@. If you want to
35 -- generate an ETag from a file, try using
36 -- 'Network.HTTP.Lucu.StaticFile.generateETagFromFile'.
37 strongETag :: String -> ETag
38 strongETag = ETag False
39
40 -- |This is equivalent to @'ETag' 'Prelude.True'@.
41 weakETag :: String -> ETag
42 weakETag = ETag True
43
44
45 eTagP :: Parser ETag
46 eTagP = do isWeak <- option False (string "W/" >> return True)
47            str    <- quotedStr
48            return $ ETag isWeak str
49
50
51 eTagListP :: Parser [ETag]
52 eTagListP = allowEOF
53             $! do xs <- listOf eTagP
54                   when (null xs)
55                            $ fail ""
56                   return xs