]> gitweb @ CieloNegro.org - Lucu.git/commitdiff
The parser now returns unboxed tuple.
authorpho <pho@cielonegro.org>
Wed, 3 Oct 2007 14:57:40 +0000 (23:57 +0900)
committerpho <pho@cielonegro.org>
Wed, 3 Oct 2007 14:57:40 +0000 (23:57 +0900)
darcs-hash:20071003145740-62b54-b0dc200b632ee22a6090b7948ac39fa8b319c939.gz

Network/HTTP/Lucu/MIMEType.hs
Network/HTTP/Lucu/MIMEType/Guess.hs
Network/HTTP/Lucu/Parser.hs
Network/HTTP/Lucu/RFC1123DateTime.hs
Network/HTTP/Lucu/RequestReader.hs
Network/HTTP/Lucu/Resource.hs

index 947cb004cc8fe62c57492decb78de60636d14567..da4f503b33e838207e4cc27d380b302e21e79e87 100644 (file)
@@ -46,11 +46,10 @@ instance Read MIMEType where
 -- exception for parse error.
 parseMIMEType :: String -> MIMEType
 parseMIMEType str = case parseStr mimeTypeP str of
-                      (Success t, r) -> if B.null r then
-                                            t
-                                        else
-                                            error ("unparsable MIME Type: " ++ str)
-                      _              -> error ("unparsable MIME Type: " ++ str)
+                      (# Success t, r #) -> if B.null r
+                                            then t
+                                            else error ("unparsable MIME Type: " ++ str)
+                      (# _        , _ #) -> error ("unparsable MIME Type: " ++ str)
 
 
 mimeTypeP :: Parser MIMEType
index dfcceb952cbeea9b8f41f3258d4994c172161581..d6c4958db21f563bbdc6bd07af3cb02d809f8ffc 100644 (file)
@@ -40,10 +40,13 @@ parseExtMapFile fpath
     = fpath `seq`
       do file <- B.readFile fpath
          case parse (allowEOF extMapP) file of
-           (Success xs, _) -> return $ compile xs
-           (_, input')     -> let near = B.unpack $ B.take 100 input'
-                              in 
-                                fail ("Failed to parse: " ++ fpath ++ " (near: " ++ near ++ ")")
+           (# Success xs, _ #)
+               -> return $ compile xs
+
+           (# _, input' #)
+               -> let near = B.unpack $ B.take 100 input'
+                  in 
+                    fail ("Failed to parse: " ++ fpath ++ " (near: " ++ near ++ ")")
 
 
 extMapP :: Parser [ (MIMEType, [String]) ]
index f2e4be337abdc375503ec4761385a2222a6fbedb..5671ec0ccdf8c1c505a9bdf20cd227d8b1e07ec0 100644 (file)
@@ -95,18 +95,18 @@ failP = fail undefined
 
 -- |@'parse' p bstr@ parses @bstr@ with @p@ and returns @(result,
 -- remaining)@.
-parse :: Parser a -> LazyByteString -> (ParserResult a, LazyByteString)
+parse :: Parser a -> LazyByteString -> (# ParserResult a, LazyByteString #)
 parse p input -- input は lazy である必要有り。
     = p `seq`
       let (result, state') = runState (runParser p) (PST input True)
       in
-        result `seq` (result, pstInput state') -- pstInput state' も lazy である必要有り。
+        result `seq` (# result, pstInput state' #) -- pstInput state' も lazy である必要有り。
 
 -- |@'parseStr' p str@ packs @str@ and parses it.
-parseStr :: Parser a -> String -> (ParserResult a, LazyByteString)
+parseStr :: Parser a -> String -> (# ParserResult a, LazyByteString #)
 parseStr p input
     = p `seq` -- input は lazy である必要有り。
-      parse p $! B.pack input
+      parse p (B.pack input)
 
 
 anyChar :: Parser Char
index 4d7aa1576a1acf308b99c9e6ae4e36b3520f2a8e..2cd06cc9cac7f79f2870e3da1847c57f8e089350 100644 (file)
@@ -65,8 +65,8 @@ formatHTTPDateTime time
 parseHTTPDateTime :: String -> Maybe ClockTime
 parseHTTPDateTime src
     = case parseStr httpDateTime src of
-        (Success ct, _) -> Just ct
-        _               -> Nothing
+        (# Success ct, _ #) -> Just ct
+        (# _         , _ #) -> Nothing
 
 
 httpDateTime :: Parser ClockTime
index 091a3a2f92e31735641e4bf46fc6dba7431deb39..8760cb80f45212bd041a9d0b454745fd1030ccd8 100644 (file)
@@ -50,9 +50,9 @@ requestReader cnf tree h addr tQueue
                -- Request 應答を設定し、それを出力してから切斷するやう
                -- に ResponseWriter に通知する。
                case parse requestP input of
-                 (Success req , input') -> acceptParsableRequest req input'
-                 (IllegalInput, _     ) -> acceptNonparsableRequest BadRequest
-                 (ReachedEOF  , _     ) -> acceptNonparsableRequest BadRequest
+                 (# Success req , input' #) -> acceptParsableRequest req input'
+                 (# IllegalInput, _      #) -> acceptNonparsableRequest BadRequest
+                 (# ReachedEOF  , _      #) -> acceptNonparsableRequest BadRequest
 
       acceptNonparsableRequest :: StatusCode -> IO ()
       acceptNonparsableRequest status
@@ -150,7 +150,7 @@ requestReader cnf tree h addr tQueue
                                                   -- 讀み終へてゐない
                                                   do let (_, input') = B.splitAt (fromIntegral
                                                                                   $ fromJust remainingM) input
-                                                         (footerR, input'') = parse chunkFooterP input'
+                                                         (# footerR, input'' #) = parse chunkFooterP input'
 
                                                      if footerR == Success () then
                                                          -- チャンクフッタを正常に讀めた
@@ -188,10 +188,11 @@ requestReader cnf tree h addr tQueue
                                               if newRemaining == Just 0 then
                                                   -- チャンクフッタを讀む
                                                   case parse chunkFooterP input' of
-                                                    (Success _, input'')
+                                                    (# Success _, input'' #)
                                                         -> do updateStates
                                                               return $ observeChunkedRequest itr input''
-                                                    _   -> return $ chunkWasMalformed itr
+                                                    (# _, _ #)
+                                                        -> return $ chunkWasMalformed itr
                                                 else
                                                   -- まだチャンクの終はりに達してゐない
                                                   do updateStates
@@ -206,23 +207,25 @@ requestReader cnf tree h addr tQueue
           = {-# SCC "seekNextChunk" #-}
             case parse chunkHeaderP input of
               -- 最終チャンク (中身が空)
-              (Success 0, input')
+              (# Success 0, input' #)
                   -> case parse chunkTrailerP input' of
-                       (Success _, input'')
+                       (# Success _, input'' #)
                            -> do writeItr itr itrReqChunkLength $ Nothing
                                  writeItr itr itrReqChunkRemaining $ Nothing
                                  writeItr itr itrReqChunkIsOver True
                                  
                                  return $ acceptRequest input''
-                       _   -> return $ chunkWasMalformed itr
+                       (# _, _ #)
+                           -> return $ chunkWasMalformed itr
               -- 最終でないチャンク
-              (Success len, input')
+              (# Success len, input' #)
                   -> do writeItr itr itrReqChunkLength $ Just len
                         writeItr itr itrReqChunkRemaining $ Just len
                         
                         return $ observeChunkedRequest itr input'
               -- チャンクヘッダがをかしい
-              _   -> return $ chunkWasMalformed itr
+              (# _, _ #)
+                  -> return $ chunkWasMalformed itr
 
       chunkWasMalformed :: Interaction -> IO ()
       chunkWasMalformed itr
index 7b64629bf832245669effa0acd8d55c5cc045a9c..8942c762da36fa8104efe762288d1de33f0a6721 100644 (file)
@@ -280,9 +280,9 @@ getAccept = do acceptM <- getHeader "Accept"
                      -> return []
                  Just accept
                      -> case parseStr mimeTypeListP accept of
-                          (Success xs, _) -> return xs
-                          _               -> abort BadRequest []
-                                             (Just $ "Unparsable Accept: " ++ accept)
+                          (# Success xs, _ #) -> return xs
+                          (# _         , _ #) -> abort BadRequest []
+                                                 (Just $ "Unparsable Accept: " ++ accept)
 
 -- |Get a list of @(contentCoding, qvalue)@ enumerated on header
 -- \"Accept-Encoding\". The list is sorted in descending order by
@@ -305,9 +305,9 @@ getAcceptEncoding
                -> return [("identity", Nothing)]
            Just accEnc
                -> case parseStr acceptEncodingListP accEnc of
-                    (Success x, _) -> return $ reverse $ sortBy orderAcceptEncodings x
-                    _              -> abort BadRequest []
-                                      (Just $ "Unparsable Accept-Encoding: " ++ accEnc)
+                    (# Success x, _ #) -> return $ reverse $ sortBy orderAcceptEncodings x
+                    (# _        , _ #) -> abort BadRequest []
+                                          (Just $ "Unparsable Accept-Encoding: " ++ accEnc)
 
 -- |Check whether a given content-coding is acceptable.
 isEncodingAcceptable :: String -> Resource Bool
@@ -327,9 +327,9 @@ getContentType
                -> return Nothing
            Just cType
                -> case parseStr mimeTypeP cType of
-                    (Success t, _) -> return $ Just t
-                    _              -> abort BadRequest []
-                                      (Just $ "Unparsable Content-Type: " ++ cType)
+                    (# Success t, _ #) -> return $ Just t
+                    (# _        , _ #) -> abort BadRequest []
+                                          (Just $ "Unparsable Content-Type: " ++ cType)
 
 
 {- ExaminingRequest 時に使用するアクション群 -}
@@ -388,13 +388,14 @@ foundETag tag
            Nothing   -> return ()
            Just "*"  -> return ()
            Just list -> case parseStr eTagListP list of
-                          (Success tags, _)
+                          (# Success tags, _ #)
                               -- tags の中に一致するものが無ければ
                               -- PreconditionFailed で終了。
                               -> when (not $ any (== tag) tags)
                                  $ abort PreconditionFailed []
                                        $! Just ("The entity tag doesn't match: " ++ list)
-                          _   -> abort BadRequest [] $! Just ("Unparsable If-Match: " ++ fromJust ifMatch)
+                          (# _, _ #)
+                              -> abort BadRequest [] $! Just ("Unparsable If-Match: " ++ fromJust ifMatch)
 
          let statusForNoneMatch = if method == GET || method == HEAD then
                                       NotModified
@@ -407,10 +408,11 @@ foundETag tag
            Nothing   -> return ()
            Just "*"  -> abort statusForNoneMatch [] $! Just ("The entity tag matches: *")
            Just list -> case parseStr eTagListP list of
-                          (Success tags, _)
+                          (# Success tags, _ #)
                               -> when (any (== tag) tags)
                                  $ abort statusForNoneMatch [] $! Just ("The entity tag matches: " ++ list)
-                          _   -> abort BadRequest [] $! Just ("Unparsable If-None-Match: " ++ list)
+                          (# _, _ #)
+                              -> abort BadRequest [] $! Just ("Unparsable If-None-Match: " ++ list)
 
          driftTo GettingBody