-import qualified Data.ByteString.Lazy.Char8 as L8
+{-# LANGUAGE
+ OverloadedStrings
+ , QuasiQuotes
+ , UnicodeSyntax
+ #-}
+import qualified Data.ByteString.Lazy.Char8 as Lazy
+import Control.Applicative
+import qualified Data.Collections as C
+import Control.Monad.Unicode
+import Data.Default
import Data.Maybe
+import Data.Monoid.Unicode
+import Network
import Network.HTTP.Lucu
+import Prelude hiding (head)
+import Prelude.Unicode
+import Text.Blaze hiding (text)
+import Text.Blaze.Html5 hiding (text)
+import Text.Blaze.Html5.Attributes hiding (form, title)
+import Text.Blaze.Renderer.Utf8
-main :: IO ()
-main = let config = defaultConfig { cnfServerPort = "9999" }
- resources = mkResTree [ ([], resMain) ]
+main ∷ IO ()
+main = let config = def { cnfServerPort = "9999" }
+ tree ∷ ResourceTree
+ tree = C.fromList [ ([], nonGreedy resMain) ]
in
do putStrLn "Access http://localhost:9999/ with your browser."
- runHttpd config resources []
+ withSocketsDo ∘ runHttpd config $ resourceMap tree
-
-resMain :: ResourceDef
-resMain
- = ResourceDef {
- resUsesNativeThread = False
- , resIsGreedy = False
- , resGet
- = Just $ do setContentType $ read "text/html"
- output ("<title>Multipart Form Test</title>" ++
- "<form action=\"/\" method=\"post\" enctype=\"multipart/form-data\">" ++
- " Upload some file:" ++
- " <input type=\"text\" name=\"text\">" ++
- " <input type=\"file\" name=\"file\">" ++
- " <input type=\"submit\" value=\"Submit\">" ++
- "</form>")
- , resHead = Nothing
- , resPost
- = Just $ do form <- inputForm defaultLimit
- let text = fromMaybe L8.empty $ fmap fdContent $ lookup "text" form
- file = fromMaybe L8.empty $ fmap fdContent $ lookup "file" form
- fileName = fdFileName =<< lookup "file" form
- setContentType $ read "text/plain"
- outputChunk ("You entered \"" ++ L8.unpack text ++ "\".\n")
- outputChunk ("You uploaded a " ++ show (L8.length file) ++ " bytes long file.\n")
- output ("The file name is " ++ show fileName ++ ".\n")
- , resPut = Nothing
- , resDelete = Nothing
- }
\ No newline at end of file
+resMain ∷ Resource
+resMain = C.fromList
+ [ ( GET
+ , do setContentType [mimeType| text/html; charset="UTF-8" |]
+ putBuilder
+ $ renderHtmlBuilder
+ $ docTypeHtml ! lang "en"
+ $ do head $ do meta ! charset "UTF-8"
+ title "Multipart Form Test"
+ body $ form ! action "/"
+ ! method "post"
+ ! enctype "multipart/form-data"
+ $ do toHtml ("Upload some file:" ∷ String)
+ input ! type_ "text" ! name "text"
+ input ! type_ "file" ! name "file"
+ input ! type_ "submit" ! value "Submit"
+ )
+ , ( POST
+ , do f ← getForm Nothing
+ let text = fromMaybe (∅) $ fdContent <$> lookup "text" f
+ file = fromMaybe (∅) $ fdContent <$> lookup "file" f
+ fileName = fdFileName =≪ lookup "file" f
+ setContentType [mimeType| text/plain |]
+ putChunks $ "You entered \"" ⊕ text ⊕ "\".\n"
+ putChunks $ "You uploaded a " ⊕ Lazy.pack (show $ Lazy.length file) ⊕ " bytes long file.\n"
+ putChunks $ "The file name is " ⊕ Lazy.pack (show fileName) ⊕ ".\n"
+ )
+ ]