{-# LANGUAGE CPP, DeriveDataTypeable, DeriveFunctor, DeriveGeneric, FlexibleContexts, OverloadedStrings, RecordWildCards #-}moduleNetwork.Wreq.Cache(shouldCache ,validateEntry ,cacheStore )whereimportControl.ApplicativeimportControl.Lens((^?),(^.),(^..),folded,non,pre,to)importControl.Monad(guard)importData.Attoparsec.ByteString.Char8asAimportData.CaseInsensitive(mk)importData.Foldable(forM_)importData.HashSet(HashSet)importData.Hashable(Hashable)importData.IntSet(IntSet)importData.IORef(newIORef)importData.List(sort)importData.Maybe(listToMaybe)importData.Monoid(First(..),mconcat)importData.Time.Clock(UTCTime,addUTCTime,getCurrentTime)importData.Time.Format(parseTimeM)importData.Time.Locale.Compat(defaultTimeLocale)importData.Typeable(Typeable)importGHC.Generics(Generic)importNetwork.HTTP.Types(HeaderName,Method)importNetwork.Wreq.Internal.Lens importNetwork.Wreq.Internal.Types importNetwork.Wreq.Lens importqualifiedData.ByteString.Char8asBimportqualifiedData.HashSetasHashSetimportqualifiedData.IntSetasIntSetimportqualifiedNetwork.Wreq.Cache.Store asStore #if MIN_VERSION_base(4,6,0) importData.IORef(atomicModifyIORef') #else importData.IORef(IORef,atomicModifyIORef)atomicModifyIORef'::IORefa->(a->(a,b))->IObatomicModifyIORef'=atomicModifyIORef #endif cacheStore ::Int->IO(Run body ->Run body )cacheStore :: forall body. Seconds -> IO (Run body -> Run body) cacheStore Seconds capacity =doIORef (Store Method (CacheEntry body)) cache <-Store Method (CacheEntry body) -> IO (IORef (Store Method (CacheEntry body))) forall a. a -> IO (IORef a) newIORef(Seconds -> Store Method (CacheEntry body) forall k v. Ord k => Seconds -> Store k v Store.empty Seconds capacity )(Run body -> Run body) -> IO (Run body -> Run body) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return((Run body -> Run body) -> IO (Run body -> Run body)) -> (Run body -> Run body) -> IO (Run body -> Run body) forall a b. (a -> b) -> a -> b $\Run body run Req req ->doleturl :: Method url =Req -> Method reqURL Req req UTCTime before <-IO UTCTime getCurrentTimeMaybe (Response body) mresp <-IORef (Store Method (CacheEntry body)) -> (Store Method (CacheEntry body) -> (Store Method (CacheEntry body), Maybe (Response body))) -> IO (Maybe (Response body)) forall a b. IORef a -> (a -> (a, b)) -> IO b atomicModifyIORef'IORef (Store Method (CacheEntry body)) cache ((Store Method (CacheEntry body) -> (Store Method (CacheEntry body), Maybe (Response body))) -> IO (Maybe (Response body))) -> (Store Method (CacheEntry body) -> (Store Method (CacheEntry body), Maybe (Response body))) -> IO (Maybe (Response body)) forall a b. (a -> b) -> a -> b $\Store Method (CacheEntry body) s ->caseMethod -> Store Method (CacheEntry body) -> Maybe (CacheEntry body, Store Method (CacheEntry body)) forall k v. (Ord k, Hashable k) => k -> Store k v -> Maybe (v, Store k v) Store.lookup Method url Store Method (CacheEntry body) s ofMaybe (CacheEntry body, Store Method (CacheEntry body)) Nothing->(Store Method (CacheEntry body) s ,Maybe (Response body) forall a. Maybe a Nothing)Just(CacheEntry body ce ,Store Method (CacheEntry body) s' )->caseUTCTime -> CacheEntry body -> Maybe (Response body) forall body. UTCTime -> CacheEntry body -> Maybe (Response body) validateEntry UTCTime before CacheEntry body ce ofn :: Maybe (Response body) n @Maybe (Response body) Nothing->(Method -> Store Method (CacheEntry body) -> Store Method (CacheEntry body) forall k v. (Ord k, Hashable k) => k -> Store k v -> Store k v Store.delete Method url Store Method (CacheEntry body) s ,Maybe (Response body) n )Maybe (Response body) resp ->(Store Method (CacheEntry body) s' ,Maybe (Response body) resp )caseMaybe (Response body) mresp ofJustResponse body resp ->Response body -> IO (Response body) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a returnResponse body resp Maybe (Response body) Nothing->doResponse body resp <-Run body run Req req UTCTime after <-IO UTCTime getCurrentTimeMaybe (CacheEntry body) -> (CacheEntry body -> IO ()) -> IO () forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_(UTCTime -> Req -> Response body -> Maybe (CacheEntry body) forall body. UTCTime -> Req -> Response body -> Maybe (CacheEntry body) shouldCache UTCTime after Req req Response body resp )((CacheEntry body -> IO ()) -> IO ()) -> (CacheEntry body -> IO ()) -> IO () forall a b. (a -> b) -> a -> b $\CacheEntry body ce ->IORef (Store Method (CacheEntry body)) -> (Store Method (CacheEntry body) -> (Store Method (CacheEntry body), ())) -> IO () forall a b. IORef a -> (a -> (a, b)) -> IO b atomicModifyIORef'IORef (Store Method (CacheEntry body)) cache ((Store Method (CacheEntry body) -> (Store Method (CacheEntry body), ())) -> IO ()) -> (Store Method (CacheEntry body) -> (Store Method (CacheEntry body), ())) -> IO () forall a b. (a -> b) -> a -> b $\Store Method (CacheEntry body) s ->(Method -> CacheEntry body -> Store Method (CacheEntry body) -> Store Method (CacheEntry body) forall k v. (Ord k, Hashable k) => k -> v -> Store k v -> Store k v Store.insert Method url CacheEntry body ce Store Method (CacheEntry body) s ,())Response body -> IO (Response body) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a returnResponse body resp cacheableStatuses ::IntSetcacheableStatuses :: IntSet cacheableStatuses =[Seconds] -> IntSet IntSet.fromList[Seconds 200,Seconds 203,Seconds 300,Seconds 301,Seconds 410]cacheableMethods ::HashSetMethodcacheableMethods :: HashSet Method cacheableMethods =[Method] -> HashSet Method forall a. (Eq a, Hashable a) => [a] -> HashSet a HashSet.fromList[Method "GET",Method "HEAD",Method "OPTIONS"]possiblyCacheable ::Request->Responsebody ->BoolpossiblyCacheable :: forall body. Request -> Response body -> Bool possiblyCacheable Request req Response body resp =(Request req Request -> Getting Method Request Method -> Method forall s a. s -> Getting a s a -> a ^.Getting Method Request Method Lens' Request Method method )Method -> HashSet Method -> Bool forall a. (Eq a, Hashable a) => a -> HashSet a -> Bool `HashSet.member`HashSet Method cacheableMethods Bool -> Bool -> Bool &&(Response body resp Response body -> Getting Seconds (Response body) Seconds -> Seconds forall s a. s -> Getting a s a -> a ^.(Status -> Const Seconds Status) -> Response body -> Const Seconds (Response body) forall body (f :: * -> *). Functor f => (Status -> f Status) -> Response body -> f (Response body) responseStatus ((Status -> Const Seconds Status) -> Response body -> Const Seconds (Response body)) -> ((Seconds -> Const Seconds Seconds) -> Status -> Const Seconds Status) -> Getting Seconds (Response body) Seconds forall b c a. (b -> c) -> (a -> b) -> a -> c .(Seconds -> Const Seconds Seconds) -> Status -> Const Seconds Status Lens' Status Seconds statusCode )Seconds -> IntSet -> Bool `IntSet.member`IntSet cacheableStatuses computeExpiration ::UTCTime->[CacheResponse Seconds ]->MaybeUTCTimecomputeExpiration :: UTCTime -> [CacheResponse Seconds] -> Maybe UTCTime computeExpiration UTCTime now [CacheResponse Seconds] crs =doBool -> Maybe () forall (f :: * -> *). Alternative f => Bool -> f () guard(Bool -> Maybe ()) -> Bool -> Maybe () forall a b. (a -> b) -> a -> b $[Bool] -> Bool forall (t :: * -> *). Foldable t => t Bool -> Bool and[[HeaderName] -> CacheResponse Seconds forall age. [HeaderName] -> CacheResponse age NoCache []CacheResponse Seconds -> [CacheResponse Seconds] -> Bool forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `notElem`[CacheResponse Seconds] crs ,CacheResponse Seconds forall age. CacheResponse age NoStore CacheResponse Seconds -> [CacheResponse Seconds] -> Bool forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool `notElem`[CacheResponse Seconds] crs ]Seconds age <-[Seconds] -> Maybe Seconds forall a. [a] -> Maybe a listToMaybe([Seconds] -> Maybe Seconds) -> [Seconds] -> Maybe Seconds forall a b. (a -> b) -> a -> b $[Seconds] -> [Seconds] forall a. Ord a => [a] -> [a] sort[Seconds age |MaxAge Seconds age <-[CacheResponse Seconds] crs ]UTCTime -> Maybe UTCTime forall a. a -> Maybe a forall (m :: * -> *) a. Monad m => a -> m a return(UTCTime -> Maybe UTCTime) -> UTCTime -> Maybe UTCTime forall a b. (a -> b) -> a -> b $!Seconds -> NominalDiffTime forall a b. (Integral a, Num b) => a -> b fromIntegralSeconds age NominalDiffTime -> UTCTime -> UTCTime `addUTCTime`UTCTime now validateEntry ::UTCTime->CacheEntry body ->Maybe(Responsebody )validateEntry :: forall body. UTCTime -> CacheEntry body -> Maybe (Response body) validateEntry UTCTime now CacheEntry {Maybe UTCTime UTCTime Response body entryCreated :: UTCTime entryExpires :: Maybe UTCTime entryResponse :: Response body entryCreated :: forall body. CacheEntry body -> UTCTime entryExpires :: forall body. CacheEntry body -> Maybe UTCTime entryResponse :: forall body. CacheEntry body -> Response body .. }=caseMaybe UTCTime entryExpires ofMaybe UTCTime Nothing->Response body -> Maybe (Response body) forall a. a -> Maybe a JustResponse body entryResponse JustUTCTime e |UTCTime e UTCTime -> UTCTime -> Bool forall a. Ord a => a -> a -> Bool >UTCTime now ->Response body -> Maybe (Response body) forall a. a -> Maybe a JustResponse body entryResponse Maybe UTCTime _->Maybe (Response body) forall a. Maybe a NothingshouldCache ::UTCTime->Req ->Responsebody ->Maybe(CacheEntry body )shouldCache :: forall body. UTCTime -> Req -> Response body -> Maybe (CacheEntry body) shouldCache UTCTime now (Req Mgr _Request req )Response body resp =doBool -> Maybe () forall (f :: * -> *). Alternative f => Bool -> f () guard(Request -> Response body -> Bool forall body. Request -> Response body -> Bool possiblyCacheable Request req Response body resp )letcrs :: [CacheResponse Seconds] crs =Response body resp Response body -> Getting (Endo [CacheResponse Seconds]) (Response body) (CacheResponse Seconds) -> [CacheResponse Seconds] forall s a. s -> Getting (Endo [a]) s a -> [a] ^..HeaderName -> Traversal' (Response body) Method forall body. HeaderName -> Traversal' (Response body) Method responseHeader HeaderName "Cache-Control"((Method -> Const (Endo [CacheResponse Seconds]) Method) -> Response body -> Const (Endo [CacheResponse Seconds]) (Response body)) -> ((CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> Method -> Const (Endo [CacheResponse Seconds]) Method) -> Getting (Endo [CacheResponse Seconds]) (Response body) (CacheResponse Seconds) forall b c a. (b -> c) -> (a -> b) -> a -> c .Parser [CacheResponse Seconds] -> Fold Method [CacheResponse Seconds] forall a. Parser a -> Fold Method a atto_ Parser [CacheResponse Seconds] parseCacheResponse (([CacheResponse Seconds] -> Const (Endo [CacheResponse Seconds]) [CacheResponse Seconds]) -> Method -> Const (Endo [CacheResponse Seconds]) Method) -> ((CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> [CacheResponse Seconds] -> Const (Endo [CacheResponse Seconds]) [CacheResponse Seconds]) -> (CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> Method -> Const (Endo [CacheResponse Seconds]) Method forall b c a. (b -> c) -> (a -> b) -> a -> c .(CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> [CacheResponse Seconds] -> Const (Endo [CacheResponse Seconds]) [CacheResponse Seconds] forall (f :: * -> *) a. Foldable f => IndexedFold Seconds (f a) a IndexedFold Seconds [CacheResponse Seconds] (CacheResponse Seconds) folded((CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> [CacheResponse Seconds] -> Const (Endo [CacheResponse Seconds]) [CacheResponse Seconds]) -> ((CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> (CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> [CacheResponse Seconds] -> Const (Endo [CacheResponse Seconds]) [CacheResponse Seconds] forall b c a. (b -> c) -> (a -> b) -> a -> c .(CacheResponse Seconds -> CacheResponse Seconds) -> (CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds)) -> CacheResponse Seconds -> Const (Endo [CacheResponse Seconds]) (CacheResponse Seconds) forall (p :: * -> * -> *) (f :: * -> *) s a. (Profunctor p, Contravariant f) => (s -> a) -> Optic' p f s a toCacheResponse Seconds -> CacheResponse Seconds forall age. CacheResponse age -> CacheResponse age simplifyCacheResponse dateHeader :: HeaderName -> p UTCTime (f UTCTime) -> Response body -> f (Response body) dateHeader HeaderName name =HeaderName -> Traversal' (Response body) Method forall body. HeaderName -> Traversal' (Response body) Method responseHeader HeaderName name ((Method -> f Method) -> Response body -> f (Response body)) -> (p UTCTime (f UTCTime) -> Method -> f Method) -> p UTCTime (f UTCTime) -> Response body -> f (Response body) forall b c a. (b -> c) -> (a -> b) -> a -> c .(Method -> Maybe UTCTime) -> (Maybe UTCTime -> f (Maybe UTCTime)) -> Method -> f Method forall (p :: * -> * -> *) (f :: * -> *) s a. (Profunctor p, Contravariant f) => (s -> a) -> Optic' p f s a toMethod -> Maybe UTCTime parseDate ((Maybe UTCTime -> f (Maybe UTCTime)) -> Method -> f Method) -> (p UTCTime (f UTCTime) -> Maybe UTCTime -> f (Maybe UTCTime)) -> p UTCTime (f UTCTime) -> Method -> f Method forall b c a. (b -> c) -> (a -> b) -> a -> c .p UTCTime (f UTCTime) -> Maybe UTCTime -> f (Maybe UTCTime) forall (f :: * -> *) a. Foldable f => IndexedFold Seconds (f a) a IndexedFold Seconds (Maybe UTCTime) UTCTime foldedmexpires :: Maybe UTCTime mexpires =case[CacheResponse Seconds] crs of[]->Response body resp Response body -> Getting (First UTCTime) (Response body) UTCTime -> Maybe UTCTime forall s a. s -> Getting (First a) s a -> Maybe a ^?HeaderName -> Getting (First UTCTime) (Response body) UTCTime forall {f :: * -> *} {p :: * -> * -> *} {body}. (Contravariant f, Indexable Seconds p, Applicative f) => HeaderName -> p UTCTime (f UTCTime) -> Response body -> f (Response body) dateHeader HeaderName "Expires"[CacheResponse Seconds] _->UTCTime -> [CacheResponse Seconds] -> Maybe UTCTime computeExpiration UTCTime now [CacheResponse Seconds] crs created :: UTCTime created =Response body resp Response body -> Getting UTCTime (Response body) UTCTime -> UTCTime forall s a. s -> Getting a s a -> a ^.Getting (First UTCTime) (Response body) UTCTime -> IndexPreservingGetter (Response body) (Maybe UTCTime) forall a s. Getting (First a) s a -> IndexPreservingGetter s (Maybe a) pre(HeaderName -> Getting (First UTCTime) (Response body) UTCTime forall {f :: * -> *} {p :: * -> * -> *} {body}. (Contravariant f, Indexable Seconds p, Applicative f) => HeaderName -> p UTCTime (f UTCTime) -> Response body -> f (Response body) dateHeader HeaderName "Date")((Maybe UTCTime -> Const UTCTime (Maybe UTCTime)) -> Response body -> Const UTCTime (Response body)) -> ((UTCTime -> Const UTCTime UTCTime) -> Maybe UTCTime -> Const UTCTime (Maybe UTCTime)) -> Getting UTCTime (Response body) UTCTime forall b c a. (b -> c) -> (a -> b) -> a -> c .UTCTime -> Iso' (Maybe UTCTime) UTCTime forall a. Eq a => a -> Iso' (Maybe a) a nonUTCTime now caseMaybe UTCTime mexpires ofJustUTCTime expires |UTCTime expires UTCTime -> UTCTime -> Bool forall a. Ord a => a -> a -> Bool <=UTCTime created ->Maybe (CacheEntry body) forall a. Maybe a forall (f :: * -> *) a. Alternative f => f a emptyMaybe UTCTime Nothing|Request req Request -> Getting Method Request Method -> Method forall s a. s -> Getting a s a -> a ^.Getting Method Request Method Lens' Request Method method Method -> Method -> Bool forall a. Eq a => a -> a -> Bool ==Method "GET"Bool -> Bool -> Bool &&Bool -> Bool not(Method -> Bool B.null(Request req Request -> Getting Method Request Method -> Method forall s a. s -> Getting a s a -> a ^.Getting Method Request Method Lens' Request Method queryString ))->Maybe (CacheEntry body) forall a. Maybe a forall (f :: * -> *) a. Alternative f => f a emptyMaybe UTCTime _->CacheEntry body -> Maybe (CacheEntry body) forall a. a -> Maybe a forall (m :: * -> *) a. Monad m => a -> m a return(CacheEntry body -> Maybe (CacheEntry body)) -> CacheEntry body -> Maybe (CacheEntry body) forall a b. (a -> b) -> a -> b $UTCTime -> Maybe UTCTime -> Response body -> CacheEntry body forall body. UTCTime -> Maybe UTCTime -> Response body -> CacheEntry body CacheEntry UTCTime created Maybe UTCTime mexpires Response body resp typeSeconds =IntdataCacheResponse age =Public |Private [HeaderName]|NoCache [HeaderName]|NoStore |NoTransform |MustRevalidate |ProxyRevalidate |MaxAge age |SMaxAge age |Extension deriving(CacheResponse age -> CacheResponse age -> Bool (CacheResponse age -> CacheResponse age -> Bool) -> (CacheResponse age -> CacheResponse age -> Bool) -> Eq (CacheResponse age) forall age. Eq age => CacheResponse age -> CacheResponse age -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall age. Eq age => CacheResponse age -> CacheResponse age -> Bool == :: CacheResponse age -> CacheResponse age -> Bool $c/= :: forall age. Eq age => CacheResponse age -> CacheResponse age -> Bool /= :: CacheResponse age -> CacheResponse age -> Bool Eq,Seconds -> CacheResponse age -> ShowS [CacheResponse age] -> ShowS CacheResponse age -> String (Seconds -> CacheResponse age -> ShowS) -> (CacheResponse age -> String) -> ([CacheResponse age] -> ShowS) -> Show (CacheResponse age) forall age. Show age => Seconds -> CacheResponse age -> ShowS forall age. Show age => [CacheResponse age] -> ShowS forall age. Show age => CacheResponse age -> String forall a. (Seconds -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall age. Show age => Seconds -> CacheResponse age -> ShowS showsPrec :: Seconds -> CacheResponse age -> ShowS $cshow :: forall age. Show age => CacheResponse age -> String show :: CacheResponse age -> String $cshowList :: forall age. Show age => [CacheResponse age] -> ShowS showList :: [CacheResponse age] -> ShowS Show,(forall a b. (a -> b) -> CacheResponse a -> CacheResponse b) -> (forall a b. a -> CacheResponse b -> CacheResponse a) -> Functor CacheResponse forall a b. a -> CacheResponse b -> CacheResponse a forall a b. (a -> b) -> CacheResponse a -> CacheResponse b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f $cfmap :: forall a b. (a -> b) -> CacheResponse a -> CacheResponse b fmap :: forall a b. (a -> b) -> CacheResponse a -> CacheResponse b $c<$ :: forall a b. a -> CacheResponse b -> CacheResponse a <$ :: forall a b. a -> CacheResponse b -> CacheResponse a Functor,Typeable,(forall x. CacheResponse age -> Rep (CacheResponse age) x) -> (forall x. Rep (CacheResponse age) x -> CacheResponse age) -> Generic (CacheResponse age) forall x. Rep (CacheResponse age) x -> CacheResponse age forall x. CacheResponse age -> Rep (CacheResponse age) x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a forall age x. Rep (CacheResponse age) x -> CacheResponse age forall age x. CacheResponse age -> Rep (CacheResponse age) x $cfrom :: forall age x. CacheResponse age -> Rep (CacheResponse age) x from :: forall x. CacheResponse age -> Rep (CacheResponse age) x $cto :: forall age x. Rep (CacheResponse age) x -> CacheResponse age to :: forall x. Rep (CacheResponse age) x -> CacheResponse age Generic)instanceHashableage =>Hashable(CacheResponse age )simplifyCacheResponse ::CacheResponse age ->CacheResponse age simplifyCacheResponse :: forall age. CacheResponse age -> CacheResponse age simplifyCacheResponse (Private [HeaderName] _)=[HeaderName] -> CacheResponse age forall age. [HeaderName] -> CacheResponse age Private []simplifyCacheResponse (NoCache [HeaderName] _)=[HeaderName] -> CacheResponse age forall age. [HeaderName] -> CacheResponse age NoCache []simplifyCacheResponse CacheResponse age cr =CacheResponse age cr parseCacheResponse ::A.Parser[CacheResponse Seconds ]parseCacheResponse :: Parser [CacheResponse Seconds] parseCacheResponse =Parser Method (CacheResponse Seconds) -> Parser [CacheResponse Seconds] forall {a}. Parser Method a -> Parser Method [a] commaSep1 Parser Method (CacheResponse Seconds) body wherebody :: Parser Method (CacheResponse Seconds) body =Parser Method Method "public"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>CacheResponse Seconds -> Parser Method (CacheResponse Seconds) forall a. a -> Parser Method a forall (f :: * -> *) a. Applicative f => a -> f a pureCacheResponse Seconds forall age. CacheResponse age Public Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "private"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>([HeaderName] -> CacheResponse Seconds forall age. [HeaderName] -> CacheResponse age Private ([HeaderName] -> CacheResponse Seconds) -> Parser Method [HeaderName] -> Parser Method (CacheResponse Seconds) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>(Parser Method [HeaderName] -> Parser Method [HeaderName] forall {b}. Parser Method b -> Parser Method b eq Parser Method [HeaderName] headerNames Parser Method [HeaderName] -> Parser Method [HeaderName] -> Parser Method [HeaderName] forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>[HeaderName] -> Parser Method [HeaderName] forall a. a -> Parser Method a forall (f :: * -> *) a. Applicative f => a -> f a pure[]))Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "no-cache"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>([HeaderName] -> CacheResponse Seconds forall age. [HeaderName] -> CacheResponse age NoCache ([HeaderName] -> CacheResponse Seconds) -> Parser Method [HeaderName] -> Parser Method (CacheResponse Seconds) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>(Parser Method [HeaderName] -> Parser Method [HeaderName] forall {b}. Parser Method b -> Parser Method b eq Parser Method [HeaderName] headerNames Parser Method [HeaderName] -> Parser Method [HeaderName] -> Parser Method [HeaderName] forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>[HeaderName] -> Parser Method [HeaderName] forall a. a -> Parser Method a forall (f :: * -> *) a. Applicative f => a -> f a pure[]))Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "no-store"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>CacheResponse Seconds -> Parser Method (CacheResponse Seconds) forall a. a -> Parser Method a forall (f :: * -> *) a. Applicative f => a -> f a pureCacheResponse Seconds forall age. CacheResponse age NoStore Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "no-transform"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>CacheResponse Seconds -> Parser Method (CacheResponse Seconds) forall a. a -> Parser Method a forall (f :: * -> *) a. Applicative f => a -> f a pureCacheResponse Seconds forall age. CacheResponse age NoTransform Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "must-revalidate"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>CacheResponse Seconds -> Parser Method (CacheResponse Seconds) forall a. a -> Parser Method a forall (f :: * -> *) a. Applicative f => a -> f a pureCacheResponse Seconds forall age. CacheResponse age MustRevalidate Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "proxy-revalidate"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>CacheResponse Seconds -> Parser Method (CacheResponse Seconds) forall a. a -> Parser Method a forall (f :: * -> *) a. Applicative f => a -> f a pureCacheResponse Seconds forall age. CacheResponse age ProxyRevalidate Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "max-age"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall {b}. Parser Method b -> Parser Method b eq (Seconds -> CacheResponse Seconds forall age. age -> CacheResponse age MaxAge (Seconds -> CacheResponse Seconds) -> Parser Method Seconds -> Parser Method (CacheResponse Seconds) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>Parser Method Seconds forall a. Integral a => Parser a decimal)Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a. Parser Method a -> Parser Method a -> Parser Method a forall (f :: * -> *) a. Alternative f => f a -> f a -> f a <|>Parser Method Method "s-maxage"Parser Method Method -> Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Parser Method (CacheResponse Seconds) -> Parser Method (CacheResponse Seconds) forall {b}. Parser Method b -> Parser Method b eq (Seconds -> CacheResponse Seconds forall age. age -> CacheResponse age SMaxAge (Seconds -> CacheResponse Seconds) -> Parser Method Seconds -> Parser Method (CacheResponse Seconds) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>Parser Method Seconds forall a. Integral a => Parser a decimal)headerNames :: Parser Method [HeaderName] headerNames =Char -> Parser Char A.charChar '"'Parser Char -> Parser Method [HeaderName] -> Parser Method [HeaderName] forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Parser Method HeaderName -> Parser Method [HeaderName] forall {a}. Parser Method a -> Parser Method [a] commaSep1 Parser Method HeaderName hdr Parser Method [HeaderName] -> Parser Char -> Parser Method [HeaderName] forall a b. Parser Method a -> Parser Method b -> Parser Method a forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a <*Char -> Parser Char A.charChar '"'hdr :: Parser Method HeaderName hdr =Method -> HeaderName forall s. FoldCase s => s -> CI s mk(Method -> HeaderName) -> Parser Method Method -> Parser Method HeaderName forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>(Char -> Bool) -> Parser Method Method A.takeWhile1(String -> Char -> Bool inClassString "a-zA-Z0-9_-")commaSep1 :: Parser Method a -> Parser Method [a] commaSep1 Parser Method a p =(Parser Method a p Parser Method a -> Parser Method () -> Parser Method a forall a b. Parser Method a -> Parser Method b -> Parser Method a forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a <*Parser Method () skipSpace)Parser Method a -> Parser Method () -> Parser Method [a] forall (f :: * -> *) a s. Alternative f => f a -> f s -> f [a] `sepBy1`(Char -> Parser Char A.charChar ','Parser Char -> Parser Method () -> Parser Method () forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Parser Method () skipSpace)eq :: Parser Method b -> Parser Method b eq Parser Method b p =Parser Method () skipSpaceParser Method () -> Parser Char -> Parser Char forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Char -> Parser Char A.charChar '='Parser Char -> Parser Method () -> Parser Method () forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Parser Method () skipSpaceParser Method () -> Parser Method b -> Parser Method b forall a b. Parser Method a -> Parser Method b -> Parser Method b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Parser Method b p parseDate ::B.ByteString->MaybeUTCTimeparseDate :: Method -> Maybe UTCTime parseDate Method s =First UTCTime -> Maybe UTCTime forall a. First a -> Maybe a getFirst(First UTCTime -> Maybe UTCTime) -> ([String] -> First UTCTime) -> [String] -> Maybe UTCTime forall b c a. (b -> c) -> (a -> b) -> a -> c .[First UTCTime] -> First UTCTime forall a. Monoid a => [a] -> a mconcat([First UTCTime] -> First UTCTime) -> ([String] -> [First UTCTime]) -> [String] -> First UTCTime forall b c a. (b -> c) -> (a -> b) -> a -> c .(String -> First UTCTime) -> [String] -> [First UTCTime] forall a b. (a -> b) -> [a] -> [b] mapString -> First UTCTime forall {a}. ParseTime a => String -> First a tryout ([String] -> Maybe UTCTime) -> [String] -> Maybe UTCTime forall a b. (a -> b) -> a -> b $[String "%a, %d %b %Y %H:%M:%S %Z",String "%A, %d-%b-%y %H:%M:%S %Z",String "%a %b %e %H:%M:%S %Y"]wheretryout :: String -> First a tryout String fmt =Maybe a -> First a forall a. Maybe a -> First a First(Maybe a -> First a) -> Maybe a -> First a forall a b. (a -> b) -> a -> b $Bool -> TimeLocale -> String -> String -> Maybe a forall (m :: * -> *) t. (MonadFail m, ParseTime t) => Bool -> TimeLocale -> String -> String -> m t parseTimeMBool TrueTimeLocale defaultTimeLocaleString fmt (Method -> String B.unpackMethod s )