-{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE
+ UnicodeSyntax
+ #-}
+-- |Internal functions for "Data.Time.HTTP".
module Data.Time.HTTP.Internal
- ( rfc2616DateAndTime
+ ( httpDateAndTime
+ , toAsciiBuilder
)
where
-import Control.Monad
+import Control.Applicative
+import Data.Ascii (AsciiBuilder)
+import Data.Attoparsec.Char8
import Data.Time
-import Data.Time.RFC1123.Internal
-import Data.Time.RFC733.Internal
-import Data.Time.Asctime.Internal
+import qualified Data.Time.RFC1123.Internal as RFC1123
+import Data.Time.RFC733
+import Data.Time.Asctime
+import Prelude.Unicode
--- |This is a parsec parser for date and time formats allowed in
--- HTTP\/1.1 (RFC 2616).
-rfc2616DateAndTime :: Stream s m Char => ParsecT s u m UTCTime
-rfc2616DateAndTime
- = choice [ liftM zonedTimeToUTC $ try rfc1123DateAndTime
- , liftM zonedTimeToUTC $ try rfc733DateAndTime
- , liftM (localTimeToUTC utc) asctime
+-- |Parse a date and time string in any formats allowed by HTTP\/1.1
+-- (RFC 2616).
+httpDateAndTime ∷ Parser UTCTime
+httpDateAndTime
+ = choice [ zonedTimeToUTC <$> try RFC1123.rfc1123DateAndTime
+ , zonedTimeToUTC <$> try rfc733DateAndTime
+ , localTimeToUTC utc <$> asctime
]
+
+-- |Convert a 'UTCTime' to RFC 1123 date and time string.
+toAsciiBuilder ∷ UTCTime → AsciiBuilder
+toAsciiBuilder = RFC1123.toAsciiBuilder ∘ ut2zt
+ where
+ ut2zt ∷ UTCTime → ZonedTime
+ ut2zt = utcToZonedTime gmt
+
+ gmt ∷ TimeZone
+ gmt = TimeZone 0 False "GMT"