0 | module TyTTP.HTTP.Routing
2 | import Data.Mime.Apache
6 | import TyTTP.HTTP.Protocol
10 | methodRouter : Alternative m
13 | Context Method u v h1 s h2 a b
14 | -> m $
Context me' p' v' h1' s' h2' a' b'
16 | -> Context Method u v h1 s h2 a b
17 | -> m $
Context me' p' v' h1' s' h2' a' b'
18 | methodRouter m handler ctx =
19 | if ctx.request.method == m
24 | options : Alternative m
26 | Context Method u v h1 s h2 a b
27 | -> m $
Context me' p' v' h1' s' h2' a' b'
29 | -> Context Method u v h1 s h2 a b
30 | -> m $
Context me' p' v' h1' s' h2' a' b'
31 | options = methodRouter OPTIONS
36 | Context Method u v h1 s h2 a b
37 | -> m $
Context me' p' v' h1' s' h2' a' b'
39 | -> Context Method u v h1 s h2 a b
40 | -> m $
Context me' p' v' h1' s' h2' a' b'
41 | get = methodRouter GET
44 | head : Alternative m
46 | Context Method u v h1 s h2 a b
47 | -> m $
Context me' p' v' h1' s' h2' a' b'
49 | -> Context Method u v h1 s h2 a b
50 | -> m $
Context me' p' v' h1' s' h2' a' b'
51 | head = methodRouter HEAD
54 | post : Alternative m
56 | Context Method u v h1 s h2 a b
57 | -> m $
Context me' p' v' h1' s' h2' a' b'
59 | -> Context Method u v h1 s h2 a b
60 | -> m $
Context me' p' v' h1' s' h2' a' b'
61 | post = methodRouter POST
66 | Context Method u v h1 s h2 a b
67 | -> m $
Context me' p' v' h1' s' h2' a' b'
69 | -> Context Method u v h1 s h2 a b
70 | -> m $
Context me' p' v' h1' s' h2' a' b'
71 | put = methodRouter PUT
74 | delete : Alternative m
76 | Context Method u v h1 s h2 a b
77 | -> m $
Context me' p' v' h1' s' h2' a' b'
79 | -> Context Method u v h1 s h2 a b
80 | -> m $
Context me' p' v' h1' s' h2' a' b'
81 | delete = methodRouter DELETE
84 | trace : Alternative m
86 | Context Method u v h1 s h2 a b
87 | -> m $
Context me' p' v' h1' s' h2' a' b'
89 | -> Context Method u v h1 s h2 a b
90 | -> m $
Context me' p' v' h1' s' h2' a' b'
91 | trace = methodRouter TRACE
94 | connect : Alternative m
96 | Context Method u v h1 s h2 a b
97 | -> m $
Context me' p' v' h1' s' h2' a' b'
99 | -> Context Method u v h1 s h2 a b
100 | -> m $
Context me' p' v' h1' s' h2' a' b'
101 | connect = methodRouter CONNECT
104 | other : Alternative m
107 | Context Method u v h1 s h2 a b
108 | -> m $
Context me' p' v' h1' s' h2' a' b'
110 | -> Context Method u v h1 s h2 a b
111 | -> m $
Context me' p' v' h1' s' h2' a' b'
112 | other str = methodRouter (OtherMethod str)
114 | namespace ContentType
116 | stringMatchesMime : Mime -> String -> Bool
117 | stringMatchesMime mime candidate =
118 | let mimeString = show mime
119 | in isPrefixOf mimeString $
toLower candidate
122 | contentType : Alternative m
123 | => HasContentType h1
126 | Context me u v h1 s h2 a b
127 | -> m $
Context me' p' v' h1' s' h2' a' b'
129 | -> Context me u v h1 s h2 a b
130 | -> m $
Context me' p' v' h1' s' h2' a' b'
131 | contentType mime handler ctx =
132 | case stringMatchesMime mime <$> getContentType ctx.request.headers of
133 | Just True => handler ctx
137 | json : Alternative m
138 | => HasContentType h1
140 | Context me u v h1 s h2 a b
141 | -> m $
Context me' p' v' h1 s' h2' a' b'
143 | -> Context me u v h1 s h2 a b
144 | -> m $
Context me' p' v' h1 s' h2' a' b'
145 | json = contentType APPLICATION_JSON
148 | text : Alternative m
149 | => HasContentType h1
151 | Context me u v h1 s h2 a b
152 | -> m $
Context me' p' v' h1 s' h2' a' b'
154 | -> Context me u v h1 s h2 a b
155 | -> m $
Context me' p' v' h1 s' h2' a' b'
156 | text = contentType TEXT_PLAIN
159 | binary : Alternative m
160 | => HasContentType h1
162 | Context me u v h1 s h2 a b
163 | -> m $
Context me' p' v' h1 s' h2' a' b'
165 | -> Context me u v h1 s h2 a b
166 | -> m $
Context me' p' v' h1 s' h2' a' b'
167 | binary = contentType APPLICATION_OCTET_STREAM