class UTF8Cleaner::Middleware

Constants

SANITIZE_ENV_KEYS

Public Class Methods

new(app) click to toggle source
# File lib/utf8-cleaner/middleware.rb, line 16
def initialize(app)
 @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/utf8-cleaner/middleware.rb, line 20
def call(env)
 @app.call(sanitize_env(env))
end

Private Instance Methods

cleaned_string(value) click to toggle source
# File lib/utf8-cleaner/middleware.rb, line 63
def cleaned_string(value)
  value = tidy_bytes(value) unless value.ascii_only?
  value = URIString.new(value).cleaned if value.include?('%')
  value
end
sanitize_env(env) click to toggle source
# File lib/utf8-cleaner/middleware.rb, line 28
def sanitize_env(env)
  sanitize_env_keys(env)
  sanitize_env_rack_input(env)
  env
end
sanitize_env_keys(env) click to toggle source
# File lib/utf8-cleaner/middleware.rb, line 34
def sanitize_env_keys(env)
  SANITIZE_ENV_KEYS.each do |key|
    next unless value = env[key]
    env[key] = cleaned_string(value)
  end
end
sanitize_env_rack_input(env) click to toggle source
# File lib/utf8-cleaner/middleware.rb, line 41
def sanitize_env_rack_input(env)
  case env['CONTENT_TYPE']
  when 'application/x-www-form-urlencoded'
    # This data gets the full cleaning treatment
    cleaned_value = cleaned_string(env['rack.input'].read)
    env['rack.input'] = StringIO.new(cleaned_value) if cleaned_value
    env['rack.input'].rewind
  when 'application/json'
    # This data only gets cleaning of invalid UTF-8 (e.g. from another charset)
    # but we do not URI-decode it.
    rack_input = env['rack.input'].read
    if rack_input && !rack_input.ascii_only?
      env['rack.input'] = StringIO.new(tidy_bytes(rack_input))
    end
    env['rack.input'].rewind
  when 'multipart/form-data'
    # Don't process the data since it may contain binary content
  else
    # Unknown content type. Leave it alone
  end
end