# Public constants

enum {
	CONTINUE = 100
	SWITCHING_PROTOCOLS = 101
	PROCESSING = 102
	EARLY_HINTS = 103
	OK = 200
	CREATED = 201
	ACCEPTED = 202
	NON_AUTHORITATIVE_INFORMATION = 203
	NO_CONTENT = 204
	RESET_CONTENT = 205
	PARTIAL_CONTENT = 206
	MULTI_STATUS = 207
	ALREADY_REPORTED = 208
	IM_USED = 226
	MULTIPLE_CHOICE = 300
	MOVED_PERMANENTLY = 301
	FOUND = 302
	SEE_OTHER = 303
	NOT_MODIFIED = 304
	TEMPORARY_REDIRECT = 307
	PERMANENT_REDIRECT = 308
	BAD_REQUEST = 400
	UNAUTHORIZED = 401
	PAYMENT_REQUIRED = 402
	FORBIDDEN = 403
	NOT_FOUND = 404
	METHOD_NOT_ALLOWED = 405
	NOT_ACCEPTABLE = 406
	PROXY_AUTHENTICATION_REQUIRED = 407
	REQUEST_TIMEOUT = 408
	CONFLICT = 409
	GONE = 410
	LENGTH_REQUIRED = 411
	PRECONDITION_FAILED = 412
	PAYLOAD_TOO_LARGE = 413
	URI_TOO_LONG = 414
	UNSUPPORTED_MEDIA_TYPE = 415
	RANGE_NOT_SATISFIABLE = 416
	EXPECTATION_FAILED = 417
	IM_A_TEAPOT = 418
	MISDIRECTED_REQUEST = 421
	UNPROCESSABLE_ENTITY = 422
	LOCKED = 423
	FAILED_DEPENDENCY = 424
	TOO_EARLY = 425
	UPGRADE_REQUIRED = 426
	PRECONDITION_REQUIRED = 428
	TOO_MANY_REQUESTS = 429
	REQUEST_HEADER_FIELDS_TOO_LARGE = 431
	UNAVAILABLE_FOR_LEGAL_REASONS = 451
	INTERNAL_SERVER_ERROR = 500
	NOT_IMPLEMENTED = 501
	BAD_GATEWAY = 502
	SERVICE_UNAVAILABLE = 503
	GATEWAY_TIMEOUT = 504
	HTTP_VERSION_NOT_SUPPORTED = 505
	VARIANT_ALSO_NEGOTIATES = 506
	INSUFFICIENT_STORAGE = 507
	LOOP_DETECTED = 508
	NOT_EXTENDED = 510
	NETWORK_AUTHENTICATION_REQUIRED = 511
}


# Private constants

const __DESCRIPTIONS: Dictionary = {
	CONTINUE: "Continue",
	SWITCHING_PROTOCOLS: "Switching Protocols",
	PROCESSING: "Processing",
	EARLY_HINTS: "Early Hints",
	OK: "Ok",
	CREATED: "Created",
	ACCEPTED: "Accepted",
	NON_AUTHORITATIVE_INFORMATION: "Non-Authoritative Information",
	NO_CONTENT: "No Content",
	RESET_CONTENT: "Reset Content",
	PARTIAL_CONTENT: "Partial Content",
	MULTI_STATUS: "Multi-Status",
	ALREADY_REPORTED: "Already Reported",
	IM_USED: "IM Used",
	MULTIPLE_CHOICE: "Multiple Choice",
	MOVED_PERMANENTLY: "Moved Permanently",
	FOUND: "Found",
	SEE_OTHER: "See Other",
	NOT_MODIFIED: "Not Modified",
	TEMPORARY_REDIRECT: "Temporary Redirect",
	PERMANENT_REDIRECT: "Permanent Redirect",
	BAD_REQUEST: "Bad Request",
	UNAUTHORIZED: "Unauthorized",
	PAYMENT_REQUIRED: "Payment Required",
	FORBIDDEN: "Forbidden",
	NOT_FOUND: "Not Found",
	METHOD_NOT_ALLOWED: "Method Not Allowed",
	NOT_ACCEPTABLE: "Not Acceptable",
	PROXY_AUTHENTICATION_REQUIRED: "Proxy Authentication Requested",
	REQUEST_TIMEOUT: "Request Timeout",
	CONFLICT: "Conflict",
	GONE: "Gone",
	LENGTH_REQUIRED: "Length Required",
	PRECONDITION_FAILED: "Precondition Failed",
	PAYLOAD_TOO_LARGE: "Payload Too Large",
	URI_TOO_LONG: "URI Too long",
	UNSUPPORTED_MEDIA_TYPE: "Unsupported Media Type",
	RANGE_NOT_SATISFIABLE: "Range Not Satisfiable",
	EXPECTATION_FAILED: "Expectation Failed",
	IM_A_TEAPOT: "I'm A Teapot",
	MISDIRECTED_REQUEST: "Misdirected Request",
	UNPROCESSABLE_ENTITY: "Unprocessable Entity",
	LOCKED: "Locked",
	FAILED_DEPENDENCY: "Failed Dependency",
	TOO_EARLY: "Too Early",
	UPGRADE_REQUIRED: "Upgrade Required",
	PRECONDITION_REQUIRED: "Precondition Required",
	TOO_MANY_REQUESTS: "Too Many Requests",
	REQUEST_HEADER_FIELDS_TOO_LARGE: "Request Header Fields Too Large",
	UNAVAILABLE_FOR_LEGAL_REASONS: "Unavailable For Legal Reasons",
	INTERNAL_SERVER_ERROR: "Internal Server Error",
	NOT_IMPLEMENTED: "Not Implemented",
	BAD_GATEWAY: "Bad Gateway",
	SERVICE_UNAVAILABLE: "Service Unavailable",
	GATEWAY_TIMEOUT: "Gateway Timeout",
	HTTP_VERSION_NOT_SUPPORTED: "HTTP Version Not Supported",
	VARIANT_ALSO_NEGOTIATES: "Variant Also Negotiates",
	INSUFFICIENT_STORAGE: "Insufficient Storage",
	LOOP_DETECTED: "Loop detected",
	NOT_EXTENDED: "Not Extended",
	NETWORK_AUTHENTICATION_REQUIRED: "Network Authentication Required",
}


# Public methods

static func code_to_description(code: int) -> String:
	return __DESCRIPTIONS[code]


static func code_to_identifier(code: int) -> String:
	return code_to_description(code).to_upper().replace(" ", "_").replace("'", "")


static func code_to_status_line(code: int) -> String:
	return "HTTP/1.1 %d %s" % [code, code_to_identifier(code)]

