Module: Rack::Cloudflare::IPs

Defined in:
lib/rack/cloudflare/ips.rb

Constant Summary collapse

V4_URL =
'https://www.cloudflare.com/ips-v4'
V6_URL =
'https://www.cloudflare.com/ips-v6'
V4 =
read("#{__dir__}/../../../data/ips_v4.txt")
V6 =
read("#{__dir__}/../../../data/ips_v6.txt")
PRIVATE =
parse('10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16')
DEFAULTS =
V4 + V6

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.listObject

List of IPs to reference



15
16
17
# File 'lib/rack/cloudflare/ips.rb', line 15

def list
  @list
end

Class Method Details

.fetch(url) ⇒ Object



26
27
28
29
30
31
32
# File 'lib/rack/cloudflare/ips.rb', line 26

def fetch(url)
  Cloudflare.info "[#{name}] Updating Cloudflare IP list: #{url.inspect}"
  parse URI(url).read
rescue OpenURI::HTTPError => ex
  Cloudflare.error "[#{name}] #{ex.class.name} fetching #{url.inspect}: #{ex.message}"
  []
end

.parse(string) ⇒ Object



38
39
40
41
42
# File 'lib/rack/cloudflare/ips.rb', line 38

def parse(string)
  return [] if string.to_s.strip.empty?

  string.strip.split(/[,\s]+/).map { |ip| ::IPAddr.new(ip.strip) }
end

.private?(ip) ⇒ Boolean

Returns:

  • (Boolean)


17
18
19
# File 'lib/rack/cloudflare/ips.rb', line 17

def private?(ip)
  PRIVATE.any? { |range| range.include? ip }
end

.read(filename) ⇒ Object



34
35
36
# File 'lib/rack/cloudflare/ips.rb', line 34

def read(filename)
  parse ::File.read(filename)
end

.update!Object

Update list of IPs in-memory in case local copy is outdated



22
23
24
# File 'lib/rack/cloudflare/ips.rb', line 22

def update!
  self.list = fetch(V4_URL) + fetch(V6_URL)
end