0 | module TyTTP.HTTP.Protocol
  1 |
  2 | import Data.List
  3 | import TyTTP
  4 |
  5 | public export
  6 | data Method
  7 |   = OPTIONS
  8 |   | GET
  9 |   | HEAD
 10 |   | POST
 11 |   | PUT
 12 |   | DELETE
 13 |   | TRACE
 14 |   | CONNECT
 15 |   | OtherMethod String
 16 |
 17 | export
 18 | Eq Method where
 19 |   (==) OPTIONS OPTIONS = True
 20 |   (==) GET     GET = True
 21 |   (==) HEAD    HEAD = True
 22 |   (==) POST    POST = True
 23 |   (==) PUT     PUT = True
 24 |   (==) DELETE  DELETE = True
 25 |   (==) TRACE   TRACE = True
 26 |   (==) CONNECT CONNECT = True
 27 |   (==) (OtherMethod a) (OtherMethod b) = a == b
 28 |   (==) _ _ = False
 29 |
 30 | export
 31 | Show Method where
 32 |   show m = case m of
 33 |     OPTIONS => "OPTIONS" 
 34 |     GET => "GET" 
 35 |     HEAD => "HEAD" 
 36 |     POST => "POST" 
 37 |     PUT => "PUT" 
 38 |     DELETE => "DELETE" 
 39 |     TRACE => "TRACE" 
 40 |     CONNECT => "CONNECT" 
 41 |     OtherMethod str => str
 42 |
 43 |
 44 | export
 45 | parseMethod : String -> Method
 46 | parseMethod str = case str of
 47 |   "OPTIONS" => OPTIONS
 48 |   "GET" => GET
 49 |   "HEAD" => HEAD
 50 |   "POST" => POST
 51 |   "PUT" => PUT
 52 |   "DELETE" => DELETE
 53 |   "TRACE" => TRACE
 54 |   "CONNECT" => CONNECT
 55 |   s => OtherMethod s
 56 |
 57 | public export
 58 | data Version
 59 |   = Version_1_0
 60 |   | Version_1_1
 61 |   | Version_2
 62 |   | OtherVersion String
 63 |
 64 | export
 65 | Eq Version where
 66 |   (==) Version_1_0 Version_1_0 = True
 67 |   (==) Version_1_1 Version_1_1 = True
 68 |   (==) Version_2 Version_2 = True
 69 |   (==) (OtherVersion v1) (OtherVersion v2) = v1 == v2
 70 |   (==) _ _ = False
 71 |
 72 | export
 73 | Show Version where
 74 |   show v = case v of
 75 |     Version_1_0 => "1.0"
 76 |     Version_1_1 => "1.1"
 77 |     Version_2 => "2.0"
 78 |     OtherVersion v => v
 79 |
 80 | export
 81 | parseVersion : String -> Version
 82 | parseVersion s = case s of
 83 |   "1.0" => Version_1_0
 84 |   "1.1" => Version_1_1
 85 |   "2.0" => Version_2
 86 |   v => OtherVersion v
 87 |
 88 | public export
 89 | StringHeaders : Type
 90 | StringHeaders = List (String, String)
 91 |
 92 | public export
 93 | interface HasContentType a where
 94 |   getContentType : a -> Maybe String
 95 |
 96 | export
 97 | implementation HasContentType StringHeaders where
 98 |   getContentType headers = lookup "content-type" headers
 99 |
