]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Preprocess.hs
Code clean-up using convertible-text.
[Lucu.git] / Network / HTTP / Lucu / Preprocess.hs
index 8e3087ebae70654ae0b4a8f74b5e1f0a4102c466..77047273c43564feddc2ef688be16eb652f57d73 100644 (file)
@@ -16,8 +16,10 @@ import Control.Monad.State.Strict
 import Data.Ascii (Ascii)
 import qualified Data.Ascii as A
 import qualified Data.ByteString.Char8 as C8
+import Data.CaseInsensitive (CI)
+import qualified Data.CaseInsensitive as CI
+import Data.Convertible.Base
 import Data.Maybe
-import qualified Data.Strict.Maybe as S
 import Data.Text (Text)
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
@@ -32,12 +34,12 @@ import Prelude.Unicode
 data AugmentedRequest
     = AugmentedRequest {
         arRequest          ∷ !Request
-      , arInitialStatus    ∷ !StatusCode
+      , arInitialStatus    ∷ !SomeStatusCode
       , arWillChunkBody    ∷ !Bool
       , arWillDiscardBody  ∷ !Bool
       , arWillClose        ∷ !Bool
       , arExpectedContinue ∷ !Bool
-      , arReqBodyLength    ∷ !(S.Maybe RequestBodyLength)
+      , arReqBodyLength    ∷ !(Maybe RequestBodyLength)
       }
 
 data RequestBodyLength
@@ -45,19 +47,19 @@ data RequestBodyLength
     | Chunked
     deriving (Eq, Show)
 
-preprocess ∷ Text → PortNumber → Request → AugmentedRequest
+preprocess ∷ CI Text → PortNumber → Request → AugmentedRequest
 preprocess localHost localPort req@(Request {..})
     = execState go initialAR
     where
       initialAR ∷ AugmentedRequest
       initialAR = AugmentedRequest {
                     arRequest          = req
-                  , arInitialStatus    = Ok
+                  , arInitialStatus    = fromStatusCode OK
                   , arWillChunkBody    = False
                   , arWillDiscardBody  = False
                   , arWillClose        = False
                   , arExpectedContinue = False
-                  , arReqBodyLength    = S.Nothing
+                  , arReqBodyLength    = Nothing
                   }
       go ∷ State AugmentedRequest ()
       go = do examineHttpVersion
@@ -70,15 +72,15 @@ setRequest ∷ Request → State AugmentedRequest ()
 setRequest req
     = modify $ \ar → ar { arRequest = req }
 
-setStatus ∷ StatusCode → State AugmentedRequest ()
+setStatus ∷ StatusCode sc ⇒ sc → State AugmentedRequest ()
 setStatus sc
-    = modify $ \ar → ar { arInitialStatus = sc }
+    = modify $ \ar → ar { arInitialStatus = fromStatusCode sc }
 
 setWillClose ∷ Bool → State AugmentedRequest ()
 setWillClose b
     = modify $ \ar → ar { arWillClose = b }
 
-setBodyLength ∷ S.Maybe RequestBodyLength → State AugmentedRequest ()
+setBodyLength ∷ Maybe RequestBodyLength → State AugmentedRequest ()
 setBodyLength len
     = modify $ \ar → ar { arReqBodyLength = len }
 
@@ -91,7 +93,7 @@ examineHttpVersion
                → setWillClose True
            HttpVersion 1 1
                → modify $ \ar → ar { arWillChunkBody = True }
-           _   → do setStatus    HttpVersionNotSupported
+           _   → do setStatus    HTTPVersionNotSupported
                     setWillClose True
 
 examineMethod ∷ State AugmentedRequest ()
@@ -105,7 +107,7 @@ examineMethod
            DELETE → return ()
            _      → setStatus NotImplemented
 
-examineAuthority ∷ Text → PortNumber → State AugmentedRequest ()
+examineAuthority ∷ CI Text → PortNumber → State AugmentedRequest ()
 examineAuthority localHost localPort
     = do req ← gets arRequest
          when (isNothing $ uriAuthority $ reqURI req) $
@@ -134,23 +136,23 @@ examineAuthority localHost localPort
                -- Should never reach here...
                ver → fail ("internal error: unknown version: " ⧺ show ver)
 
-parseHost ∷ Ascii → (Text, Ascii)
+parseHost ∷ Ascii → (CI Text, Ascii)
 parseHost hp
-    = let (h, p) = C8.break (≡ ':') $ A.toByteString hp
+    = let (h, p) = C8.break (≡ ':') $ cs hp
           -- FIXME: should decode punycode here.
-          hText  = T.decodeUtf8 h
+          hText  = CI.mk $ T.decodeUtf8 h
           pAscii = A.unsafeFromByteString p
       in
         (hText, pAscii)
 
-updateAuthority ∷ Text → Ascii → Request → Request
+updateAuthority ∷ CI Text → Ascii → Request → Request
 updateAuthority host port req
     = let uri  = reqURI req
           uri' = uri {
                    uriAuthority = Just URIAuth {
                                     uriUserInfo = ""
-                                  , uriRegName  = T.unpack host
-                                  , uriPort     = A.toString port
+                                  , uriRegName  = T.unpack $ CI.original host
+                                  , uriPort     = cs port
                                   }
                  }
       in
@@ -174,16 +176,16 @@ examineHeaders
                | v ≡ "identity"
                    → return ()
                | v ≡ "chunked"
-                   → setBodyLength $ S.Just Chunked
+                   → setBodyLength $ Just Chunked
                | otherwise
                    → setStatus NotImplemented
 
-         case A.toByteString <$> getHeader "Content-Length" req of
+         case cs <$> getHeader "Content-Length" req of
            Nothing    → return ()
            Just value → case C8.readInt value of
                            Just (len, garbage)
                                | C8.null garbage ∧ len ≥ 0
-                                   → setBodyLength $ S.Just $ Fixed len
+                                   → setBodyLength $ Just $ Fixed len
                            _       → setStatus BadRequest
 
          case getCIHeader "Connection" req of
@@ -198,9 +200,9 @@ examineBodyLength
          len ← gets arReqBodyLength
          if reqMustHaveBody req then
              -- POST and PUT requests must have an entity body.
-             when (S.isNothing len)
+             when (isNothing len)
                  $ setStatus LengthRequired
          else
              -- Other requests must NOT have an entity body.
-             when (S.isJust len)
+             when (isJust len)
                  $ setStatus BadRequest