module Network.Protocol.Http.Status where
import Data.Bimap
import Data.Maybe
import Prelude hiding (lookup)
data Status =
Continue
| SwitchingProtocols
| OK
| Created
| Accepted
| NonAuthoritativeInformation
| NoContent
| ResetContent
| PartialContent
| MultipleChoices
| MovedPermanently
| Found
| SeeOther
| NotModified
| UseProxy
| TemporaryRedirect
| BadRequest
| Unauthorized
| PaymentRequired
| Forbidden
| NotFound
| MethodNotAllowed
| NotAcceptable
| ProxyAuthenticationRequired
| RequestTimeOut
| Conflict
| Gone
| LengthRequired
| PreconditionFailed
| RequestEntityTooLarge
| RequestURITooLarge
| UnsupportedMediaType
| RequestedRangeNotSatisfiable
| ExpectationFailed
| InternalServerError
| NotImplemented
| BadGateway
| ServiceUnavailable
| GatewayTimeOut
| HTTPVersionNotSupported
| CustomStatus Int String
deriving (Show, Read, Eq, Ord)
printStatus :: Status -> String
printStatus Continue = "Continue"
printStatus SwitchingProtocols = "Switching Protocols"
printStatus OK = "OK"
printStatus Created = "Created"
printStatus Accepted = "Accepted"
printStatus NonAuthoritativeInformation = "Non-Authoritative Information"
printStatus NoContent = "No Content"
printStatus ResetContent = "Reset Content"
printStatus PartialContent = "Partial Content"
printStatus MultipleChoices = "Multiple Choices"
printStatus MovedPermanently = "Moved Permanently"
printStatus Found = "Found"
printStatus SeeOther = "See Other"
printStatus NotModified = "Not Modified"
printStatus UseProxy = "Use Proxy"
printStatus TemporaryRedirect = "Temporary Redirect"
printStatus BadRequest = "Bad Request"
printStatus Unauthorized = "Unauthorized"
printStatus PaymentRequired = "Payment Required"
printStatus Forbidden = "Forbidden"
printStatus NotFound = "Not Found"
printStatus MethodNotAllowed = "Method Not Allowed"
printStatus NotAcceptable = "Not Acceptable"
printStatus ProxyAuthenticationRequired = "Proxy Authentication Required"
printStatus RequestTimeOut = "Request Time-out"
printStatus Conflict = "Conflict"
printStatus Gone = "Gone"
printStatus LengthRequired = "Length Required"
printStatus PreconditionFailed = "Precondition Failed"
printStatus RequestEntityTooLarge = "Request Entity Too Large"
printStatus RequestURITooLarge = "Request-URI Too Large"
printStatus UnsupportedMediaType = "Unsupported Media Type"
printStatus RequestedRangeNotSatisfiable = "Requested range not satisfiable"
printStatus ExpectationFailed = "Expectation Failed"
printStatus InternalServerError = "Internal Server Error"
printStatus NotImplemented = "Not Implemented"
printStatus BadGateway = "Bad Gateway"
printStatus ServiceUnavailable = "Service Unavailable"
printStatus GatewayTimeOut = "Gateway Time-out"
printStatus HTTPVersionNotSupported = "HTTP Version not supported"
printStatus (CustomStatus _ s) = s
statusCodes :: Bimap Int Status
statusCodes = fromList [
(100, Continue)
, (101, SwitchingProtocols)
, (200, OK)
, (201, Created)
, (202, Accepted)
, (203, NonAuthoritativeInformation)
, (204, NoContent)
, (205, ResetContent)
, (206, PartialContent)
, (300, MultipleChoices)
, (301, MovedPermanently)
, (302, Found)
, (303, SeeOther)
, (304, NotModified)
, (305, UseProxy)
, (307, TemporaryRedirect)
, (400, BadRequest)
, (401, Unauthorized)
, (402, PaymentRequired)
, (403, Forbidden)
, (404, NotFound)
, (405, MethodNotAllowed)
, (406, NotAcceptable)
, (407, ProxyAuthenticationRequired)
, (408, RequestTimeOut)
, (409, Conflict)
, (410, Gone)
, (411, LengthRequired)
, (412, PreconditionFailed)
, (413, RequestEntityTooLarge)
, (414, RequestURITooLarge)
, (415, UnsupportedMediaType)
, (416, RequestedRangeNotSatisfiable)
, (417, ExpectationFailed)
, (500, InternalServerError)
, (501, NotImplemented)
, (502, BadGateway)
, (503, ServiceUnavailable)
, (504, GatewayTimeOut)
, (505, HTTPVersionNotSupported)
]
statusFailure :: Status -> Bool
statusFailure st = codeFromStatus st >= 400
statusFromCode :: Int -> Status
statusFromCode num =
fromMaybe (CustomStatus num "Unknown Status")
$ lookup num statusCodes
codeFromStatus :: Status -> Int
codeFromStatus (CustomStatus i _) = i
codeFromStatus st =
fromMaybe 0
$ lookupR st statusCodes