Skip to content

Instantly share code, notes, and snippets.

@mlanett
Last active March 21, 2024 09:56
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
@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

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