Class: Rack::Dedos::Filters::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/dedos/filters/base.rb

Direct Known Subclasses

Country, Spamhaus, UserAgent

Constant Summary collapse

DEFAULT_OPTIONS =
{
  logger: nil,
  cache_url: 'Hash',
  cache_key_prefix: nil,
  only_paths: [],
  except_paths: [],
  status: 403,
  text: 'Forbidden (Temporarily Blocked by Rules)',
  headers: []
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Base

Returns a new instance of Base.

Parameters:

  • app (#call)
  • options (Hash{Symbol => Object}) (defaults to: {})


25
26
27
28
29
30
31
32
33
34
# File 'lib/rack/dedos/filters/base.rb', line 25

def initialize(app, options={})
  @app = app
  @options = DEFAULT_OPTIONS.merge(options)
  @cache = Cache.new(
    url: @options[:cache_url],
    key_prefix: @options[:cache_key_prefix]
  )
  @logger ||= options[:logger] || ::Logger.new($stdout, progname: 'rack-dedos')
  @details = {}
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



21
22
23
# File 'lib/rack/dedos/filters/base.rb', line 21

def app
  @app
end

#cacheObject (readonly)

Returns the value of attribute cache.



21
22
23
# File 'lib/rack/dedos/filters/base.rb', line 21

def cache
  @cache
end

#detailsObject (readonly)

Returns the value of attribute details.



21
22
23
# File 'lib/rack/dedos/filters/base.rb', line 21

def details
  @details
end

#loggerObject (readonly)

Returns the value of attribute logger.



21
22
23
# File 'lib/rack/dedos/filters/base.rb', line 21

def logger
  @logger
end

#optionsObject (readonly)

Returns the value of attribute options.



21
22
23
# File 'lib/rack/dedos/filters/base.rb', line 21

def options
  @options
end

Instance Method Details

#call(env) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/rack/dedos/filters/base.rb', line 36

def call(env)
  request = Rack::Request.new(env)
  ip = real_ip(request)
  if !apply?(request) || allowed?(request, ip)
    app.call(env)
  else
    message = ["request #{request.path} from #{ip} blocked by #{name}"]
    message += details_list
    message += headers_list(request)
    logger.info(message.join(' '))
    [options[:status], { 'Content-Type' => 'text/plain' }, [options[:text]]]
  end
end