Skip to content

Instantly share code, notes, and snippets.

@mlanett
Last active November 4, 2024 18:04
Show Gist options
  • Save mlanett/a31c340b132ddefa9cca to your computer and use it in GitHub Desktop.
Save mlanett/a31c340b132ddefa9cca to your computer and use it in GitHub Desktop.
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 :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
@g8d3
Copy link

g8d3 commented Aug 4, 2016

Is not there a map inside Rails?

@g8d3
Copy link

g8d3 commented Aug 4, 2016

Found Rack::Utils::HTTP_STATUS_CODES.

@AlexVPopov
Copy link

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

@cesc1989
Copy link

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

@richpeck
Copy link

richpeck commented Aug 24, 2017

@artur-intech
Copy link

artur-intech 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
Copy link

Thanks for sharing this.

@tvillafane
Copy link

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

@EthanML
Copy link

EthanML commented Jan 10, 2020

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

@artemgurzhii
Copy link

429: Too Many Requests

@khiav223577
Copy link

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
Copy link

This really ought to be in the official Rails Guides.

@liondancer
Copy link

@piharpi
Copy link

piharpi commented Jul 9, 2020

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

@piharpi
Copy link

piharpi commented Jul 9, 2020

@reginadiana
Copy link

OMGGG thanks

@aesyondu
Copy link

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
Copy link

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

@Arsen7
Copy link

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.

@Zlatov
Copy link

Zlatov commented Aug 6, 2021

Missing an important one : https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/418

I support your remark!

@jschneid
Copy link

jschneid commented Feb 20, 2024

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)

@mlanett
Copy link
Author

mlanett commented Feb 20, 2024

Fixed :payload_too_large

@romiras
Copy link

romiras commented May 23, 2024

What about adding :too_many_requests (429) ?

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