]> gitweb @ CieloNegro.org - Lucu.git/commitdiff
Code clean-up using convertible-text.
authorPHO <pho@cielonegro.org>
Mon, 19 Dec 2011 12:17:28 +0000 (21:17 +0900)
committerPHO <pho@cielonegro.org>
Mon, 19 Dec 2011 12:17:28 +0000 (21:17 +0900)
Ditz-issue: 0a2a377be55430e655ab42fdc4902fa56a058b26

12 files changed:
Network/HTTP/Lucu/Config.hs
Network/HTTP/Lucu/Headers.hs
Network/HTTP/Lucu/MIMEParams.hs
Network/HTTP/Lucu/MIMEType.hs
Network/HTTP/Lucu/MIMEType/Guess.hs
Network/HTTP/Lucu/MultipartForm.hs
Network/HTTP/Lucu/Preprocess.hs
Network/HTTP/Lucu/RequestReader.hs
Network/HTTP/Lucu/Resource.hs
Network/HTTP/Lucu/Resource/Internal.hs
Network/HTTP/Lucu/StaticFile.hs
Network/HTTP/Lucu/Utils.hs

index 366a63cb1aab9bad37f96cd9eb4f5d701fff01e6..d1afdc07058464f903a79e8fe5fcc7039099ed02 100644 (file)
@@ -14,9 +14,10 @@ module Network.HTTP.Lucu.Config
 import Data.Ascii (Ascii)
 import Data.CaseInsensitive (CI)
 import qualified Data.CaseInsensitive as CI
+import Data.Convertible.Base
+import Data.Convertible.Instances.Text ()
 import Data.Default
 import Data.Text (Text)
-import qualified Data.Text as T
 import Network
 import Network.BSD
 import Network.HTTP.Lucu.MIMEType.Guess
