]> gitweb @ CieloNegro.org - time-http.git/commitdiff
Data.Time.HTTP now compiles.
authorPHO <pho@cielonegro.org>
Wed, 28 Sep 2011 14:21:48 +0000 (23:21 +0900)
committerPHO <pho@cielonegro.org>
Wed, 28 Sep 2011 14:21:48 +0000 (23:21 +0900)
Ditz-issue: 85eb4c20935bf29db052a35d75039c638817227b

Data/Time/Asctime/Internal.hs
Data/Time/HTTP.hs
Data/Time/HTTP/Internal.hs
Data/Time/RFC1123/Internal.hs
Data/Time/RFC733/Internal.hs

index 910fd5d6019f2520c840e1e437954d0b53a93900..f7077596c0a1d7e9a36b1ed642ade35344896d43 100644 (file)
@@ -2,6 +2,7 @@
     OverloadedStrings
   , UnicodeSyntax
   #-}
+-- |Internal functions for "Data.Time.Asctime".
 module Data.Time.Asctime.Internal
     ( asctime
     , toAsciiBuilder
index 4352e8b0f02b2959964c9f56622e78896cc9113f..f106fc4c7f397f77466f75b3a986937ea68d16a3 100644 (file)
@@ -1,3 +1,6 @@
+{-# LANGUAGE
+    UnicodeSyntax
+  #-}
 -- |This module provides functions to parse and format HTTP\/1.1 date
 -- and time formats.
 --
 -- >              | "May" | "Jun" | "Jul" | "Aug"
 -- >              | "Sep" | "Oct" | "Nov" | "Dec"
 module Data.Time.HTTP
-    ( format
-    , parse
+    ( -- * Formatting
+      toAscii
+    , toAsciiBuilder
+
+      -- * Parsing
+    , fromAscii
+    , httpDateAndTime
     )
     where
-import qualified Data.Time.RFC1123 as RFC1123
+import Data.Ascii (Ascii)
+import qualified Data.Ascii as A
+import qualified Data.Attoparsec.Char8 as P
 import Data.Time
 import Data.Time.HTTP.Internal
+import Prelude.Unicode
 
--- |Format an 'UTCTime' in RFC 1123 date and time.
-format :: UTCTime -> String
-format utcTime
-    = let timeZone  = TimeZone 0 False "GMT"
-          zonedTime = utcToZonedTime timeZone utcTime
-      in
-        RFC1123.format zonedTime
+-- |Convert a 'UTCTime' to RFC 1123 date and time string.
+toAscii ∷ UTCTime → Ascii
+toAscii = A.fromAsciiBuilder ∘ toAsciiBuilder
 
 -- |Parse a date and time string in any of RFC 822, RFC 1123, RFC 850
 -- and ANSI C's asctime() formats. When the string can't be parsed, it
--- returns 'Nothing'.
+-- returns @'Left' err@.
 --
 -- This function is even more permissive than what HTTP\/1.1
 -- specifies. That is, it accepts 2-digit years in RFC 822, omitted
 -- separator symbols in RFC 850, omitted sec fields, and non-GMT time
 -- zones. I believe this behavior will not cause a problem but you
 -- should know this.
-parse :: String -> Maybe UTCTime
-parse src = case P.parse p "" src of
-              Right ut -> Just ut
-              Left  _  -> Nothing
+fromAscii ∷ Ascii → Either String UTCTime
+fromAscii = P.parseOnly p ∘ A.toByteString
     where
-      p = do zt <- rfc2616DateAndTime
-             _  <- P.eof
+      p = do zt ← httpDateAndTime
+             P.endOfInput
              return zt
index 06a0ad2c532f6068a4dd30b1ba79d1af3dba87aa..e94567076420449fb0c22e27b7fd8bb4f5aef3ad 100644 (file)
@@ -1,19 +1,36 @@
-{-# 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 qualified Data.Time.RFC733.Internal  as RFC733
+import qualified Data.Time.Asctime.Internal as 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 RFC733.rfc733DateAndTime
+             , localTimeToUTC utc <$> Asctime.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"
index bfb03675e7b0128531d9d6903888361be2cbe9cb..4ae25b76b7c48d452c70367682da65112ee5ac27 100644 (file)
@@ -2,6 +2,7 @@
     OverloadedStrings
   , UnicodeSyntax
   #-}
+-- |Internal functions for "Data.Time.RFC1123".
 module Data.Time.RFC1123.Internal
     ( rfc1123DateAndTime
     , toAsciiBuilder
index d1de6d864014437577cc95654705161be866d18e..d6aea4110904dcbc928f2af3f618fcad55f3b9f2 100644 (file)
@@ -2,6 +2,7 @@
     OverloadedStrings
   , UnicodeSyntax
   #-}
+-- |Internal functions for "Data.Time.RFC733".
 module Data.Time.RFC733.Internal
     ( rfc733DateAndTime
     )