/*
 * Copyright (C) 2013 Neo Visionaries Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#ifndef HTTPStatusCodes_h
#define HTTPStatusCodes_h


//----------------------------------------------------------------------
// Typedef
//----------------------------------------------------------------------

/**
 * HTTP status codes.
 *
 * The list here is based on the description at Wikipedia.
 * The initial version of this list was written on April 20, 2013.
 *
 * @see <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes"
 *      >List of HTTP status codes</a>
 */
typedef enum
{
    /*--------------------------------------------------
     * 1xx Informational
     *------------------------------------------------*/

    /**
     * 100 Continue.
     */
    kHTTPStatusCodeContinue = 100,

    /**
     * 101 Switching Protocols.
     */
    kHTTPStatusCodeSwitchingProtocols = 101,

#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_2518)
    /**
     * 103 Processing (WebDAV; RFC 2518).
     */
    kHTTPStatusCodeProcessing = 102,
#endif

    /*--------------------------------------------------
     * 2xx Success
     *------------------------------------------------*/
    
    /**
     * 200 OK.
     */
    kHTTPStatusCodeOK = 200,

    /**
     * 201 Created.
     */
    kHTTPStatusCodeCreated = 201,

    /**
     * 202 Accepted.
     */
    kHTTPStatusCodeAccepted = 202,

    /**
     * 203 Non-Authoritative Information (since HTTP/1.1).
     */
    kHTTPStatusCodeNonAuthoritativeInformation = 203,

    /**
     * 204 No Content.
     */
    kHTTPStatusCodeNoContent = 204,

    /**
     * 205 Reset Content.
     */
    kHTTPStatusCodeResetContent = 205,

    /**
     * 206 Partial Content.
     */
    kHTTPStatusCodePartialContent = 206,

#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_4918)
    /**
     * 207 Multi-Status (WebDAV; RFC 4918).
     */
    kHTTPStatusCodeMultiStatus = 207,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_5842)
    /**
     * 208 Already Reported (WebDAV; RFC 5842).
     */
    kHTTPStatusCodeAlreadyReported = 208,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_3229)
    /**
     * 226 IM Used (RFC 3229)
     */
    kHTTPStatusCodeIMUsed = 226,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_2326)
    /**
     * 250 Low on Storage Space (RTSP; RFC 2326).
     */
    kHTTPStatusCodeLowOnStorageSpace = 250,
#endif

    /*--------------------------------------------------
     * 3xx Redirection
     *------------------------------------------------*/

    /**
     * 300 Multiple Choices.
     */
    kHTTPStatusCodeMultipleChoices = 300,

    /**
     * 301 Moved Permanently.
     */
    kHTTPStatusCodeMovedPermanently = 301,
    
    /**
     * 302 Found.
     */
    kHTTPStatusCodeFound = 302,
    
    /**
     * 303 See Other (since HTTP/1.1).
     */
    kHTTPStatusCodeSeeOther = 303,
    
    /**
     * 304 Not Modified.
     */
    kHTTPStatusCodeNotModified = 304,

    /**
     * 305 Use Proxy (since HTTP/1.1).
     */
    kHTTPStatusCodeUseProxy = 305,

    /**
     * 306 Switch Proxy.
     */
    kHTTPStatusCodeSwitchProxy = 306,

    /**
     * 307 Temporary Redirect (since HTTP/1.1).
     */
    kHTTPStatusCodeTemporaryRedirect = 307,

    /**
     * 308 Permanent Redirect (approved as experimental RFC).
     */
    kHTTPStatusCodePermanentRedirect = 308,

    /*--------------------------------------------------
     * 4xx Client Error
     *------------------------------------------------*/
    
    /**
     * 400 Bad Request.
     */
    kHTTPStatusCodeBadRequest = 400,
    
    /**
     * 401 Unauthorized.
     */
    kHTTPStatusCodeUnauthorized = 401,
    
    /**
     * 402 Payment Required.
     */
    kHTTPStatusCodePaymentRequired = 402,
    
    /**
     * 403 Forbidden.
     */
    kHTTPStatusCodeForbidden = 403,
    
    /**
     * 404 Not Found.
     */
    kHTTPStatusCodeNotFound = 404,
    
    /**
     * 405 Method Not Allowed.
     */
    kHTTPStatusCodeMethodNotAllowed = 405,
    
    /**
     * 406 Not Acceptable.
     */
    kHTTPStatusCodeNotAcceptable = 406,

    /**
     * 407 Proxy Authentication Required.
     */
    kHTTPStatusCodeProxyAuthenticationRequired = 407,

    /**
     * 408 Request Timeout.
     */
    kHTTPStatusCodeRequestTimeout = 408,
    
    /**
     * 409 Conflict.
     */
    kHTTPStatusCodeConflict = 409,
    
    /**
     * 410 Gone.
     */
    kHTTPStatusCodeGone = 410,
    
    /**
     * 411 Length Required.
     */
    kHTTPStatusCodeLengthRequired = 411,
    
    /**
     * 412 Precondition Failed.
     */
    kHTTPStatusCodePreconditionFailed = 412,
    
    /**
     * 413 Request Entity Too Large.
     */
    kHTTPStatusCodeRequestEntityTooLarge = 413,
    
    /**
     * 414 Request-URI Too Long.
     */
    kHTTPStatusCodeRequestURITooLong = 414,
    
    /**
     * 415 Unsupported Media Type.
     */
    kHTTPStatusCodeUnsupportedMediaType = 415,
    
    /**
     * 416 Requested Range Not Satisfiable.
     */
    kHTTPStatusCodeRequestedRangeNotSatisfiable = 416,
    
    /**
     * 417 Expectation Failed.
     */
    kHTTPStatusCodeExpectationFailed = 417,

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_2324)
    /**
     * 418 I'm a teapot (RFC 2324).
     */
    kHTTPStatusCodeImATeapot = 418,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_TWITTER)
    /**
     * 420 Enhance Your Calm (Twitter).
     */
    kHTTPStatusCodeEnhanceYourCalm = 420,
