packages feed

Lucu-0.5: examples/Multipart.hs

import qualified Data.ByteString.Lazy.Char8 as L8
import Data.List
import Data.Maybe
import Network.HTTP.Lucu

main :: IO ()
main = let config    = defaultConfig { cnfServerPort = "9999" }
           resources = mkResTree [ ([], resMain) ]
       in
         do putStrLn "Access http://localhost:9999/ with your browser."
            runHttpd config resources []


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 $ find ((== "text") . fdName) form
                          file     = fromMaybe L8.empty $ fmap fdContent $ find ((== "file") . fdName) form
                          fileName = fdFileName =<< find ((== "file") . fdName) 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
      }