]> gitweb @ CieloNegro.org - Lucu.git/blob - Network/HTTP/Lucu/ETag.hs
ETag
[Lucu.git] / Network / HTTP / Lucu / ETag.hs
1 {-# LANGUAGE
2     OverloadedStrings
3   , UnicodeSyntax
4   #-}
5 {-# OPTIONS_HADDOCK prune #-}
6
7 -- |Manipulation of entity tags.
8 module Network.HTTP.Lucu.ETag
9     ( ETag(..)
10
11     , printETag
12
13     , strongETag
14     , weakETag
15     , eTagP
16     , eTagListP
17     )
18     where
19 import Control.Monad
20 import Control.Monad.Unicode
21 import Data.Ascii (Ascii)
22 import qualified Data.Ascii as A
23 import Data.Attoparsec.Char8
24 import Data.Monoid.Unicode
25 import Network.HTTP.Lucu.Parser.Http hiding (token)
26 import Network.HTTP.Lucu.Utils
27
28 -- |An entity tag is made of a weakness flag and a opaque string.
29 data ETag = ETag {
30       -- |The weakness flag. Weak tags looks like W\/\"blahblah\" and
31       -- strong tags are like \"blahblah\".
32       etagIsWeak ∷ !Bool
33       -- |An opaque string. Only characters from 0x20 (sp) to 0x7e (~)
34       -- are allowed.
35     , etagToken  ∷ !Ascii
36     } deriving (Eq, Show)
37
38 -- |Convert an 'ETag' to 'Ascii'.
39 printETag ∷ ETag → Ascii
40 printETag et
41     = A.fromAsciiBuilder $
42       ( ( if etagIsWeak et then
43               A.toAsciiBuilder "W/"
44           else
45               (∅)
46         )
47         ⊕
48         quoteStr (etagToken et) )
49
50 -- |This is equivalent to @'ETag' 'Prelude.False'@. If you want to
51 -- generate an ETag from a file, try using
52 -- 'Network.HTTP.Lucu.StaticFile.generateETagFromFile'.
53 strongETag ∷ Ascii → ETag
54 strongETag = ETag False
55
56 -- |This is equivalent to @'ETag' 'Prelude.True'@.
57 weakETag ∷ Ascii → ETag
58 weakETag = ETag True
59
60 eTagP ∷ Parser ETag
61 eTagP = try $
62         do isWeak ← option False (string "W/" ≫ return True)
63            str    ← quotedStr
64            return $ ETag isWeak str
65
66 eTagListP ∷ Parser [ETag]
67 eTagListP = do xs ← listOf eTagP
68                when (null xs) $
69                    fail "empty list of ETags"
70                return xs