#endif
    
#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_4918)
    /**
     * 422 Unprocessable Entity (WebDAV; RFC 4918).
     */
    kHTTPStatusCodeUnprocessableEntity = 422,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_4918)
    /**
     * 423 Locked (WebDAV; RFC 4918).
     */
    kHTTPStatusCodeLocked = 423,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_4918)
    /**
     * 424 Failed Dependency (WebDAV; RFC 4918).
     */
    kHTTPStatusCodeFailedDependency = 424,
#endif

    /**
     * 425 Unordered Collection (Internet draft).
     */
    kHTTPStatusCodeUnorderedCollection = 425,

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_2817)
    /**
     * 426 Upgrade Required (RFC 2817).
     */
    kHTTPStatusCodeUpgradeRequired = 426,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_6585)
    /**
     * 428 Precondition Required (RFC 6585).
     */
    kHTTPStatusCodePreconditionRequired = 428,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_6585)
    /**
     * 429 Too Many Requests (RFC 6585).
     */
    kHTTPStatusCodeTooManyRequests = 429,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_6585)
    /**
     * 431 Request Header Fields Too Large (RFC 6585).
     */
    kHTTPStatusCodeRequestHeaderFieldsTooLarge = 431,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_NGINX)
    /**
     * 444 No Response (Nginx).
     */
    kHTTPStatusCodeNoResponse = 444,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_MICROSOFT)
    /**
     * 449 Retry With (Microsoft).
     */
    kHTTPStatusCodeRetryWith = 449,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_MICROSOFT)
    /**
     * 450 Blocked by Windows Parental Controls (Microsoft).
     */
    kHTTPStatusCodeBlockedByWindowsParentalControls = 450,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 451 Parameter Not Understood (RTSP).
     */
    kHTTPStatusCodeParameterNotUnderstood = 451,
#endif

    /**
     * 451 Unavailable For Legal Reasons (Internet draft).
     */
    kHTTPStatusCodeUnavailableForLegalReasons = 451,
    
