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