Lucu 0.5 → 0.6
raw patch · 5 files changed
+31/−121 lines, 5 filesdep +time-httpdep ~HsOpenSSLdep ~basedep ~bytestringPVP ok
version bump matches the API change (PVP)
Dependencies added: time-http
Dependency ranges changed: HsOpenSSL, base, bytestring, containers, dataenc, directory, filepath, haskell-src, hxt, mtl, network, stm, time, unix, zlib
API changes (from Hackage documentation)
- Network.HTTP.Lucu.RFC1123DateTime: formatHTTPDateTime :: UTCTime -> String
- Network.HTTP.Lucu.RFC1123DateTime: formatRFC1123DateTime :: ZonedTime -> String
- Network.HTTP.Lucu.RFC1123DateTime: parseHTTPDateTime :: ByteString -> Maybe UTCTime
Files
- Lucu.cabal +17/−5
- NEWS +7/−0
- Network/HTTP/Lucu/Postprocess.hs +2/−2
- Network/HTTP/Lucu/RFC1123DateTime.hs +0/−109
- Network/HTTP/Lucu/Resource.hs +5/−5
Lucu.cabal view
@@ -8,7 +8,7 @@ messing around FastCGI. It is also intended to be run behind a reverse-proxy so it doesn't have some facilities like logging, client filtering or such like.-Version: 0.5+Version: 0.6 License: PublicDomain License-File: COPYING Author: PHO <pho at cielonegro dot org>@@ -43,9 +43,22 @@ Library Build-Depends:- HsOpenSSL, base >= 4 && < 5, bytestring, containers, dataenc,- filepath, directory, haskell-src, hxt, mtl, network, stm,- time, unix, zlib+ HsOpenSSL == 0.8.*,+ base == 4.2.*,+ bytestring == 0.9.*,+ containers == 0.3.*,+ dataenc == 0.13.*,+ filepath == 1.1.*,+ directory == 1.0.*,+ haskell-src == 1.0.*,+ hxt == 8.5.*,+ mtl == 1.1.*,+ network == 2.2.*,+ stm == 2.1.*,+ time == 1.1.*,+ time-http == 0.1.*,+ unix == 2.4.*,+ zlib == 0.5.* Exposed-Modules: Network.HTTP.Lucu@@ -60,7 +73,6 @@ Network.HTTP.Lucu.MIMEType.Guess Network.HTTP.Lucu.Parser Network.HTTP.Lucu.Parser.Http- Network.HTTP.Lucu.RFC1123DateTime Network.HTTP.Lucu.Request Network.HTTP.Lucu.Resource Network.HTTP.Lucu.Resource.Tree
NEWS view
@@ -1,3 +1,10 @@+Changes from 0.5 to 0.6+-----------------------+* New dependency: time-http == 0.1.*++* Network.HTTP.Lucu.RFC1123DateTime: removed.++ Changes from 0.4.2 to 0.5 ------------------------- * Network.HTTP.Lucu.Config: (Suggested by Voker57)
Network/HTTP/Lucu/Postprocess.hs view
@@ -11,13 +11,13 @@ import Data.IORef import Data.Maybe import Data.Time+import qualified Data.Time.HTTP as HTTP import GHC.Conc (unsafeIOToSTM) import Network.HTTP.Lucu.Abortion import Network.HTTP.Lucu.Config import Network.HTTP.Lucu.Headers import Network.HTTP.Lucu.HttpVersion import Network.HTTP.Lucu.Interaction-import Network.HTTP.Lucu.RFC1123DateTime import Network.HTTP.Lucu.Request import Network.HTTP.Lucu.Response import System.IO.Unsafe@@ -165,7 +165,7 @@ if now `mostlyEq` cachedTime then return cachedStr else- do let dateStr = C8.pack $ formatHTTPDateTime now+ do let dateStr = C8.pack $ HTTP.format now writeIORef cache (now, dateStr) return dateStr where
− Network/HTTP/Lucu/RFC1123DateTime.hs
@@ -1,109 +0,0 @@--- |This module parses and prints RFC 1123 Date and Time string.--- --- In general you don't have to use this module directly.-module Network.HTTP.Lucu.RFC1123DateTime- ( formatRFC1123DateTime- , formatHTTPDateTime- , parseHTTPDateTime- )- where--import Control.Monad-import Data.Time-import Data.Time.Calendar.WeekDate-import qualified Data.ByteString.Lazy as Lazy (ByteString)-import Network.HTTP.Lucu.Format-import Network.HTTP.Lucu.Parser-import Prelude hiding (min)---monthStr :: [String]-monthStr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]--weekStr :: [String]-weekStr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]---- |Format a 'System.Time.CalendarTime' to RFC 1123 Date and Time--- string.-formatRFC1123DateTime :: ZonedTime -> String-formatRFC1123DateTime zonedTime- = let localTime = zonedTimeToLocalTime zonedTime- timeZone = zonedTimeZone zonedTime- (year, month, day) = toGregorian (localDay localTime)- (_, _, week) = toWeekDate (localDay localTime)- timeOfDay = localTimeOfDay localTime- in- id (weekStr !! (week - 1))- ++ ", " ++- fmtDec 2 day- ++ " " ++- id (monthStr !! (month - 1))- ++ " " ++- fmtDec 4 (fromInteger year)- ++ " " ++- fmtDec 2 (todHour timeOfDay)- ++ ":" ++- fmtDec 2 (todMin timeOfDay)- ++ ":" ++- fmtDec 2 (floor (todSec timeOfDay))- ++ " " ++- id (timeZoneName timeZone)- ---- |Format a 'System.Time.ClockTime' to HTTP Date and Time. Time zone--- will be always UTC but prints as GMT.-formatHTTPDateTime :: UTCTime -> String-formatHTTPDateTime utcTime- = let timeZone = TimeZone 0 False "GMT"- zonedTime = utcToZonedTime timeZone utcTime- in- formatRFC1123DateTime zonedTime----- |Parse an HTTP Date and Time.------ Limitation: RFC 2616 (HTTP\/1.1) says we must accept these three--- formats:------ * @Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123@------ * @Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036@------ * @Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format@------ ...but currently this function only supports the RFC 1123--- format. This is a violation of RFC 2616 so this should be fixed--- later. What a bother!-parseHTTPDateTime :: Lazy.ByteString -> Maybe UTCTime-parseHTTPDateTime src- = case parse httpDateTime src of- (# Success ct, _ #) -> Just ct- (# _ , _ #) -> Nothing---httpDateTime :: Parser UTCTime-httpDateTime = do _ <- foldl (<|>) failP (map string weekStr)- _ <- char ','- _ <- char ' '- day <- liftM read (count 2 digit)- _ <- char ' '- mon <- foldl (<|>) failP (map tryEqToFst (zip monthStr [1..]))- _ <- char ' '- year <- liftM read (count 4 digit)- _ <- char ' '- hour <- liftM read (count 2 digit)- _ <- char ':'- min <- liftM read (count 2 digit)- _ <- char ':'- sec <- liftM read (count 2 digit) :: Parser Int- _ <- char ' '- _ <- string "GMT"- eof- let julianDay = fromGregorian year mon day- timeOfDay = TimeOfDay hour min (fromIntegral sec)- utcTime = UTCTime julianDay (timeOfDayToTime timeOfDay)- return utcTime- where- tryEqToFst :: (String, a) -> Parser a- tryEqToFst (str, a) = string str >> return a-
Network/HTTP/Lucu/Resource.hs view
@@ -146,6 +146,7 @@ import Data.List import Data.Maybe import Data.Time+import qualified Data.Time.HTTP as HTTP import Network.HTTP.Lucu.Abortion import Network.HTTP.Lucu.Authorization import Network.HTTP.Lucu.Config@@ -158,7 +159,6 @@ import Network.HTTP.Lucu.MultipartForm import Network.HTTP.Lucu.Parser import Network.HTTP.Lucu.Postprocess-import Network.HTTP.Lucu.RFC1123DateTime import Network.HTTP.Lucu.Request import Network.HTTP.Lucu.Response import Network.HTTP.Lucu.MIMEType@@ -425,7 +425,7 @@ method <- getMethod when (method == GET || method == HEAD)- $ setHeader' (C8.pack "Last-Modified") (C8.pack $ formatHTTPDateTime timeStamp)+ $ setHeader' (C8.pack "Last-Modified") (C8.pack $ HTTP.format timeStamp) when (method == POST) $ abort InternalServerError [] (Just "Illegal computation of foundEntity for POST request.")@@ -507,7 +507,7 @@ method <- getMethod when (method == GET || method == HEAD)- $ setHeader' (C8.pack "Last-Modified") (C8.pack $ formatHTTPDateTime timeStamp)+ $ setHeader' (C8.pack "Last-Modified") (C8.pack $ HTTP.format timeStamp) when (method == POST) $ abort InternalServerError [] (Just "Illegal computation of foundTimeStamp for POST request.")@@ -520,7 +520,7 @@ -- If-Modified-Since があればそれを見る。 ifModSince <- getHeader (C8.pack "If-Modified-Since") case ifModSince of- Just str -> case parseHTTPDateTime (L8.fromChunks [str]) of+ Just str -> case HTTP.parse (C8.unpack str) of Just lastTime -> when (timeStamp <= lastTime) $ abort statusForIfModSince []@@ -532,7 +532,7 @@ -- If-Unmodified-Since があればそれを見る。 ifUnmodSince <- getHeader (C8.pack "If-Unmodified-Since") case ifUnmodSince of- Just str -> case parseHTTPDateTime (L8.fromChunks [str]) of+ Just str -> case HTTP.parse (C8.unpack str) of Just lastTime -> when (timeStamp > lastTime) $ abort PreconditionFailed []