#if !defined(HTTP_STATUS_CODES_EXCLUDE_MICROSOFT)
    /**
     * 451 Redirect (Microsoft).
     */
    kHTTPStatusCodeRedirect = 451,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 452 Conference Not Found (RTSP).
     */
    kHTTPStatusCodeConferenceNotFound = 452,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 453 Not Enough Bandwidth (RTSP).
     */
    kHTTPStatusCodeNotEnoughBandwidth = 453,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 454 Session Not Found (RTSP).
     */
    kHTTPStatusCodeSessionNotFound = 454,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 455 Method Not Valid in This State (RTSP).
     */
    kHTTPStatusCodeMethodNotValidInThisState = 455,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 456 Header Field Not Valid for Resource (RTSP).
     */
    kHTTPStatusCodeHeaderFieldNotValidForResource = 456,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 457 Invalid Range (RTSP).
     */
    kHTTPStatusCodeInvalidRange = 457,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 458 Parameter Is Read-Only (RTSP).
     */
    kHTTPStatusCodeParameterIsReadOnly = 458,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 459 Aggregate Operation Not Allowed (RTSP).
     */
    kHTTPStatusCodeAggregateOperationNotAllowed = 459,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 460 Only Aggregate Operation Allowed (RTSP).
     */
    kHTTPStatusCodeOnlyAggregateOperationAllowed = 460,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 461 Unsupported Transport (RTSP).
     */
    kHTTPStatusCodeUnsupportedTransport = 461,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 462 Destination Unreachable (RTSP).
     */
    kHTTPStatusCodeDestinationUnreachable = 462,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_NGINX)
    /**
     * 494 Request Header Too Large (Nginx).
     */
    kHTTPStatusCodeRequestHeaderTooLarge = 494,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_NGINX)
    /**
     * 495 Cert Error (Nginx).
     */
    kHTTPStatusCodeCertError = 495,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_NGINX)
    /**
     * 496 No Cert (Nginx).
     */
    kHTTPStatusCodeNoCert = 496,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_NGINX)
    /**
     * 497 HTTP to HTTPS (Nginx).
     */
    kHTTPStatusCodeHTTPToHTTPS = 497,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_NGINX)
    /**
     * 499 Client Closed Request (Nginx).
     */
    kHTTPStatusCodeClientClosedRequest = 499,
#endif

    /*--------------------------------------------------
     * 5xx Server Error
     *------------------------------------------------*/
    
    /**
     * 500 Internal Server Error.
     */
    kHTTPStatusCodeInternalServerError = 500,
    
    /**
     * 501 Not Implemented
     */
    kHTTPStatusCodeNotImplemented = 501,
    
    /**
     * 502 Bad Gateway.
     */
    kHTTPStatusCodeBadGateway = 502,
    
    /**
     * 503 Service Unavailable.
     */
    kHTTPStatusCodeServiceUnavailable = 503,
    
    /**
     * 504 Gateway Timeout.
     */
    kHTTPStatusCodeGatewayTimeout = 504,

    /**
     * 505 HTTP Version Not Supported.
     */
    kHTTPStatusCodeHTTPVersionNotSupported = 505,
    
#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_2295)
    /**
     * 506 Variant Also Negotiates (RFC 2295).
     */
    kHTTPStatusCodeVariantAlsoNegotiates = 506,
#endif
    
#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_4918)
    /**
     * 507 Insufficient Storage (WebDAV; RFC 4918).
     */
    kHTTPStatusCodeInsufficientStorage = 507,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_WEBDAV) && !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_5842)
    /**
     * 508 Loop Detected (WebDAV; RFC 5842).
     */
    kHTTPStatusCodeLoopDetected = 508,
#endif

    /**
     * 509 Bandwidth Limit Exceeded (Apache bw/limited extension).
     */
    kHTTPStatusCodeBandwidthLimitExceeded = 509,

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_2774)
    /**
     * 510 Not Extended (RFC 2774).
     */
    kHTTPStatusCodeNotExtended = 510,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RFC_6585)
    /**
     * 511 Network Authentication Required (RFC 6585).
     */
    kHTTPStatusCodeNetworkAuthenticationRequired = 511,
#endif

#if !defined(HTTP_STATUS_CODES_EXCLUDE_RTSP)
    /**
     * 551 Option not supported (RTSP).
     */
    kHTTPStatusCodeOptionNotSupported = 551,
#endif

    /**
     * 598 Network read timeout error (Unknown).
     */
    kHTTPStatusCodeNetworkReadTimeoutError = 598,
    
    /**
     * 599 Network connect timeout error (Unknown).
     */
    kHTTPStatusCodeNetworkConnectTimeoutError = 599
}
HTTPStatusCode;


#endif
