6 module Network.HTTP.Lucu.Implant.Input
16 import Codec.Compression.GZip
17 import Control.Applicative
18 import qualified Data.Ascii as A
19 import qualified Data.ByteString.Lazy as L
20 import Data.Digest.Pure.SHA
23 import Data.Time.Clock.POSIX
24 import Network.HTTP.Lucu.ETag
25 import Network.HTTP.Lucu.MIMEType hiding (mimeType)
26 import Network.HTTP.Lucu.MIMEType.DefaultExtensionMap
27 import Network.HTTP.Lucu.MIMEType.Guess
28 import Network.HTTP.Lucu.MIMEType.TH
29 import Prelude.Unicode
30 import System.Posix.Files
38 , iRawData ∷ !L.ByteString
39 , iGZipped ∷ !L.ByteString
42 originalLen ∷ Input → Integer
43 originalLen (Input {..})
44 = fromIntegral $ L.length iRawData
46 gzippedLen ∷ Input → Integer
47 gzippedLen (Input {..})
48 = fromIntegral $ L.length iGZipped
50 useGZip ∷ Input → Bool
52 = originalLen i ≥ gzippedLen i
54 openInput ∷ FilePath → Maybe MIMEType → Maybe ETag → IO Input
55 openInput fpath ctype etag
56 = do lastMod ← lastModified fpath
57 input ← openInputFile fpath
61 , iType = fromMaybe octetStream
62 $ ctype <|> guessType fpath
63 , iETag = fromMaybe (mkETagFromInput input) etag
65 , iGZipped = compressWith compParams input
68 octetStream ∷ MIMEType
69 octetStream = [mimeType| application/octet-stream |]
71 compParams ∷ CompressParams
72 compParams = defaultCompressParams {
73 compressLevel = bestCompression
76 lastModified ∷ FilePath → IO UTCTime
77 lastModified "-" = getCurrentTime
78 lastModified fpath = ( posixSecondsToUTCTime
86 openInputFile ∷ FilePath → IO L.ByteString
87 openInputFile "-" = L.getContents
88 openInputFile fpath = L.readFile fpath
90 guessType ∷ FilePath → Maybe MIMEType
91 guessType = guessTypeByFileName defaultExtensionMap
93 mkETagFromInput ∷ L.ByteString → ETag
95 = strongETag $ A.unsafeFromString
96 $ "SHA-1:" ⧺ showDigest (sha1 input)