diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2016-08-10 09:57:07 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-10 09:57:07 -0700 |
commit | 79e27b909ea983a4bec6d246ad23e77c5a2e47f4 (patch) | |
tree | 23160166668ec587f049ad9cb2a4c35f331e9e89 /actionpack/lib/action_dispatch | |
parent | dfb246118afbc6b59f6517eaed00208aa6c7e4b5 (diff) | |
parent | 496d744fa31665de810b404de968ba86ed87c319 (diff) | |
download | rails-79e27b909ea983a4bec6d246ad23e77c5a2e47f4.tar.gz rails-79e27b909ea983a4bec6d246ad23e77c5a2e47f4.tar.bz2 rails-79e27b909ea983a4bec6d246ad23e77c5a2e47f4.zip |
Merge pull request #26092 from kerrizor/kerrizor/force-param-encoding
Allow specifying encoding of parameters by action
Diffstat (limited to 'actionpack/lib/action_dispatch')
-rw-r--r-- | actionpack/lib/action_dispatch/http/parameters.rb | 16 | ||||
-rw-r--r-- | actionpack/lib/action_dispatch/http/request.rb | 1 | ||||
-rw-r--r-- | actionpack/lib/action_dispatch/testing/assertions/routing.rb | 2 |
3 files changed, 18 insertions, 1 deletions
diff --git a/actionpack/lib/action_dispatch/http/parameters.rb b/actionpack/lib/action_dispatch/http/parameters.rb index f25e50f9f3..a9d1a501ab 100644 --- a/actionpack/lib/action_dispatch/http/parameters.rb +++ b/actionpack/lib/action_dispatch/http/parameters.rb @@ -37,11 +37,23 @@ module ActionDispatch query_parameters.dup end params.merge!(path_parameters) + params = set_custom_encoding(params) set_header("action_dispatch.request.parameters", params) params end alias :params :parameters + def set_custom_encoding(params) + action = params[:action] + params.each do |k, v| + if v.is_a?(String) && v.encoding != encoding_template(action, k) + params[k] = v.force_encoding(encoding_template(action, k)) + end + end + + params + end + def path_parameters=(parameters) #:nodoc: delete_header("action_dispatch.request.parameters") @@ -64,6 +76,10 @@ module ActionDispatch private + def encoding_template(action, param) + controller_class.encoding_for_param(action, param) + end + def parse_formatted_parameters(parsers) return yield if content_length.zero? || content_mime_type.nil? diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb index 46409a325e..e7cc6d5f31 100644 --- a/actionpack/lib/action_dispatch/http/request.rb +++ b/actionpack/lib/action_dispatch/http/request.rb @@ -69,6 +69,7 @@ module ActionDispatch PASS_NOT_FOUND = Class.new { # :nodoc: def self.action(_); self; end def self.call(_); [404, {"X-Cascade" => "pass"}, []]; end + def self.encoding_for_param(action, param); ::Encoding::UTF_8; end } def controller_class diff --git a/actionpack/lib/action_dispatch/testing/assertions/routing.rb b/actionpack/lib/action_dispatch/testing/assertions/routing.rb index cba67b2839..2ea4a6c130 100644 --- a/actionpack/lib/action_dispatch/testing/assertions/routing.rb +++ b/actionpack/lib/action_dispatch/testing/assertions/routing.rb @@ -184,7 +184,7 @@ module ActionDispatch end # Assume given controller - request = ActionController::TestRequest.create + request = ActionController::TestRequest.create @controller.class if path =~ %r{://} fail_on(URI::InvalidURIError, msg) do |