Class: TranslationCms::HandleInvalidPercentEncoding

Inherits:
Object
  • Object
show all
Defined in:
lib/translation_cms/handle_invalid_percent_encoding.rb

Constant Summary collapse

DEFAULT_CONTENT_TYPE =
'text/html'
DEFAULT_CHARSET =
ActionDispatch::Response.default_charset

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, stdout = STDOUT) ⇒ HandleInvalidPercentEncoding

Returns a new instance of HandleInvalidPercentEncoding.



13
14
15
16
# File 'lib/translation_cms/handle_invalid_percent_encoding.rb', line 13

def initialize(app, stdout = STDOUT)
  @app = app
  @logger = defined?(Rails.logger) ? Rails.logger : Logger.new(stdout)
end

Instance Attribute Details

#loggerObject (readonly)

Returns the value of attribute logger.



11
12
13
# File 'lib/translation_cms/handle_invalid_percent_encoding.rb', line 11

def logger
  @logger
end

Instance Method Details

#call(env) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/translation_cms/handle_invalid_percent_encoding.rb', line 18

def call(env)
  # calling env.dup here prevents bad things from happening
  request = ActionDispatch::Request.new(env.dup)
  # calling request.params is sufficient to trigger the error
  # see https://github.com/rack/rack/issues/337#issuecomment-46453404
  request.params
  @app.call(env)
rescue ArgumentError => e
  raise unless e.message =~ /invalid %-encoding/

  message = "BAD REQUEST: Returning 400 due to #{e.message} from request with env #{request.inspect}"
  logger.info message
  content_type = request.formats.first || DEFAULT_CONTENT_TYPE
  status = 400
  body   = 'Bad Request'
  [
    status,
    {
      'Content-Type' => "#{content_type}; charset=#{DEFAULT_CHARSET}",
      'Content-Length' => body.bytesize.to_s
    },
    [body]
  ]
end