diff options
author | Bryan Helmkamp <bryan@brynary.com> | 2010-07-19 13:33:26 -0700 |
---|---|---|
committer | wycats <wycats@gmail.com> | 2010-07-19 13:44:43 -0700 |
commit | e466354edb31f243899051e2119f4ce72bafd5f3 (patch) | |
tree | d1d72ea1b372e3fd6749fcd596b55c4efe1c31d2 /actionpack/lib/action_dispatch/http/parameter_filter.rb | |
parent | 202fb79e8686ee127fe49497c979cfc9c9d985d5 (diff) | |
download | rails-e466354edb31f243899051e2119f4ce72bafd5f3.tar.gz rails-e466354edb31f243899051e2119f4ce72bafd5f3.tar.bz2 rails-e466354edb31f243899051e2119f4ce72bafd5f3.zip |
Extract ParameterFilter class from FilterParameters mixin
Signed-off-by: wycats <wycats@gmail.com>
Diffstat (limited to 'actionpack/lib/action_dispatch/http/parameter_filter.rb')
-rw-r--r-- | actionpack/lib/action_dispatch/http/parameter_filter.rb | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/http/parameter_filter.rb b/actionpack/lib/action_dispatch/http/parameter_filter.rb new file mode 100644 index 0000000000..1480e8f77c --- /dev/null +++ b/actionpack/lib/action_dispatch/http/parameter_filter.rb @@ -0,0 +1,72 @@ +module ActionDispatch + module Http + class ParameterFilter + + def initialize(filters) + @filters = filters + end + + def filter(params) + if enabled? + compiled_filter.call(params) + else + params.dup + end + end + + private + + def enabled? + @filters.present? + end + + def compiled_filter + @compiled_filter ||= begin + regexps, blocks = compile_filter + + lambda do |original_params| + filtered_params = {} + + original_params.each do |key, value| + if regexps.find { |r| key =~ r } + value = '[FILTERED]' + elsif value.is_a?(Hash) + value = filter(value) + elsif value.is_a?(Array) + value = value.map { |v| v.is_a?(Hash) ? filter(v) : v } + elsif blocks.present? + key = key.dup + value = value.dup if value.duplicable? + blocks.each { |b| b.call(key, value) } + end + + filtered_params[key] = value + end + + filtered_params + end + end + end + + def compile_filter + strings, regexps, blocks = [], [], [] + + @filters.each do |item| + case item + when NilClass + when Proc + blocks << item + when Regexp + regexps << item + else + strings << item.to_s + end + end + + regexps << Regexp.new(strings.join('|'), true) unless strings.empty? + [regexps, blocks] + end + + end + end +end |