2020-10-09 18:33:16 +03:00
|
|
|
// Copyright (c) 2020 Justin E. Jones. All rights reserved.
|
|
|
|
// Use of this source code is governed by an MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
|
|
|
module http
|
|
|
|
|
2021-06-14 10:08:41 +03:00
|
|
|
// The status codes listed here are based on the comprehensive list,
|
2020-10-09 18:33:16 +03:00
|
|
|
// available at:
|
|
|
|
// https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
|
|
|
|
pub enum Status {
|
|
|
|
unknown = -1
|
|
|
|
unassigned = 0
|
|
|
|
cont = 100
|
|
|
|
switching_protocols = 101
|
|
|
|
processing = 102
|
|
|
|
checkpoint_draft = 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_choices = 300
|
|
|
|
moved_permanently = 301
|
|
|
|
found = 302
|
|
|
|
see_other = 303
|
|
|
|
not_modified = 304
|
|
|
|
use_proxy = 305
|
|
|
|
switch_proxy = 306
|
|
|
|
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
|
|
|
|
request_entity_too_large = 413
|
|
|
|
request_uri_too_long = 414
|
|
|
|
unsupported_media_type = 415
|
|
|
|
requested_range_not_satisfiable = 416
|
|
|
|
expectation_failed = 417
|
|
|
|
im_a_teapot = 418
|
|
|
|
misdirected_request = 421
|
|
|
|
unprocessable_entity = 422
|
|
|
|
locked = 423
|
|
|
|
failed_dependency = 424
|
|
|
|
unordered_collection = 425
|
|
|
|
upgrade_required = 426
|
|
|
|
precondition_required = 428
|
|
|
|
too_many_requests = 429
|
|
|
|
request_header_fields_too_large = 431
|
|
|
|
unavailable_for_legal_reasons = 451
|
|
|
|
client_closed_request = 499
|
|
|
|
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
|
|
|
|
bandwidth_limit_exceeded = 509
|
|
|
|
not_extended = 510
|
|
|
|
network_authentication_required = 511
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn status_from_int(code int) Status {
|
|
|
|
return match code {
|
|
|
|
100 { Status.cont }
|
|
|
|
101 { Status.switching_protocols }
|
|
|
|
102 { Status.processing }
|
|
|
|
103 { Status.checkpoint_draft }
|
|
|
|
104...199 { Status.unassigned }
|
|
|
|
200 { Status.ok }
|
|
|
|
201 { Status.created }
|
|
|
|
202 { Status.accepted }
|
|
|
|
203 { Status.non_authoritative_information }
|
|
|
|
204 { Status.no_content }
|
|
|
|
205 { Status.reset_content }
|
|
|
|
206 { Status.partial_content }
|
|
|
|
207 { Status.multi_status }
|
|
|
|
208 { Status.already_reported }
|
|
|
|
209...225 { Status.unassigned }
|
|
|
|
226 { Status.im_used }
|
|
|
|
227...299 { Status.unassigned }
|
|
|
|
300 { Status.multiple_choices }
|
|
|
|
301 { Status.moved_permanently }
|
|
|
|
302 { Status.found }
|
|
|
|
303 { Status.see_other }
|
|
|
|
304 { Status.not_modified }
|
|
|
|
305 { Status.use_proxy }
|
|
|
|
306 { Status.switch_proxy }
|
|
|
|
307 { Status.temporary_redirect }
|
|
|
|
308 { Status.permanent_redirect }
|
|
|
|
309...399 { Status.unassigned }
|
|
|
|
400 { Status.bad_request }
|
|
|
|
401 { Status.unauthorized }
|
|
|
|
402 { Status.payment_required }
|
|
|
|
403 { Status.forbidden }
|
|
|
|
404 { Status.not_found }
|
|
|
|
405 { Status.method_not_allowed }
|
|
|
|
406 { Status.not_acceptable }
|
|
|
|
407 { Status.proxy_authentication_required }
|
|
|
|
408 { Status.request_timeout }
|
|
|
|
409 { Status.conflict }
|
|
|
|
410 { Status.gone }
|
|
|
|
411 { Status.length_required }
|
|
|
|
412 { Status.precondition_failed }
|
|
|
|
413 { Status.request_entity_too_large }
|
|
|
|
414 { Status.request_uri_too_long }
|
|
|
|
415 { Status.unsupported_media_type }
|
|
|
|
416 { Status.requested_range_not_satisfiable }
|
|
|
|
417 { Status.expectation_failed }
|
|
|
|
418 { Status.im_a_teapot }
|
|
|
|
419...420 { Status.unassigned }
|
|
|
|
421 { Status.misdirected_request }
|
|
|
|
422 { Status.unprocessable_entity }
|
|
|
|
423 { Status.locked }
|
|
|
|
424 { Status.failed_dependency }
|
|
|
|
425 { Status.unordered_collection }
|
|
|
|
426 { Status.upgrade_required }
|
|
|
|
428 { Status.precondition_required }
|
|
|
|
429 { Status.too_many_requests }
|
|
|
|
431 { Status.request_header_fields_too_large }
|
|
|
|
432...450 { Status.unassigned }
|
|
|
|
451 { Status.unavailable_for_legal_reasons }
|
|
|
|
452...499 { Status.unassigned }
|
|
|
|
500 { Status.internal_server_error }
|
|
|
|
501 { Status.not_implemented }
|
|
|
|
502 { Status.bad_gateway }
|
|
|
|
503 { Status.service_unavailable }
|
|
|
|
504 { Status.gateway_timeout }
|
|
|
|
505 { Status.http_version_not_supported }
|
|
|
|
506 { Status.variant_also_negotiates }
|
|
|
|
507 { Status.insufficient_storage }
|
|
|
|
508 { Status.loop_detected }
|
|
|
|
509 { Status.bandwidth_limit_exceeded }
|
|
|
|
510 { Status.not_extended }
|
|
|
|
511 { Status.network_authentication_required }
|
|
|
|
512...599 { Status.unassigned }
|
|
|
|
else { Status.unknown }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn (code Status) str() string {
|
|
|
|
return match code {
|
|
|
|
.cont { 'Continue' }
|
|
|
|
.switching_protocols { 'Switching Protocols' }
|
|
|
|
.processing { 'Processing' }
|
|
|
|
.checkpoint_draft { 'Checkpoint Draft' }
|
|
|
|
.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_choices { 'Multiple Choices' }
|
|
|
|
.moved_permanently { 'Moved Permanently' }
|
|
|
|
.found { 'Found' }
|
|
|
|
.see_other { 'See Other' }
|
|
|
|
.not_modified { 'Not Modified' }
|
|
|
|
.use_proxy { 'Use Proxy' }
|
|
|
|
.switch_proxy { 'Switch Proxy' }
|
|
|
|
.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 Required' }
|
|
|
|
.request_timeout { 'Request Timeout' }
|
|
|
|
.conflict { 'Conflict' }
|
|
|
|
.gone { 'Gone' }
|
|
|
|
.length_required { 'Length Required' }
|
|
|
|
.precondition_failed { 'Precondition Failed' }
|
|
|
|
.request_entity_too_large { 'Request Entity Too Large' }
|
|
|
|
.request_uri_too_long { 'Request URI Too Long' }
|
|
|
|
.unsupported_media_type { 'Unsupported Media Type' }
|
|
|
|
.requested_range_not_satisfiable { 'Requested Range Not Satisfiable' }
|
|
|
|
.expectation_failed { 'Expectation Failed' }
|
|
|
|
.im_a_teapot { 'Im a teapot' }
|
|
|
|
.misdirected_request { 'Misdirected Request' }
|
|
|
|
.unprocessable_entity { 'Unprocessable Entity' }
|
|
|
|
.locked { 'Locked' }
|
|
|
|
.failed_dependency { 'Failed Dependency' }
|
|
|
|
.unordered_collection { 'Unordered Collection' }
|
|
|
|
.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' }
|
|
|
|
.bandwidth_limit_exceeded { 'Bandwidth Limit Exceeded' }
|
|
|
|
.not_extended { 'Not Extended' }
|
|
|
|
.network_authentication_required { 'Network Authentication Required' }
|
|
|
|
.unassigned { 'Unassigned' }
|
|
|
|
else { 'Unknown' }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// int converts an assigned and known Status to its integral equivalent.
|
|
|
|
// if a Status is unknown or unassigned, this method will return zero
|
|
|
|
pub fn (code Status) int() int {
|
2021-06-14 10:08:41 +03:00
|
|
|
if code in [.unknown, .unassigned] {
|
|
|
|
return 0
|
|
|
|
}
|
2020-10-09 18:33:16 +03:00
|
|
|
return int(code)
|
|
|
|
}
|
|
|
|
|
|
|
|
// is_valid returns true if the status code is assigned and known
|
|
|
|
pub fn (code Status) is_valid() bool {
|
|
|
|
number := code.int()
|
|
|
|
return number >= 100 && number < 600
|
|
|
|
}
|
|
|
|
|
2021-06-14 10:08:41 +03:00
|
|
|
// is_error will return true if the status code represents either a client or
|
2020-10-09 18:33:16 +03:00
|
|
|
// a server error; otherwise will return false
|
|
|
|
pub fn (code Status) is_error() bool {
|
|
|
|
number := code.int()
|
|
|
|
return number >= 400 && number < 600
|
|
|
|
}
|
|
|
|
|
2021-06-14 10:08:41 +03:00
|
|
|
// is_success will return true if the status code represents either an
|
2020-10-09 18:33:16 +03:00
|
|
|
// informational, success, or redirection response; otherwise will return false
|
|
|
|
pub fn (code Status) is_success() bool {
|
|
|
|
number := code.int()
|
|
|
|
return number >= 100 && number < 400
|
|
|
|
}
|