@@ -108,7 +109,7 @@ data SSLConfig
 instance Default Config where
     def = Config {
             cnfServerSoftware              = "Lucu/1.0"
-          , cnfServerHost                  = CI.mk ∘ T.pack $ unsafePerformIO getHostName
+          , cnfServerHost                  = CI.mk ∘ cs $ unsafePerformIO getHostName
           , cnfServerPort                  = "http"
           , cnfServerV4Addr                = Just "0.0.0.0"
           , cnfServerV6Addr                = Just "::"
index e56567e7d665b191a96d08b75dfab9bc781f614c..f0e6ad8958bf056c30f41767263469c51a65922f 100644 (file)
@@ -57,7 +57,7 @@ class HasHeaders a where
 
     getCIHeader ∷ CIAscii → a → Maybe CIAscii
     {-# INLINE getCIHeader #-}
-    getCIHeader = ((A.toCIAscii <$>) ∘) ∘ getHeader
+    getCIHeader = ((cs <$>) ∘) ∘ getHeader
 
     deleteHeader ∷ CIAscii → a → a
     {-# INLINE deleteHeader #-}
@@ -145,7 +145,7 @@ headers = do xs ← many header
              return $ fromFoldable xs
     where
       header ∷ Parser (CIAscii, Ascii)
-      header = do name ← A.toCIAscii <$> token
+      header = do name ← cs <$> token
                   void $ char ':'
                   skipMany lws
                   values ← content `sepBy` try lws
@@ -161,7 +161,7 @@ headers = do xs ← many header
 
       joinValues ∷ [Ascii] → Ascii
       {-# INLINE joinValues #-}
-      joinValues = A.fromAsciiBuilder
+      joinValues = cs
                    ∘ mconcat
-                   ∘ intersperse (A.toAsciiBuilder "\x20")
-                   ∘ (A.toAsciiBuilder <$>)
+                   ∘ intersperse (cs ("\x20" ∷ Ascii) ∷ AsciiBuilder)
+                   ∘ (cs <$>)
index 88dbb6fdd71a47bdc832cca03dc4b36797f3230b..6f9eb7e1b8a9f4055b0bc878578d6b2679952991 100644 (file)
@@ -168,7 +168,7 @@ paramP = do skipMany lws
                        return $ AsciiParam name sect payload
 
 nameP ∷ Parser (CIAscii, Integer, Bool)
-nameP = do name      ← (A.toCIAscii ∘ A.unsafeFromByteString) <$>
+nameP = do name      ← (cs ∘ A.unsafeFromByteString) <$>
                        takeWhile1 (\c → isToken c ∧ c ≢ '*')
            sect      ← option 0     $ try (char '*' *> decimal  )
            isEncoded ← option False $ try (char '*' *> pure True)
@@ -190,7 +190,7 @@ initialEncodedValue
              return (charset, payload)
     where
       metadata ∷ Parser CIAscii
-      metadata = (A.toCIAscii ∘ A.unsafeFromByteString) <$>
+      metadata = (cs ∘ A.unsafeFromByteString) <$>
                  takeWhile (\c → c ≢ '\'' ∧ isToken c)
 
 encodedPayload ∷ Parser BS.ByteString
@@ -257,7 +257,7 @@ sortBySection = flip go (∅)
                            → fail (concat [ "Duplicate section "
                                           , show $ section x
                                           , " for parameter '"
-                                          , A.toString $ A.fromCIAscii $ epName x
+                                          , cs $ epName x
                                           , "'"
                                           ])
 
@@ -280,7 +280,7 @@ decodeSections = (decodeSeq =≪) ∘ flip (flip toSeq 0) (∅)
                         → fail (concat [ "Missing section "
                                        , show $ section p
                                        , " for parameter '"
-                                       , A.toString $ A.fromCIAscii $ epName p
+                                       , cs $ epName p
                                        , "'"
                                        ])
 
@@ -296,9 +296,7 @@ decodeSections = (decodeSeq =≪) ∘ flip (flip toSeq 0) (∅)
               Just (ContinuedEncodedParam {..}, _)
                   → fail "decodeSeq: internal error: CEP at section 0"
               Just (AsciiParam {..}, xs)
-                  → let t = A.toText apPayload
-                    in
-                      decodeSeq' Nothing xs $ singleton t
+                  → decodeSeq' Nothing xs $ singleton $ cs apPayload
 
       decodeSeq' ∷ Monad m
                  ⇒ Maybe Decoder
@@ -320,13 +318,11 @@ decodeSections = (decodeSeq =≪) ∘ flip (flip toSeq 0) (∅)
                            → fail (concat [ "Section "
                                           , show epSection
                                           , " for parameter '"
-                                          , A.toString $ A.fromCIAscii epName
+                                          , cs epName
                                           , "' is encoded but its first section is not"
                                           ])
               Just (AsciiParam {..}, xs)
-                  → let t = A.toText apPayload
-                    in
-                      decodeSeq' decoder xs $ chunks ⊳ t
+                  → decodeSeq' decoder xs $ chunks ⊳ cs apPayload
 
 type Decoder = BS.ByteString → Either UnicodeException Text
 
@@ -340,5 +336,4 @@ getDecoder ∷ Monad m ⇒ CIAscii → m Decoder
 getDecoder charset
     | charset ≡ "UTF-8"    = return decodeUtf8'
     | charset ≡ "US-ASCII" = return decodeUtf8'
-    | otherwise            = fail $ "No decoders found for charset: "
-                                  ⧺ A.toString (A.fromCIAscii charset)
+    | otherwise            = fail $ "No decoders found for charset: " ⊕ cs charset
index 1c448eedecde5435e0889cffdd49d126df7bc25e..250fdbfc4033a3268412e1b933d2bca37f308918 100644 (file)
@@ -17,8 +17,7 @@ module Network.HTTP.Lucu.MIMEType
     where
 import Control.Applicative
 import Data.Ascii (Ascii, AsciiBuilder, CIAscii)
-import qualified Data.Ascii as A
-import Data.Attoparsec.Char8 as P
+import Data.Attoparsec.Char8
 import Data.Convertible.Base
 import Data.Convertible.Instances.Ascii ()
 import Data.Convertible.Utils
@@ -77,9 +76,9 @@ instance ConvertAttempt Ascii MIMEType where
 -- |'Parser' for an 'MIMEType'.
 mimeType ∷ Parser MIMEType
 {-# INLINEABLE mimeType #-}
-mimeType = do media  ← A.toCIAscii <$> token
+mimeType = do media  ← cs <$> token
               _      ← char '/'
-              sub    ← A.toCIAscii <$> token
+              sub    ← cs <$> token
               params ← mimeParams
               return $ MIMEType media sub params
 
index 6a791e4d15792a5aaff5a4504ceb6e10930e7a22..cd178dec2afb18402169b2f316dd8c067f65b88e 100644 (file)
@@ -20,6 +20,8 @@ import Control.Applicative
 import Data.Attoparsec.Char8
 import qualified Data.Attoparsec.Lazy as LP
 import qualified Data.ByteString.Lazy.Char8 as Lazy
+import Data.Convertible.Base
+import Data.Convertible.Instances.Text ()
 import qualified Data.Map as M
 import Data.Map (Map)
 import Data.Typeable
@@ -27,7 +29,6 @@ import Data.List
 import Data.Monoid
 import Data.Monoid.Unicode
 import Data.Text (Text)
-import qualified Data.Text as T
 import Data.Text.Encoding
 import Language.Haskell.TH.Syntax
 import Language.Haskell.TH.Quote
@@ -137,4 +138,4 @@ guessTypeByFileName ∷ ExtMap → FilePath → Maybe MIMEType
 guessTypeByFileName (ExtMap m) fpath
     = case takeExtension fpath of
         []      → Nothing
-        (_:ext) → M.lookup (T.pack ext) m
+        (_:ext) → M.lookup (cs ext) m
index 882ff76668dc60bcb721eaefd83f1d4555d5303a..2d1b3470f1cf62a797a1336c183e8d54999589b9 100644 (file)
@@ -23,7 +23,7 @@ import Control.Applicative.Unicode hiding ((∅))
 import Control.Monad.Error (MonadError, throwError)
 import Control.Monad.Unicode
 import Data.Ascii (Ascii, CIAscii, AsciiBuilder)
-import qualified Data.Ascii as A
+import Data.Attempt
 import Data.Attoparsec
 import qualified Data.Attoparsec.Lazy as LP
 import qualified Data.ByteString as BS
@@ -38,7 +38,6 @@ import Data.Maybe
 import Data.Monoid.Unicode
 import Data.Sequence (Seq)
 import Data.Text (Text)
-import qualified Data.Text as T
 import Network.HTTP.Lucu.Headers
 import Network.HTTP.Lucu.MIMEParams
 import Network.HTTP.Lucu.MIMEType (MIMEType)
@@ -136,7 +135,7 @@ prologue ∷ Ascii → Parser ()
 prologue boundary
     = ( (string "--" <?> "prefix")
         *>
-        (string (A.toByteString boundary) <?> "boundary")
+        (string (cs boundary) <?> "boundary")
         *>
         pure ()
       )
@@ -180,16 +179,16 @@ getContDispo hdrs
         Nothing
             → throwError "Content-Disposition is missing"
         Just str
-            → case parseOnly (finishOff contentDisposition) $ A.toByteString str of
+            → case parseOnly (finishOff contentDisposition) $ cs str of
                  Right  d → return d
                  Left err → throwError $ "malformed Content-Disposition: "
-                                       â§º A.toString str
-                                       â§º ": "
-                                       â§º err
+                                       â\8a\95 cs str
+                                       â\8a\95 ": "
+                                       â\8a\95 err
 
 contentDisposition ∷ Parser ContDispo
 contentDisposition
-    = (ContDispo <$> (A.toCIAscii <$> token) ⊛ mimeParams)
+    = (ContDispo <$> (cs <$> token) ⊛ mimeParams)
       <?>
       "contentDisposition"
 
@@ -200,19 +199,19 @@ getContType hdrs
         Nothing
             → return Nothing
         Just str
-            → case parseOnly (finishOff MT.mimeType) $ A.toByteString str of
+            → case parseOnly (finishOff MT.mimeType) $ cs str of
                  Right  d → return $ Just d
                  Left err → throwError $ "malformed Content-Type: "
-                                       â§º A.toString str
-                                       â§º ": "
-                                       â§º err
+                                       â\8a\95 cs str
+                                       â\8a\95 ": "
+                                       â\8a\95 err
 
 getBody ∷ MonadError String m
         ⇒ Ascii
         → LS.ByteString
         → m (LS.ByteString, LS.ByteString)
 {-# INLINEABLE getBody #-}
-getBody (("\r\n--" ⊕) ∘ A.toByteString → boundary) src
+getBody (("\r\n--" ⊕) ∘ cs → boundary) src
     = case breakOn boundary src of
         (before, after)
             | LS.null after
@@ -236,17 +235,16 @@ partToFormPair pt@(Part {..})
              return (name, fd)
     | otherwise
         = throwError $ "disposition type is not \"form-data\": "
-                     â§º A.toString (A.fromCIAscii $ dType ptContDispo)
+                     â\8a\95 cs (dType ptContDispo)
 
 partName ∷ MonadError String m ⇒ Part → m Ascii
 {-# INLINEABLE partName #-}
 partName (Part {..})
     = case lookup "name" $ dParams ptContDispo of
         Just name
-            → case A.fromText name of
-                 Just a  → return a
-                 Nothing → throwError $ "Non-ascii part name: "
-                                      ⧺ T.unpack name
+            → case ca name of
+                 Success a → return a
+                 Failure e → throwError $ show e
         Nothing
             → throwError $ "form-data without name: "
                          ⊕ convertSuccessVia ((⊥) ∷ Ascii) ptContDispo
index 77047273c43564feddc2ef688be16eb652f57d73..de519da58ea013412f8862889c8e2556d7eacd6b 100644 (file)
@@ -19,9 +19,9 @@ import qualified Data.ByteString.Char8 as C8
 import Data.CaseInsensitive (CI)
 import qualified Data.CaseInsensitive as CI
 import Data.Convertible.Base
+import Data.Convertible.Instances.Text ()
 import Data.Maybe
 import Data.Text (Text)
-import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
 import Network.HTTP.Lucu.Headers
 import Network.HTTP.Lucu.HttpVersion
@@ -151,7 +151,7 @@ updateAuthority host port req
           uri' = uri {
                    uriAuthority = Just URIAuth {
                                     uriUserInfo = ""
-                                  , uriRegName  = T.unpack $ CI.original host
+                                  , uriRegName  = cs $ CI.original host
                                   , uriPort     = cs port
                                   }
                  }
index 2cdc45dc472a42e284472badd85df1f31582c9f5..6c5070b5738c0e54d4bce48f809219f6db97eb93 100644 (file)
@@ -18,11 +18,12 @@ import Control.Monad.Trans.Maybe
 import qualified Data.Attoparsec.Lazy as LP
 import qualified Data.ByteString as Strict
 import qualified Data.ByteString.Lazy as Lazy
+import Data.Convertible.Base
+import Data.Convertible.Instances.Text ()
 import Data.List
 import Data.Maybe
 import Data.Monoid.Unicode
 import qualified Data.Sequence as S
-import qualified Data.Text as T
 import Network.HTTP.Lucu.Abortion
 import Network.HTTP.Lucu.Config
 import Network.HTTP.Lucu.Chunk
@@ -298,11 +299,11 @@ chunkWasMalformed tid eCtx e msg
     = let abo = mkAbortion BadRequest [("Connection", "close")]
                 $ Just
                 $ "chunkWasMalformed: "
-                ⊕ T.pack msg
+                ⊕ cs msg
                 ⊕ ": "
-                ⊕ T.pack (intercalate ", " eCtx)
+                ⊕ cs (intercalate ", " eCtx)
                 ⊕ ": "
-                ⊕ T.pack e
+                ⊕ cs e
       in
         throwTo tid abo
 
index 852860b278489df97143eaa64ccf41a09c98a02a..8585ceaf29ce993f6a1a002ed41c61d3f5c18f1e 100644 (file)
@@ -165,7 +165,6 @@ import Data.Monoid.Unicode
 import Data.Proxy
 import Data.Tagged
 import Data.Text (Text)
-import qualified Data.Text as T
 import Data.Time
 import Data.Time.Format.HTTP
 import Network.HTTP.Lucu.Abortion
@@ -555,7 +554,7 @@ getChunks' limit = go limit (∅)
                     else
                         abort $ mkAbortion' RequestEntityTooLarge
                               $ "Request body must be smaller than "
-                              ⊕ T.pack (show limit)
+                              ⊕ cs (show limit)
                               ⊕ " bytes."
       go !n !b = do c ← getChunk $ min n BB.defaultBufferSize
                     if Strict.null c then
@@ -613,7 +612,7 @@ getForm limit
                                                   $ "Malformed boundary: " ⊕ boundary
                        case parseMultipartFormData b src of
                          Right xs → return $ map (first cs) xs
-                         Left err → abort $ mkAbortion' BadRequest $ T.pack err
+                         Left err → abort $ mkAbortion' BadRequest $ cs err
 
 -- |@'redirect' code uri@ declares the response status as @code@ and
 -- \"Location\" header field as @uri@. The @code@ must satisfy
index 9feca7edf6e3b6401fc7e4306705a420553fe016..1993eb251deafdb09dbb98f0916601b581dc5a15 100644 (file)
@@ -47,11 +47,11 @@ import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS
 import Data.Collections
 import Data.Convertible.Base
+import Data.Convertible.Instances.Text ()
 import Data.List (intersperse, nub)
 import Data.Maybe
 import Data.Monoid
 import Data.Monoid.Unicode
-import qualified Data.Text as T
 import Network.HTTP.Lucu.Abortion
 import Network.HTTP.Lucu.Abortion.Internal
 import Network.HTTP.Lucu.Config
@@ -202,7 +202,7 @@ spawnRsrc (Resource {..}) ni@(NI {..})
       toAbortion e
           = case fromException e of
               Just abortion → abortion
-              Nothing       → mkAbortion' InternalServerError $ T.pack $ show e
+              Nothing       → mkAbortion' InternalServerError $ cs $ show e
 
       processException ∷ SomeException → IO ()
       processException exc
index a1b611506f557f8893a27155b992158c78ad5b9e..6dd47af6ff465c278842b8947a9180320ea7efca 100644 (file)
@@ -15,6 +15,8 @@ import Control.Monad.Unicode
 import Control.Monad.Trans
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Lazy.Char8 as LBS
+import Data.Convertible.Base
+import Data.Convertible.Instances.Text ()
 import Data.Monoid.Unicode
 import Data.String
 import qualified Data.Text as T
@@ -95,7 +97,7 @@ handleStaticDir sendContent basePath
          handleStaticFile sendContent path
     where
       dec8 ∷ ByteString → String
-      dec8 = T.unpack ∘ T.decodeUtf8
+      dec8 = cs ∘ T.decodeUtf8
 
 securityCheck ∷ (Eq s, Show s, IsString s, Monad m) ⇒ [s] → m ()
 securityCheck pathElems
index 297ea3a762ef64992466469a3845053ffb86d7af..7537eafcffacf7d8edf755e2bb8fea30cd636547 100644 (file)
@@ -36,11 +36,12 @@ import Data.Char
 import Data.Collections
 import Data.Collections.BaseInstances ()
 import Data.Convertible.Base
+import Data.Convertible.Instances.Ascii ()
+import Data.Convertible.Instances.Text ()
 import Data.Convertible.Instances.Time ()
 import Data.Maybe
 import Data.Monoid.Unicode
 import Data.Text (Text)
-import qualified Data.Text as T
 import Data.Time
 import Network.URI
 import Prelude hiding (last, mapM, null, reverse)
@@ -73,9 +74,9 @@ splitBy isSep src
 -- >>> quoteStr "ab\"c"
 -- "\"ab\\\"c\""
 quoteStr ∷ Ascii → AsciiBuilder
-quoteStr str = A.toAsciiBuilder "\"" ⊕
-               go (A.toByteString str) (∅) ⊕
-               A.toAsciiBuilder "\""
+quoteStr str = cs ("\"" ∷ Ascii) ⊕
+               go (cs str) (∅)   ⊕
+               cs ("\"" ∷ Ascii)
     where
       go ∷ ByteString → AsciiBuilder → AsciiBuilder
       go bs ab
@@ -85,10 +86,10 @@ quoteStr str = A.toAsciiBuilder "\"" ⊕
                       → ab ⊕ b2ab x
                   | otherwise
                       → go (BS.tail y)
-                           (ab ⊕ b2ab x ⊕ A.toAsciiBuilder "\\\"")
+                           (ab ⊕ b2ab x ⊕ cs ("\\\"" ∷ Ascii))
 
       b2ab ∷ ByteString → AsciiBuilder
-      b2ab = A.toAsciiBuilder ∘ A.unsafeFromByteString
+      b2ab = cs ∘ A.unsafeFromByteString
 
 -- |>>> parseWWWFormURLEncoded "aaa=bbb&ccc=ddd"
 -- [("aaa", "bbb"), ("ccc", "ddd")]
@@ -97,7 +98,7 @@ parseWWWFormURLEncoded src
     -- THINKME: We could gain some performance by using attoparsec
     -- here.
     | src ≡ ""  = []
-    | otherwise = do pairStr ← splitBy (\ c → c ≡ ';' ∨ c ≡ '&') (A.toString src)
+    | otherwise = do pairStr ← splitBy (\ c → c ≡ ';' ∨ c ≡ '&') (cs src)
                      let (key, value) = break (≡ '=') pairStr
                      return ( unescape key
                             , unescape $ case value of
@@ -116,7 +117,7 @@ parseWWWFormURLEncoded src
 -- "example.com"
 uriHost ∷ URI → Host
 {-# INLINE uriHost #-}
-uriHost = CI.mk ∘ T.pack ∘ uriRegName ∘ fromJust ∘ uriAuthority
+uriHost = CI.mk ∘ cs ∘ uriRegName ∘ fromJust ∘ uriAuthority
 
 -- |>>> uriPathSegments "http://example.com/foo/bar"
 -- ["foo", "bar"]