http: fix status codes (#6590)
parent
36706126fd
commit
04d3ca7dbe
|
@ -13,6 +13,7 @@ const (
|
||||||
// 'vlib/v/gen/js/jsgen_test.v',
|
// 'vlib/v/gen/js/jsgen_test.v',
|
||||||
'vlib/net/http/cookie_test.v',
|
'vlib/net/http/cookie_test.v',
|
||||||
'vlib/net/http/http_test.v',
|
'vlib/net/http/http_test.v',
|
||||||
|
'vlib/net/http/status_test.v',
|
||||||
'vlib/net/websocket/ws_test.v',
|
'vlib/net/websocket/ws_test.v',
|
||||||
'vlib/sqlite/sqlite_test.v',
|
'vlib/sqlite/sqlite_test.v',
|
||||||
'vlib/orm/orm_test.v',
|
'vlib/orm/orm_test.v',
|
||||||
|
|
|
@ -0,0 +1,253 @@
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// The status codes listed here are based on the comprehensive list,
|
||||||
|
// 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 {
|
||||||
|
if code in [.unknown, .unassigned] { return 0 }
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
// is_error will return true if the status code represents either a client or
|
||||||
|
// a server error; otherwise will return false
|
||||||
|
pub fn (code Status) is_error() bool {
|
||||||
|
number := code.int()
|
||||||
|
return number >= 400 && number < 600
|
||||||
|
}
|
||||||
|
|
||||||
|
// is_success will return true if the status code represents either an
|
||||||
|
// informational, success, or redirection response; otherwise will return false
|
||||||
|
pub fn (code Status) is_success() bool {
|
||||||
|
number := code.int()
|
||||||
|
return number >= 100 && number < 400
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
module http
|
||||||
|
|
||||||
|
fn test_str() {
|
||||||
|
code := Status.bad_gateway
|
||||||
|
actual := code.str()
|
||||||
|
assert actual == 'Bad Gateway'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_int() {
|
||||||
|
code := Status.see_other
|
||||||
|
actual := code.int()
|
||||||
|
assert actual == 303
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_is_valid() {
|
||||||
|
code := Status.gateway_timeout
|
||||||
|
actual := code.is_valid()
|
||||||
|
assert actual == true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_is_valid_negative() {
|
||||||
|
code := Status.unassigned
|
||||||
|
actual := code.is_valid()
|
||||||
|
assert actual == false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_is_error() {
|
||||||
|
code := Status.too_many_requests
|
||||||
|
actual := code.is_error()
|
||||||
|
assert actual == true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_is_error_negative() {
|
||||||
|
code := Status.cont
|
||||||
|
actual := code.is_error()
|
||||||
|
assert actual == false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_is_success() {
|
||||||
|
code := Status.accepted
|
||||||
|
actual := code.is_success()
|
||||||
|
assert actual == true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_is_success_negative() {
|
||||||
|
code := Status.forbidden
|
||||||
|
actual := code.is_success()
|
||||||
|
assert actual == false
|
||||||
|
}
|
Loading…
Reference in New Issue