]> gitweb @ CieloNegro.org - Lucu.git/commitdiff
Added inputForm
authorpho <pho@cielonegro.org>
Thu, 19 Apr 2007 14:36:50 +0000 (23:36 +0900)
committerpho <pho@cielonegro.org>
Thu, 19 Apr 2007 14:36:50 +0000 (23:36 +0900)
darcs-hash:20070419143650-62b54-7660db0cba66f4ec3c32956538fa013bd97b0d7a.gz

Network/HTTP/Lucu/Resource.hs

index 7b1b26a0dd08ea9423f3f895395d0e6a45c2c145..d01fd1c8d3ee27d7f7591b89ceaad28c0cb6430f 100644 (file)
@@ -21,6 +21,7 @@ module Network.HTTP.Lucu.Resource
     , inputChunk   -- Int -> Resource String
     , inputBS      -- Int -> Resource ByteString
     , inputChunkBS -- Int -> Resource ByteString
+    , inputForm    -- Int -> Resource [(String, String)]
     , defaultLimit -- Int
 
     , setStatus -- StatusCode -> Resource ()
@@ -358,6 +359,35 @@ inputChunkBS limit
                return chunk
 
 
+-- application/x-www-form-urlencoded または multipart/form-data をパー
+-- スする。もし Content-Type が無かったら BadRequest で終了し、未對應の
+-- タイプであったら UnsupportedMediaType で終了する。
+inputForm :: Int -> Resource [(String, String)]
+inputForm limit
+    = do cTypeM <- getContentType
+         case cTypeM of
+           Nothing
+               -> abort BadRequest [] (Just "Missing Content-Type")
+           Just (MIMEType "application" "x-www-form-urlencoded" _)
+               -> readWWWFormURLEncoded
+           Just (MIMEType "multipart" "form-data" _)
+               -> readMultipartFormData
+           Just cType
+               -> abort UnsupportedMediaType [] (Just $ "Unsupported media type: "
+                                                          ++ show cType)
+    where
+      readWWWFormURLEncoded
+          = do src <- input limit
+               return $ do pairStr <- splitBy (\ c -> c == ';' || c == '&') src
+                           let pair = break (== '=') pairStr
+                           return ( unEscapeString $ fst pair
+                                  , unEscapeString $ snd pair
+                                  )
+      readMultipartFormData -- FIXME: 未對應
+          = abort UnsupportedMediaType []
+            (Just $ "Sorry, inputForm does not currently support multipart/form-data.")
+
+
 defaultLimit :: Int
 defaultLimit = (-1)