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