1{-# LANGUAGE OverloadedStrings, DeriveDataTypeable #-}
2module Network.HTTP.Types.Status
3( Status(..)
4, mkStatus
5, status100
6, continue100
7, status101
8, switchingProtocols101
9, status200
10, ok200
11, status201
12, created201
13, status202
14, accepted202
15, status203
16, nonAuthoritative203
17, status204
18, noContent204
19, status205
20, resetContent205
21, status206
22, partialContent206
23, status300
24, multipleChoices300
25, status301
26, movedPermanently301
27, status302
28, found302
29, status303
30, seeOther303
31, status304
32, notModified304
33, status305
34, useProxy305
35, status307
36, temporaryRedirect307
37, status308
38, permanentRedirect308
39, status400
40, badRequest400
41, status401
42, unauthorized401
43, status402
44, paymentRequired402
45, status403
46, forbidden403
47, status404
48, notFound404
49, status405
50, methodNotAllowed405
51, status406
52, notAcceptable406
53, status407
54, proxyAuthenticationRequired407
55, status408
56, requestTimeout408
57, status409
58, conflict409
59, status410
60, gone410
61, status411
62, lengthRequired411
63, status412
64, preconditionFailed412
65, status413
66, requestEntityTooLarge413
67, status414
68, requestURITooLong414
69, status415
70, unsupportedMediaType415
71, status416
72, requestedRangeNotSatisfiable416
73, status417
74, expectationFailed417
75, status418
76, imATeapot418
77, status422
78, unprocessableEntity422
79, status426
80, upgradeRequired426
81, status428
82, preconditionRequired428
83, status429
84, tooManyRequests429
85, status431
86, requestHeaderFieldsTooLarge431
87, status500
88, internalServerError500
89, status501
90, notImplemented501
91, status502
92, badGateway502
93, status503
94, serviceUnavailable503
95, status504
96, gatewayTimeout504
97, status505
98, status511
99, networkAuthenticationRequired511
100, httpVersionNotSupported505
101, statusIsInformational
102, statusIsSuccessful
103, statusIsRedirection
104, statusIsClientError
105, statusIsServerError
106) where
107
108import qualified Data.ByteString as B
109import Data.Typeable
110
111-- | HTTP Status.
112--
113-- Only the 'statusCode' is used for comparisons.
114--
115-- Please use 'mkStatus' to create status codes from code and message, or the 'Enum' instance or the
116-- status code constants (like 'ok200'). There might be additional record members in the future.
117--
118-- Note that the Show instance is only for debugging.
119data Status
120    = Status { statusCode :: Int
121             , statusMessage :: B.ByteString
122             } deriving (Show, Typeable)
123
124instance Eq Status where
125    Status { statusCode = a } == Status { statusCode = b } = a == b
126
127instance Ord Status where
128    compare Status { statusCode = a } Status { statusCode = b } = a `compare` b
129
130instance Enum Status where
131    fromEnum = statusCode
132    toEnum 100 = status100
133    toEnum 101 = status101
134    toEnum 200 = status200
135    toEnum 201 = status201
136    toEnum 202 = status202
137    toEnum 203 = status203
138    toEnum 204 = status204
139    toEnum 205 = status205
140    toEnum 206 = status206
141    toEnum 300 = status300
142    toEnum 301 = status301
143    toEnum 302 = status302
144    toEnum 303 = status303
145    toEnum 304 = status304
146    toEnum 305 = status305
147    toEnum 307 = status307
148    toEnum 308 = status308
149    toEnum 400 = status400
150    toEnum 401 = status401
151    toEnum 402 = status402
152    toEnum 403 = status403
153    toEnum 404 = status404
154    toEnum 405 = status405
155    toEnum 406 = status406
156    toEnum 407 = status407
157    toEnum 408 = status408
158    toEnum 409 = status409
159    toEnum 410 = status410
160    toEnum 411 = status411
161    toEnum 412 = status412
162    toEnum 413 = status413
163    toEnum 414 = status414
164    toEnum 415 = status415
165    toEnum 416 = status416
166    toEnum 417 = status417
167    toEnum 418 = status418
168    toEnum 422 = status422
169    toEnum 426 = status426
170    toEnum 428 = status428
171    toEnum 429 = status429
172    toEnum 431 = status431
173    toEnum 500 = status500
174    toEnum 501 = status501
175    toEnum 502 = status502
176    toEnum 503 = status503
177    toEnum 504 = status504
178    toEnum 505 = status505
179    toEnum 511 = status511
180    toEnum c   = mkStatus c B.empty
181
182instance Bounded Status where
183  minBound = status100
184  maxBound = status511
185
186-- | Create a Status from status code and message.
187mkStatus :: Int -> B.ByteString -> Status
188mkStatus = Status
189
190-- | Continue 100
191status100 :: Status
192status100 = mkStatus 100 "Continue"
193
194-- | Continue 100
195continue100 :: Status
196continue100 = status100
197
198-- | Switching Protocols 101
199status101 :: Status
200status101 = mkStatus 101 "Switching Protocols"
201
202-- | Switching Protocols 101
203switchingProtocols101 :: Status
204switchingProtocols101 = status101
205
206-- | OK 200
207status200 :: Status
208status200 = mkStatus 200 "OK"
209
210-- | OK 200
211ok200 :: Status
212ok200 = status200
213
214-- | Created 201
215status201 :: Status
216status201 = mkStatus 201 "Created"
217
218-- | Created 201
219created201 :: Status
220created201 = status201
221
222-- | Accepted 202
223status202 :: Status
224status202 = mkStatus 202 "Accepted"
225
226-- | Accepted 202
227accepted202 :: Status
228accepted202 = status202
229
230-- | Non-Authoritative Information 203
231status203 :: Status
232status203 = mkStatus 203 "Non-Authoritative Information"
233
234-- | Non-Authoritative Information 203
235nonAuthoritative203 :: Status
236nonAuthoritative203 = status203
237
238-- | No Content 204
239status204 :: Status
240status204 = mkStatus 204 "No Content"
241
242-- | No Content 204
243noContent204 :: Status
244noContent204 = status204
245
246-- | Reset Content 205
247status205 :: Status
248status205 = mkStatus 205 "Reset Content"
249
250-- | Reset Content 205
251resetContent205 :: Status
252resetContent205 = status205
253
254-- | Partial Content 206
255status206 :: Status
256status206 = mkStatus 206 "Partial Content"
257
258-- | Partial Content 206
259partialContent206 :: Status
260partialContent206 = status206
261
262-- | Multiple Choices 300
263status300 :: Status
264status300 = mkStatus 300 "Multiple Choices"
265
266-- | Multiple Choices 300
267multipleChoices300 :: Status
268multipleChoices300 = status300
269
270-- | Moved Permanently 301
271status301 :: Status
272status301 = mkStatus 301 "Moved Permanently"
273
274-- | Moved Permanently 301
275movedPermanently301 :: Status
276movedPermanently301 = status301
277
278-- | Found 302
279status302 :: Status
280status302 = mkStatus 302 "Found"
281
282-- | Found 302
283found302 :: Status
284found302 = status302
285
286-- | See Other 303
287status303 :: Status
288status303 = mkStatus 303 "See Other"
289
290-- | See Other 303
291seeOther303 :: Status
292seeOther303 = status303
293
294-- | Not Modified 304
295status304 :: Status
296status304 = mkStatus 304 "Not Modified"
297
298-- | Not Modified 304
299notModified304 :: Status
300notModified304 = status304
301
302-- | Use Proxy 305
303status305 :: Status
304status305 = mkStatus 305 "Use Proxy"
305
306-- | Use Proxy 305
307useProxy305 :: Status
308useProxy305 = status305
309
310-- | Temporary Redirect 307
311status307 :: Status
312status307 = mkStatus 307 "Temporary Redirect"
313
314-- | Temporary Redirect 307
315temporaryRedirect307 :: Status
316temporaryRedirect307 = status307
317
318-- | Permanent Redirect 308
319status308 :: Status
320status308 = mkStatus 308 "Permanent Redirect"
321
322-- | Permanent Redirect 308
323permanentRedirect308 :: Status
324permanentRedirect308 = status308
325
326-- | Bad Request 400
327status400 :: Status
328status400 = mkStatus 400 "Bad Request"
329
330-- | Bad Request 400
331badRequest400 :: Status
332badRequest400 = status400
333
334-- | Unauthorized 401
335status401 :: Status
336status401 = mkStatus 401 "Unauthorized"
337
338-- | Unauthorized 401
339unauthorized401 :: Status
340unauthorized401 = status401
341
342-- | Payment Required 402
343status402 :: Status
344status402 = mkStatus 402 "Payment Required"
345
346-- | Payment Required 402
347paymentRequired402 :: Status
348paymentRequired402 = status402
349
350-- | Forbidden 403
351status403 :: Status
352status403 = mkStatus 403 "Forbidden"
353
354-- | Forbidden 403
355forbidden403 :: Status
356forbidden403 = status403
357
358-- | Not Found 404
359status404 :: Status
360status404 = mkStatus 404 "Not Found"
361
362-- | Not Found 404
363notFound404 :: Status
364notFound404 = status404
365
366-- | Method Not Allowed 405
367status405 :: Status
368status405 = mkStatus 405 "Method Not Allowed"
369
370-- | Method Not Allowed 405
371methodNotAllowed405 :: Status
372methodNotAllowed405 = status405
373
374-- | Not Acceptable 406
375status406 :: Status
376status406 = mkStatus 406 "Not Acceptable"
377
378-- | Not Acceptable 406
379notAcceptable406 :: Status
380notAcceptable406 = status406
381
382-- | Proxy Authentication Required 407
383status407 :: Status
384status407 = mkStatus 407 "Proxy Authentication Required"
385
386-- | Proxy Authentication Required 407
387proxyAuthenticationRequired407 :: Status
388proxyAuthenticationRequired407 = status407
389
390-- | Request Timeout 408
391status408 :: Status
392status408 = mkStatus 408 "Request Timeout"
393
394-- | Request Timeout 408
395requestTimeout408 :: Status
396requestTimeout408 = status408
397
398-- | Conflict 409
399status409 :: Status
400status409 = mkStatus 409 "Conflict"
401
402-- | Conflict 409
403conflict409 :: Status
404conflict409 = status409
405
406-- | Gone 410
407status410 :: Status
408status410 = mkStatus 410 "Gone"
409
410-- | Gone 410
411gone410 :: Status
412gone410 = status410
413
414-- | Length Required 411
415status411 :: Status
416status411 = mkStatus 411 "Length Required"
417
418-- | Length Required 411
419lengthRequired411 :: Status
420lengthRequired411 = status411
421
422-- | Precondition Failed 412
423status412 :: Status
424status412 = mkStatus 412 "Precondition Failed"
425
426-- | Precondition Failed 412
427preconditionFailed412 :: Status
428preconditionFailed412 = status412
429
430-- | Request Entity Too Large 413
431status413 :: Status
432status413 = mkStatus 413 "Request Entity Too Large"
433
434-- | Request Entity Too Large 413
435requestEntityTooLarge413 :: Status
436requestEntityTooLarge413 = status413
437
438-- | Request-URI Too Long 414
439status414 :: Status
440status414 = mkStatus 414 "Request-URI Too Long"
441
442-- | Request-URI Too Long 414
443requestURITooLong414 :: Status
444requestURITooLong414 = status414
445
446-- | Unsupported Media Type 415
447status415 :: Status
448status415 = mkStatus 415 "Unsupported Media Type"
449
450-- | Unsupported Media Type 415
451unsupportedMediaType415 :: Status
452unsupportedMediaType415 = status415
453
454-- | Requested Range Not Satisfiable 416
455status416 :: Status
456status416 = mkStatus 416 "Requested Range Not Satisfiable"
457
458-- | Requested Range Not Satisfiable 416
459requestedRangeNotSatisfiable416 :: Status
460requestedRangeNotSatisfiable416 = status416
461
462-- | Expectation Failed 417
463status417 :: Status
464status417 = mkStatus 417 "Expectation Failed"
465
466-- | Expectation Failed 417
467expectationFailed417 :: Status
468expectationFailed417 = status417
469
470-- | I'm a teapot 418
471status418 :: Status
472status418 = mkStatus 418 "I'm a teapot"
473
474-- | I'm a teapot 418
475imATeapot418 :: Status
476imATeapot418 = status418
477
478-- | Unprocessable Entity 422
479-- (<https://tools.ietf.org/html/rfc4918 RFC 4918>)
480status422 :: Status
481status422 = mkStatus 422 "Unprocessable Entity"
482
483-- | Unprocessable Entity 422
484-- (<https://tools.ietf.org/html/rfc4918 RFC 4918>)
485unprocessableEntity422 :: Status
486unprocessableEntity422 = status422
487
488-- | Upgrade Required 426
489-- (<https://tools.ietf.org/html/rfc7231#section-6.5.15>)
490status426 :: Status
491status426 = mkStatus 426 "Upgrade Required"
492
493-- | Upgrade Required 426
494-- (<https://tools.ietf.org/html/rfc7231#section-6.5.15>)
495upgradeRequired426 :: Status
496upgradeRequired426 = status426
497
498-- | Precondition Required 428
499-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
500status428 :: Status
501status428 = mkStatus 428 "Precondition Required"
502
503-- | Precondition Required 428
504-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
505preconditionRequired428 :: Status
506preconditionRequired428 = status428
507
508-- | Too Many Requests 429
509-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
510status429 :: Status
511status429 = mkStatus 429 "Too Many Requests"
512
513-- | Too Many Requests 429
514-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
515tooManyRequests429 :: Status
516tooManyRequests429 = status429
517
518-- | Request Header Fields Too Large 431
519-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
520status431 :: Status
521status431 = mkStatus 431 "Request Header Fields Too Large"
522
523-- | Request Header Fields Too Large 431
524-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
525requestHeaderFieldsTooLarge431 :: Status
526requestHeaderFieldsTooLarge431 = status431
527
528-- | Internal Server Error 500
529status500 :: Status
530status500 = mkStatus 500 "Internal Server Error"
531
532-- | Internal Server Error 500
533internalServerError500 :: Status
534internalServerError500 = status500
535
536-- | Not Implemented 501
537status501 :: Status
538status501 = mkStatus 501 "Not Implemented"
539
540-- | Not Implemented 501
541notImplemented501 :: Status
542notImplemented501 = status501
543
544-- | Bad Gateway 502
545status502 :: Status
546status502 = mkStatus 502 "Bad Gateway"
547
548-- | Bad Gateway 502
549badGateway502 :: Status
550badGateway502 = status502
551
552-- | Service Unavailable 503
553status503 :: Status
554status503 = mkStatus 503 "Service Unavailable"
555
556-- | Service Unavailable 503
557serviceUnavailable503 :: Status
558serviceUnavailable503 = status503
559
560-- | Gateway Timeout 504
561status504 :: Status
562status504 = mkStatus 504 "Gateway Timeout"
563
564-- | Gateway Timeout 504
565gatewayTimeout504 :: Status
566gatewayTimeout504 = status504
567
568-- | HTTP Version Not Supported 505
569status505 :: Status
570status505 = mkStatus 505 "HTTP Version Not Supported"
571
572-- | HTTP Version Not Supported 505
573httpVersionNotSupported505 :: Status
574httpVersionNotSupported505 = status505
575
576-- | Network Authentication Required 511
577-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
578status511 :: Status
579status511 = mkStatus 511 "Network Authentication Required"
580
581-- | Network Authentication Required 511
582-- (<https://tools.ietf.org/html/rfc6585 RFC 6585>)
583networkAuthenticationRequired511 :: Status
584networkAuthenticationRequired511 = status511
585
586-- | Informational class
587statusIsInformational :: Status -> Bool
588statusIsInformational (Status {statusCode=code}) = code >= 100 && code < 200
589
590-- | Successful class
591statusIsSuccessful :: Status -> Bool
592statusIsSuccessful (Status {statusCode=code}) = code >= 200 && code < 300
593
594-- | Redirection class
595statusIsRedirection :: Status -> Bool
596statusIsRedirection (Status {statusCode=code}) = code >= 300 && code < 400
597
598-- | Client Error class
599statusIsClientError :: Status -> Bool
600statusIsClientError (Status {statusCode=code}) = code >= 400 && code < 500
601
602-- | Server Error class
603statusIsServerError :: Status -> Bool
604statusIsServerError (Status {statusCode=code}) = code >= 500 && code < 600
605