100 |
101 | public export
102 | HttpRequest : Type -> Type -> Type -> Type
103 | HttpRequest p h a = Request Method p Version h a
104 |
105 | export
106 | mkRequest : (m : Method) -> p -> Version -> h -> a -> HttpRequest p h a
107 | mkRequest m p v h a = MkRequest m p v h a
108 |
109 | public export
110 | data Status
111 |   = CONTINUE
112 |   | SWITCHING_PROTOCOLS
113 |   | PROCESSING
114 |   | EARLY_HINTS
115 |   | OK
116 |   | CREATED
117 |   | ACCEPTED
118 |   | NON_AUTHORITATIVE_INFORMATION
119 |   | NO_CONTENT
120 |   | RESET_CONTENT
121 |   | PARTIAL_CONTENT
122 |   | MULTI_STATUS
123 |   | ALREADY_REPORTED
124 |   | IM_USED
125 |   | MULTIPLE_CHOICES
126 |   | MOVED_PERMANENTLY
127 |   | FOUND
128 |   | SEE_OTHER
129 |   | NOT_MODIFIED
130 |   | USE_PROXY
131 |   | TEMPORARY_REDIRECT
132 |   | PERMANENT_REDIRECT
133 |   | BAD_REQUEST
134 |   | UNAUTHORIZED
135 |   | PAYMENT_REQUIRED
136 |   | FORBIDDEN
137 |   | NOT_FOUND
138 |   | METHOD_NOT_ALLOWED
139 |   | NOT_ACCEPTABLE
140 |   | PROXY_AUTHENTICATION_REQUIRED
141 |   | REQUEST_TIMEOUT
142 |   | CONFLICT
143 |   | GONE
144 |   | LENGTH_REQUIRED
145 |   | PRECONDITION_FAILED
146 |   | PAYLOAD_TOO_LARGE
147 |   | URI_TOO_LONG
148 |   | UNSUPPORTED_MEDIA_TYPE
149 |   | RANGE_NOT_SATISFIABLE
150 |   | EXPECTATION_FAILED
151 |   | TEAPOT
152 |   | MISDIRECTED_REQUEST
153 |   | UNPROCESSABLE_ENTITY
154 |   | LOCKED
155 |   | FAILED_DEPENDENCY
156 |   | TOO_EARLY
157 |   | UPGRADE_REQUIRED
158 |   | PRECONDITION_REQUIRED
159 |   | TOO_MANY_REQUESTS
160 |   | REQUEST_HEADER_FIELDS_TOO_LARGE
161 |   | UNAVAILABLE_FOR_LEGAL_REASONS
162 |   | INTERNAL_SERVER_ERROR
163 |   | NOT_IMPLEMENTED
164 |   | BAD_GATEWAY
165 |   | SERVICE_UNAVAILABLE
166 |   | GATEWAY_TIMEOUT
167 |   | HTTP_VERSION_NOT_SUPPORTED
168 |   | VARIANT_ALSO_NEGOTIATES
169 |   | INSUFFICIENT_STORAGE
170 |   | LOOP_DETECTED
171 |   | BANDWIDTH_LIMIT_EXCEEDED
172 |   | NOT_EXTENDED
173 |   | NETWORK_AUTHENTICATION_REQUIRED
174 |
175 | export
176 | (.code) : Status -> Int
177 | (.code) status = case status of
178 |   CONTINUE => 100
179 |   SWITCHING_PROTOCOLS => 101
180 |   PROCESSING => 102
181 |   EARLY_HINTS => 103
182 |   OK => 200
183 |   CREATED => 201
184 |   ACCEPTED => 202
185 |   NON_AUTHORITATIVE_INFORMATION => 203
186 |   NO_CONTENT => 204
187 |   RESET_CONTENT => 205
188 |   PARTIAL_CONTENT => 206
189 |   MULTI_STATUS => 207
190 |   ALREADY_REPORTED => 208
191 |   IM_USED => 226
192 |   MULTIPLE_CHOICES => 300
193 |   MOVED_PERMANENTLY => 301
194 |   FOUND => 302
195 |   SEE_OTHER => 303
196 |   NOT_MODIFIED => 304
197 |   USE_PROXY => 305
198 |   TEMPORARY_REDIRECT => 307
199 |   PERMANENT_REDIRECT => 308
200 |   BAD_REQUEST => 400
201 |   UNAUTHORIZED => 401
202 |   PAYMENT_REQUIRED => 402
203 |   FORBIDDEN => 403
204 |   NOT_FOUND => 404
205 |   METHOD_NOT_ALLOWED => 405
206 |   NOT_ACCEPTABLE => 406
207 |   PROXY_AUTHENTICATION_REQUIRED => 407
208 |   REQUEST_TIMEOUT => 408
209 |   CONFLICT => 409
210 |   GONE => 410
211 |   LENGTH_REQUIRED => 411
212 |   PRECONDITION_FAILED => 412
213 |   PAYLOAD_TOO_LARGE => 413
214 |   URI_TOO_LONG => 414
215 |   UNSUPPORTED_MEDIA_TYPE => 415
216 |   RANGE_NOT_SATISFIABLE => 416
217 |   EXPECTATION_FAILED => 417
218 |   TEAPOT => 418
219 |   MISDIRECTED_REQUEST => 421
220 |   UNPROCESSABLE_ENTITY => 422
221 |   LOCKED => 423
222 |   FAILED_DEPENDENCY => 424
223 |   TOO_EARLY => 425
224 |   UPGRADE_REQUIRED => 426
225 |   PRECONDITION_REQUIRED => 428
226 |   TOO_MANY_REQUESTS => 429
227 |   REQUEST_HEADER_FIELDS_TOO_LARGE => 431
228 |   UNAVAILABLE_FOR_LEGAL_REASONS => 451
229 |   INTERNAL_SERVER_ERROR => 500
230 |   NOT_IMPLEMENTED => 501
231 |   BAD_GATEWAY => 502
232 |   SERVICE_UNAVAILABLE => 503
233 |   GATEWAY_TIMEOUT => 504
234 |   HTTP_VERSION_NOT_SUPPORTED => 505
235 |   VARIANT_ALSO_NEGOTIATES => 506
236 |   INSUFFICIENT_STORAGE => 507
237 |   LOOP_DETECTED => 508
238 |   BANDWIDTH_LIMIT_EXCEEDED => 509
239 |   NOT_EXTENDED => 510
240 |   NETWORK_AUTHENTICATION_REQUIRED => 511
241 |
242 |