-
-
Save mlanett/a31c340b132ddefa9cca to your computer and use it in GitHub Desktop.
HTTP status code symbols for Rails | |
Thanks to Cody Fauser for this list of HTTP responce codes and their Ruby on Rails symbol mappings. | |
Status Code Symbol | |
1xx Informational | |
100 :continue | |
101 :switching_protocols | |
102 :processing | |
2xx Success | |
200 :ok | |
201 :created | |
202 :accepted | |
203 :non_authoritative_information | |
204 :no_content | |
205 :reset_content | |
206 :partial_content | |
207 :multi_status | |
226 :im_used | |
3xx Redirection | |
300 :multiple_choices | |
301 :moved_permanently | |
302 :found | |
303 :see_other | |
304 :not_modified | |
305 :use_proxy | |
307 :temporary_redirect | |
4xx Client Error | |
400 :bad_request | |
401 :unauthorized | |
402 :payment_required | |
403 :forbidden | |
404 :not_found | |
405 :method_not_allowed | |
406 :not_acceptable | |
407 :proxy_authentication_required | |
408 :request_timeout | |
409 :conflict | |
410 :gone | |
411 :length_required | |
412 :precondition_failed | |
413 :payload_too_large | |
414 :uri_too_long | |
415 :unsupported_media_type | |
416 :range_not_satisfiable | |
417 :expectation_failed | |
422 :unprocessable_entity | |
423 :locked | |
424 :failed_dependency | |
426 :upgrade_required | |
5xx Server Error | |
500 :internal_server_error | |
501 :not_implemented | |
502 :bad_gateway | |
503 :service_unavailable | |
504 :gateway_timeout | |
505 :http_version_not_supported | |
507 :insufficient_storage | |
510 :not_extended |
Found Rack::Utils::HTTP_STATUS_CODES
.
@juanpastas In Rack::Utils you also have SYMBOL_TO_STATUS_CODE
,which matches the symbol names to the numeric values.
Cool. Never used them because didn't take the time to find the list. Gonna fork this. Thanks a lot.
No 3rd party code needed:
require 'net/http'
p Net::HTTPResponse::CODE_TO_OBJ
=> {"100"=>Net::HTTPContinue, "101"=>Net::HTTPSwitchProtocol, "200"=>Net::HTTPOK, "201"=>Net::HTTPCreated, "202"=>Net::HTTPAccepted, "203"=>Net::HTTPNonAuthoritativeInformation, "204"=>Net::HTTPNoContent, "205"=>Net::HTTPResetContent, "206"=>Net::HTTPPartialContent, "207"=>Net::HTTPMultiStatus, "226"=>Net::HTTPIMUsed, "300"=>Net::HTTPMultipleChoices, "301"=>Net::HTTPMovedPermanently, "302"=>Net::HTTPFound, "303"=>Net::HTTPSeeOther, "304"=>Net::HTTPNotModified, "305"=>Net::HTTPUseProxy, "307"=>Net::HTTPTemporaryRedirect, "308"=>Net::HTTPPermanentRedirect, "400"=>Net::HTTPBadRequest, "401"=>Net::HTTPUnauthorized, "402"=>Net::HTTPPaymentRequired, "403"=>Net::HTTPForbidden, "404"=>Net::HTTPNotFound, "405"=>Net::HTTPMethodNotAllowed, "406"=>Net::HTTPNotAcceptable, "407"=>Net::HTTPProxyAuthenticationRequired, "408"=>Net::HTTPRequestTimeOut, "409"=>Net::HTTPConflict, "410"=>Net::HTTPGone, "411"=>Net::HTTPLengthRequired, "412"=>Net::HTTPPreconditionFailed, "413"=>Net::HTTPRequestEntityTooLarge, "414"=>Net::HTTPRequestURITooLong, "415"=>Net::HTTPUnsupportedMediaType, "416"=>Net::HTTPRequestedRangeNotSatisfiable, "417"=>Net::HTTPExpectationFailed, "422"=>Net::HTTPUnprocessableEntity, "423"=>Net::HTTPLocked, "424"=>Net::HTTPFailedDependency, "426"=>Net::HTTPUpgradeRequired, "428"=>Net::HTTPPreconditionRequired, "429"=>Net::HTTPTooManyRequests, "431"=>Net::HTTPRequestHeaderFieldsTooLarge, "500"=>Net::HTTPInternalServerError, "501"=>Net::HTTPNotImplemented, "502"=>Net::HTTPBadGateway, "503"=>Net::HTTPServiceUnavailable, "504"=>Net::HTTPGatewayTimeOut, "505"=>Net::HTTPVersionNotSupported, "507"=>Net::HTTPInsufficientStorage, "511"=>Net::HTTPNetworkAuthenticationRequired}
Thanks for sharing this.
(Rails 5.1.4) 416 is wrong. :requested_range_not_satisfiable -> :range_not_satisfiable
corrects it.
413 is also wrong now - it should be: :payload_too_large
.
429: Too Many Requests
@juanpastas In Rack::Utils you also have
SYMBOL_TO_STATUS_CODE
,which matches the symbol names to the numeric values.
@AlexVPopov Thanks for sharing :)
I spent lots of time googling for it.
This really ought to be in the official Rails Guides.
Missing an important one : https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418
@liondancer 👀️ yeah,,, we must put it here
@danielricecodes already written in official Rails Guides
https://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option
OMGGG thanks
Documentation for generic status types are so hard to find.
Just leaving this here for future reference:
In rspec: https://relishapp.com/rspec/rspec-rails/docs/matchers/have-http-status-matcher
generic status type (:success, :missing, :redirect, or :error)
is it possible to include a custom error message statusText with the response?
@alexsmartens : It looks like no, it's not. Or at least it's not easy.
A few days ago I was trying to achieve exactly that. I had a nice idea, that you could pass a string for example in render plain: "BOO", status: '543 Server out of sugar'
as the status, and then it would return exactly that to the end user.
(I wanted the status text to be dynamic, so that each render might set it differently - for example providing translated statuses, in line with what all the relevant RFCs say. Merely adding another entry to the Rack::Utils::HTTP_STATUS_CODES was not good enough for me. But even that would not work.)
With these changes to the status_code
method in lib/rack/utils.rb
in the rack gem:
--- lib/rack/utils.rb-old
+++ lib/rack/utils.rb
@@ -578,9 +578,13 @@
[message.downcase.gsub(/\s|-|'/, '_').to_sym, code]
}.flatten]
+ STATUS_STRING_REGEXP = /\A([1-5][0-9][0-9]) (.+)\z/
+
def status_code(status)
if status.is_a?(Symbol)
SYMBOL_TO_STATUS_CODE.fetch(status) { raise ArgumentError, "Unrecognized status code #{status.inspect}" }
+ elsif status.is_a?(String) && status =~ STATUS_STRING_REGEXP
+ status
else
status.to_i
end
plus some changes to action_dispatch/http/response.rb
(from the ActionPack gem) and rack/response.rb
(from the Rack gem) so that they would not call to_i
on the status values in various stages, and so that they would read the "message" from that string-type status, some form of MVP was working. Maybe I needed also some more tiny changes, but I do not remember it now.
But then I got into Puma, where the status was again converted to integer, and the status text was being taken again from a hardcoded list of texts (same form as in rack/utils, but it's a separate code). At that point I gave up.
The coding itself looks trivial. The real problem lies in testing for backwards compatibility, and - this is the most terrifying part! - talking to various groups of people to accept these changes into their projects. 😱
If you feel brave enough, you may try to work on that.
Missing an important one : https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418
I support your remark!
As of Rails 4.2 (released in December 2014), the symbol for HTTP 413 is no longer :request_entity_too_large
. It is now :payload_too_large
.
There were a few other changes, too. Source: https://guides.rubyonrails.org/4_2_release_notes.html#changed-status-option-symbols-for-render
(I posted about this here: https://stackoverflow.com/q/78028946/12484)
Fixed :payload_too_large
What about adding :too_many_requests
(429) ?
Is not there a map inside Rails?