Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
HTTP status code symbols for Rails
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 :request_entity_too_large
414 :request_uri_too_long
415 :unsupported_media_type
416 :requested_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
@g8d3

This comment has been minimized.

Copy link

@g8d3 g8d3 commented Aug 4, 2016

Is not there a map inside Rails?

@g8d3

This comment has been minimized.

Copy link

@g8d3 g8d3 commented Aug 4, 2016

Found Rack::Utils::HTTP_STATUS_CODES.

@AlexVPopov

This comment has been minimized.

Copy link

@AlexVPopov AlexVPopov commented Aug 5, 2016

@juanpastas In Rack::Utils you also have SYMBOL_TO_STATUS_CODE,which matches the symbol names to the numeric values.

@cesc1989

This comment has been minimized.

Copy link

@cesc1989 cesc1989 commented Sep 15, 2016

Cool. Never used them because didn't take the time to find the list. Gonna fork this. Thanks a lot.

@richpeck

This comment has been minimized.

Copy link

@richpeck richpeck commented Aug 24, 2017

@artur-beljajev

This comment has been minimized.

Copy link

@artur-beljajev artur-beljajev commented Aug 3, 2019

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}

@elissonmichael

This comment has been minimized.

Copy link

@elissonmichael elissonmichael commented Oct 22, 2019

Thanks for sharing this.

@tvillafane

This comment has been minimized.

Copy link

@tvillafane tvillafane commented Dec 7, 2019

(Rails 5.1.4) 416 is wrong. :requested_range_not_satisfiable -> :range_not_satisfiable corrects it.

@EthanML

This comment has been minimized.

Copy link

@EthanML EthanML commented Jan 10, 2020

413 is also wrong now - it should be: :payload_too_large.

@artemgurzhii

This comment has been minimized.

Copy link

@artemgurzhii artemgurzhii commented Feb 17, 2020

429: Too Many Requests

@khiav223577

This comment has been minimized.

Copy link

@khiav223577 khiav223577 commented Apr 18, 2020

@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.

@danielricecodes

This comment has been minimized.

Copy link

@danielricecodes danielricecodes commented May 11, 2020

This really ought to be in the official Rails Guides.

@liondancer

This comment has been minimized.

Copy link

@liondancer liondancer commented May 14, 2020

@piharpi

This comment has been minimized.

Copy link

@piharpi piharpi commented Jul 9, 2020

@liondancer 👀️ yeah,,, we must put it here

@piharpi

This comment has been minimized.

Copy link

@piharpi piharpi commented Jul 9, 2020

@reginadiana

This comment has been minimized.

Copy link

@reginadiana reginadiana commented Aug 13, 2020

OMGGG thanks

@aesyondu

This comment has been minimized.

Copy link

@aesyondu aesyondu commented Aug 24, 2020

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)

@alexsmartens

This comment has been minimized.

Copy link

@alexsmartens alexsmartens commented Feb 5, 2021

is it possible to include a custom error message statusText with the response?

@Arsen7

This comment has been minimized.

Copy link

@Arsen7 Arsen7 commented Feb 17, 2021

@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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment