1# encoding: utf-8
2"""
3This file is backported from Python 3.5 http built-in module.
4"""
5
6from enum import IntEnum
7
8
9class HTTPStatus(IntEnum):
10    """HTTP status codes and reason phrases
11
12    Status codes from the following RFCs are all observed:
13
14        * RFC 7231: Hypertext Transfer Protocol (HTTP/1.1), obsoletes 2616
15        * RFC 6585: Additional HTTP Status Codes
16        * RFC 3229: Delta encoding in HTTP
17        * RFC 4918: HTTP Extensions for WebDAV, obsoletes 2518
18        * RFC 5842: Binding Extensions to WebDAV
19        * RFC 7238: Permanent Redirect
20        * RFC 2295: Transparent Content Negotiation in HTTP
21        * RFC 2774: An HTTP Extension Framework
22    """
23
24    def __new__(cls, value, phrase, description=""):
25        obj = int.__new__(cls, value)
26        obj._value_ = value
27
28        obj.phrase = phrase
29        obj.description = description
30        return obj
31
32    def __str__(self):
33        return str(self.value)
34
35    # informational
36    CONTINUE = 100, "Continue", "Request received, please continue"
37    SWITCHING_PROTOCOLS = (
38        101,
39        "Switching Protocols",
40        "Switching to new protocol; obey Upgrade header",
41    )
42    PROCESSING = 102, "Processing"
43
44    # success
45    OK = 200, "OK", "Request fulfilled, document follows"
46    CREATED = 201, "Created", "Document created, URL follows"
47    ACCEPTED = (202, "Accepted", "Request accepted, processing continues off-line")
48    NON_AUTHORITATIVE_INFORMATION = (
49        203,
50        "Non-Authoritative Information",
51        "Request fulfilled from cache",
52    )
53    NO_CONTENT = 204, "No Content", "Request fulfilled, nothing follows"
54    RESET_CONTENT = 205, "Reset Content", "Clear input form for further input"
55    PARTIAL_CONTENT = 206, "Partial Content", "Partial content follows"
56    MULTI_STATUS = 207, "Multi-Status"
57    ALREADY_REPORTED = 208, "Already Reported"
58    IM_USED = 226, "IM Used"
59
60    # redirection
61    MULTIPLE_CHOICES = (
62        300,
63        "Multiple Choices",
64        "Object has several resources -- see URI list",
65    )
66    MOVED_PERMANENTLY = (
67        301,
68        "Moved Permanently",
69        "Object moved permanently -- see URI list",
70    )
71    FOUND = 302, "Found", "Object moved temporarily -- see URI list"
72    SEE_OTHER = 303, "See Other", "Object moved -- see Method and URL list"
73    NOT_MODIFIED = (304, "Not Modified", "Document has not changed since given time")
74    USE_PROXY = (
75        305,
76        "Use Proxy",
77        "You must use proxy specified in Location to access this resource",
78    )
79    TEMPORARY_REDIRECT = (
80        307,
81        "Temporary Redirect",
82        "Object moved temporarily -- see URI list",
83    )
84    PERMANENT_REDIRECT = (
85        308,
86        "Permanent Redirect",
87        "Object moved temporarily -- see URI list",
88    )
89
90    # client error
91    BAD_REQUEST = (400, "Bad Request", "Bad request syntax or unsupported method")
92    UNAUTHORIZED = (401, "Unauthorized", "No permission -- see authorization schemes")
93    PAYMENT_REQUIRED = (402, "Payment Required", "No payment -- see charging schemes")
94    FORBIDDEN = (403, "Forbidden", "Request forbidden -- authorization will not help")
95    NOT_FOUND = (404, "Not Found", "Nothing matches the given URI")
96    METHOD_NOT_ALLOWED = (
97        405,
98        "Method Not Allowed",
99        "Specified method is invalid for this resource",
100    )
101    NOT_ACCEPTABLE = (406, "Not Acceptable", "URI not available in preferred format")
102    PROXY_AUTHENTICATION_REQUIRED = (
103        407,
104        "Proxy Authentication Required",
105        "You must authenticate with this proxy before proceeding",
106    )
107    REQUEST_TIMEOUT = (408, "Request Timeout", "Request timed out; try again later")
108    CONFLICT = 409, "Conflict", "Request conflict"
109    GONE = (410, "Gone", "URI no longer exists and has been permanently removed")
110    LENGTH_REQUIRED = (411, "Length Required", "Client must specify Content-Length")
111    PRECONDITION_FAILED = (
112        412,
113        "Precondition Failed",
114        "Precondition in headers is false",
115    )
116    REQUEST_ENTITY_TOO_LARGE = (413, "Request Entity Too Large", "Entity is too large")
117    REQUEST_URI_TOO_LONG = (414, "Request-URI Too Long", "URI is too long")
118    UNSUPPORTED_MEDIA_TYPE = (
119        415,
120        "Unsupported Media Type",
121        "Entity body in unsupported format",
122    )
123    REQUESTED_RANGE_NOT_SATISFIABLE = (
124        416,
125        "Requested Range Not Satisfiable",
126        "Cannot satisfy request range",
127    )
128    EXPECTATION_FAILED = (
129        417,
130        "Expectation Failed",
131        "Expect condition could not be satisfied",
132    )
133    UNPROCESSABLE_ENTITY = 422, "Unprocessable Entity"
134    LOCKED = 423, "Locked"
135    FAILED_DEPENDENCY = 424, "Failed Dependency"
136    UPGRADE_REQUIRED = 426, "Upgrade Required"
137    PRECONDITION_REQUIRED = (
138        428,
139        "Precondition Required",
140        "The origin server requires the request to be conditional",
141    )
142    TOO_MANY_REQUESTS = (
143        429,
144        "Too Many Requests",
145        "The user has sent too many requests in "
146        'a given amount of time ("rate limiting")',
147    )
148    REQUEST_HEADER_FIELDS_TOO_LARGE = (
149        431,
150        "Request Header Fields Too Large",
151        "The server is unwilling to process the request because its header "
152        "fields are too large",
153    )
154
155    # server errors
156    INTERNAL_SERVER_ERROR = (
157        500,
158        "Internal Server Error",
159        "Server got itself in trouble",
160    )
161    NOT_IMPLEMENTED = (501, "Not Implemented", "Server does not support this operation")
162    BAD_GATEWAY = (502, "Bad Gateway", "Invalid responses from another server/proxy")
163    SERVICE_UNAVAILABLE = (
164        503,
165        "Service Unavailable",
166        "The server cannot process the request due to a high load",
167    )
168    GATEWAY_TIMEOUT = (
169        504,
170        "Gateway Timeout",
171        "The gateway server did not receive a timely response",
172    )
173    HTTP_VERSION_NOT_SUPPORTED = (
174        505,
175        "HTTP Version Not Supported",
176        "Cannot fulfill request",
177    )
178    VARIANT_ALSO_NEGOTIATES = 506, "Variant Also Negotiates"
179    INSUFFICIENT_STORAGE = 507, "Insufficient Storage"
180    LOOP_DETECTED = 508, "Loop Detected"
181    NOT_EXTENDED = 510, "Not Extended"
182    NETWORK_AUTHENTICATION_REQUIRED = (
183        511,
184        "Network Authentication Required",
185        "The client needs to authenticate to gain network access",
186    )
187