-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMain.purs
More file actions
72 lines (62 loc) · 1.96 KB
/
Main.purs
File metadata and controls
72 lines (62 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
module Main where
import Prelude
import Bucketchain (createServer, listen)
import Bucketchain.Middleware (Middleware)
import Bucketchain.Http (requestMethod, requestURL, requestBody, setStatusCode, setHeader)
import Bucketchain.ResponseBody (body, fromReadable)
import Control.Monad.Error.Class (throwError)
import Control.Monad.Reader (ask)
import Data.Maybe (Maybe(..))
import Effect (Effect)
import Effect.Aff.Class (liftAff)
import Effect.Class (liftEffect)
import Effect.Exception (error)
import Node.FS.Stream (createReadStream)
import Node.HTTP (ListenOptions, Server)
main :: Effect Unit
main = server >>= listen opts
server :: Effect Server
server = createServer middleware
opts :: ListenOptions
opts =
{ hostname: "127.0.0.1"
, port: 3000
, backlog: Nothing
}
middleware :: Middleware
middleware = middleware1 <<< middleware2 <<< middleware3 <<< middleware4
middleware1 :: Middleware
middleware1 next = do
http <- ask
if requestMethod http == "GET" && requestURL http == "/test"
then liftEffect do
setStatusCode http 200
setHeader http "Content-Type" "text/plain; charset=utf-8"
Just <$> body "Hello world :)"
else next
middleware2 :: Middleware
middleware2 next = do
http <- ask
if requestMethod http == "POST" && requestURL http == "/test"
then do
b <- liftAff $ requestBody http
liftEffect do
setStatusCode http 200
setHeader http "Content-Type" "text/plain; charset=utf-8"
Just <$> body b
else next
middleware3 :: Middleware
middleware3 next = do
http <- ask
if requestMethod http == "GET" && requestURL http == "/img"
then liftEffect do
setStatusCode http 200
setHeader http "Content-Type" "image/png"
Just <<< fromReadable <$> createReadStream "example/300x300.png"
else next
middleware4 :: Middleware
middleware4 next = do
http <- ask
if requestMethod http == "GET" && requestURL http == "/error"
then throwError $ error "Internal Server Error"
else next