wai 3.0.2 → 3.0.2.1
raw patch · 3 files changed
+120/−1 lines, 3 files
Files
- ChangeLog.md +1/−0
- README.md +116/−0
- wai.cabal +3/−1
+ ChangeLog.md view
@@ -0,0 +1,1 @@+No changes logged yet.
+ README.md view
@@ -0,0 +1,116 @@+WAI: Web Application Interface+==============================++Getting started+---------------++You want a minimal example? Here it is!++~~~ {.haskell}+{-# LANGUAGE OverloadedStrings #-}+import Network.Wai+import Network.HTTP.Types+import Network.Wai.Handler.Warp (run)++app :: Application+app _ respond = do+ putStrLn "I've done some IO here"+ respond $ responseLBS+ status200+ [("Content-Type", "text/plain")]+ "Hello, Web!"++main :: IO ()+main = do+ putStrLn $ "http://localhost:8080/"+ run 8080 app+~~~++Put that code into a file named _hello.hs_ and install [wai] and [warp] from Hackage:++ cabal install wai warp++Run it:++ runhaskell hello.hs++Point your browser to:++ http://localhost:8080/+++Serving static content+----------------------++We can modify our previous example to serve static content. For this create a file named _index.html_:++ <p>Hello, Web!</p>++Now we redefine `responseBody` to refer to that file:++~~~ {.haskell}+app2 :: Application+app2 _ respond = respond index++index :: Response+index = responseFile+ status200+ [("Content-Type", "text/html")]+ "index.html"+ Nothing+~~~+++Basic dispatching+-----------------++An `Application` maps `Request`s to `Response`s:++ ghci> :info Application+ type Application = Request -> IO Response++Depending on the path info provided with each `Request` we can serve different `Response`s:++~~~ {.haskell}+app3 :: Application+app3 request respond = respond $ case rawPathInfo request of+ "/" -> index+ "/raw/" -> plainIndex+ _ -> notFound++plainIndex :: Response+plainIndex = responseFile+ status200+ [("Content-Type", "text/plain")]+ "index.html"+ Nothing++notFound :: Response+notFound = responseLBS+ status404+ [("Content-Type", "text/plain")]+ "404 - Not Found"+~~~+++Doing without overloaded strings+--------------------------------++For the sake of efficiency, WAI uses the [bytestring] package. We used GHCs [overloaded strings] to almost hide this fact. But we can easily do without. What follows is a more verbose definition of `notFound`, that works without GHC extensions:++~~~ {.haskell .ignore}+import qualified Data.ByteString.Char8 as B8+import qualified Data.ByteString.Lazy.Char8 as LB8+import Data.CaseInsensitive (mk)++notFound = responseLBS+ status404+ [(mk $ B8.pack "Content-Type", B8.pack "text/plain")]+ (LB8.pack "404 - Not Found")+~~~+++ [wai]: http://hackage.haskell.org/package/wai+ [warp]: http://hackage.haskell.org/package/warp+ [overloaded strings]: http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#overloaded-strings+ [bytestring]: http://hackage.haskell.org/package/bytestring
wai.cabal view
@@ -1,7 +1,8 @@ Name: wai-Version: 3.0.2+Version: 3.0.2.1 Synopsis: Web Application Interface. Description: Provides a common protocol for communication between web applications and web servers.+description: API docs and the README are available at <http://www.stackage.org/package/wai>. License: MIT License-file: LICENSE Author: Michael Snoyman@@ -11,6 +12,7 @@ Build-Type: Simple Cabal-Version: >=1.8 Stability: Stable+extra-source-files: README.md ChangeLog.md Source-repository head type: git