geo_redirect 0.7 → 0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f21f596f04cc22f8af21cd140c5e618c226a0f4
4
- data.tar.gz: 210880d4a407c0e7263c282d5c421a1a3661affb
3
+ metadata.gz: c58651ddf87594864c338eb864bf6261f3a95944
4
+ data.tar.gz: 87925e657c42ebb2fbff6b99d29cde408d70005e
5
5
  SHA512:
6
- metadata.gz: aaacd15e27321f27961ff90d82a6b9f7d637774d4f427aa67efe95b46a681c70ef28ae0ff06109d963e84b5335df9f551b4d89cd54954efb02bd006999d73b60
7
- data.tar.gz: bb5742370da7819f41579dcec891d52890dc9bbe0e7fdac7ab85c8e26d4153a9a76fa59258067a502c5f8357b72c509d9aa84da6298e3e656fbbd35eff13ec8d
6
+ metadata.gz: 4ee15d48c416bf22068a325c8e1c6d90d1f490f92673df68a2b5670de1edfdad7ff969f786e48c5d01807491a368c35eebb400d65ec0a57c8d223b0c8142d998
7
+ data.tar.gz: 7a2496a101a4c58700d89dac7542e29eb0d1baaa32cb2a9fd96bc194ab4635be13f1f8b822fbec77f8d66b0077121b49f364f688a83e418d57d90e5d8f829bb3
data/README.md CHANGED
@@ -20,7 +20,7 @@ URL, and by that forcing the server to host from the current domain (and saving
20
20
  that domain to the user's session variable).
21
21
 
22
22
  To skip geo-redirection completely, pass a `?skip_geo=true` argument (this would
23
- avoid saving any session value and/or HTTP redirects.
23
+ avoid saving any session value and/or HTTP redirects).
24
24
 
25
25
  ## Installation
26
26
 
@@ -20,51 +20,54 @@ module GeoRedirect
20
20
  end
21
21
 
22
22
  def call(env)
23
- @request = Rack::Request.new(env)
23
+ request = Rack::Request.new(env)
24
+ url = URI.parse(request.url)
24
25
 
25
- if skip_redirect?
26
- remember_host(request_host) if @options[:remember_when_skipping]
26
+ if skip_redirect?(request, url)
27
+ if @options[:remember_when_skipping]
28
+ remember_host(request, request_host(url))
29
+ end
27
30
  @app.call(env)
28
31
 
29
- elsif force_redirect?
30
- handle_force
32
+ elsif force_redirect?(url)
33
+ handle_force(request, url)
31
34
 
32
- elsif session_exists?
33
- handle_session
35
+ elsif session_exists?(request)
36
+ handle_session(request)
34
37
 
35
38
  else
36
- handle_geoip
39
+ handle_geoip(request)
37
40
  end
38
41
  end
39
42
 
40
- def session_exists?
41
- host = @request.session['geo_redirect']
43
+ def session_exists?(request)
44
+ host = request.session['geo_redirect']
42
45
  host = host.to_sym if host && host.respond_to?(:to_sym)
43
46
  if host && @config[host].nil? # Invalid var, remove it
44
47
  log 'Invalid session var, forgetting'
45
- forget_host(host)
48
+ forget_host(request, host)
46
49
  host = nil
47
50
  end
48
51
 
49
52
  !host.nil?
50
53
  end
51
54
 
52
- def handle_session
53
- host = @request.session['geo_redirect']
55
+ def handle_session(request)
56
+ host = request.session['geo_redirect']
54
57
  host = host.is_a?(Symbol) ? host : host.to_sym if host
55
58
  log "Handling session var: #{host}"
56
- redirect_request(host)
59
+ redirect_request(request, host)
57
60
  end
58
61
 
59
- def force_redirect?
60
- Rack::Utils.parse_query(request_url.query).key? 'redirect'
62
+ def force_redirect?(url)
63
+ Rack::Utils.parse_query(url.query).key? 'redirect'
61
64
  end
62
65
 
63
- def skip_redirect?
64
- query_includes_skip_geo?(request_url) ||
65
- path_not_whitelisted?(request_url) ||
66
- path_blacklisted?(request_url) ||
67
- skipped_by_block?
66
+ def skip_redirect?(request, url)
67
+ query_includes_skip_geo?(url) ||
68
+ path_not_whitelisted?(url) ||
69
+ path_blacklisted?(url) ||
70
+ skipped_by_block?(request)
68
71
  end
69
72
 
70
73
  def query_includes_skip_geo?(url)
@@ -73,51 +76,51 @@ module GeoRedirect
73
76
 
74
77
  def path_not_whitelisted?(url)
75
78
  !@include_paths.empty? &&
76
- !@include_paths.any? { |exclude| url.path == exclude }
79
+ @include_paths.none? { |include| url.path == include }
77
80
  end
78
81
 
79
82
  def path_blacklisted?(url)
80
83
  @exclude_paths.any? { |exclude| url.path == exclude }
81
84
  end
82
85
 
83
- def skipped_by_block?
84
- @options[:skip_if] && @options[:skip_if].call(@request)
86
+ def skipped_by_block?(request)
87
+ @options[:skip_if] && @options[:skip_if].call(request)
85
88
  end
86
89
 
87
- def handle_force
90
+ def handle_force(request, url)
88
91
  log 'Handling force flag'
89
- remember_host(request_host)
90
- redirect_request(request_url.host, true)
92
+ remember_host(request, request_host(url))
93
+ redirect_request(request, url.host, true)
91
94
  end
92
95
 
93
- def handle_geoip
94
- country = country_from_request rescue nil
95
- @request.session['geo_redirect.country'] = country
96
- log "GeoIP match: country code #{country}"
96
+ def handle_geoip(request)
97
+ country = country_from_request(request) rescue nil
98
+ request.session['geo_redirect.country'] = country
99
+ log "GeoIP match: country code #{country.inspect}"
97
100
 
98
101
  if country.nil?
99
- @app.call(@request.env)
102
+ @app.call(request.env)
100
103
  else
101
104
  host = host_by_country(country) # desired host
102
105
  log "GeoIP host match: #{host}"
103
- remember_host(host)
106
+ remember_host(request, host)
104
107
 
105
- redirect_request(host)
108
+ redirect_request(request, host)
106
109
  end
107
110
  end
108
111
 
109
- def redirect_request(host = nil, same_host = false)
112
+ def redirect_request(request, host = nil, same_host = false)
110
113
  hostname = hostname_by_host(host)
111
114
 
112
- if should_redirect?(hostname, same_host)
113
- url = redirect_url(hostname)
115
+ if should_redirect?(request, hostname, same_host)
116
+ url = redirect_url(request, hostname)
114
117
 
115
118
  log "Redirecting to #{url}"
116
119
  [301,
117
120
  { 'Location' => url.to_s, 'Content-Type' => 'text/plain' },
118
121
  ['Moved Permanently\n']]
119
122
  else
120
- @app.call(@request.env)
123
+ @app.call(request.env)
121
124
  end
122
125
  end
123
126
 
@@ -135,14 +138,14 @@ module GeoRedirect
135
138
  host.is_a?(Symbol) ? @config[host][:host] : host
136
139
  end
137
140
 
138
- def remember_host(host)
141
+ def remember_host(request, host)
139
142
  log "Remembering: #{host}"
140
- @request.session['geo_redirect'] = host
143
+ request.session['geo_redirect'] = host
141
144
  end
142
145
 
143
- def forget_host(host)
146
+ def forget_host(request, host)
144
147
  log "Forgetting: #{host}"
145
- remember_host(nil)
148
+ remember_host(request, nil)
146
149
  end
147
150
 
148
151
  protected
@@ -181,23 +184,19 @@ module GeoRedirect
181
184
  log(message, :error)
182
185
  end
183
186
 
184
- def request_ip
187
+ def request_ip(request)
185
188
  ip_address =
186
- @request.env['HTTP_X_FORWARDED_FOR'] || @request.env['REMOTE_ADDR']
189
+ request.env['HTTP_X_FORWARDED_FOR'] || request.env['REMOTE_ADDR']
187
190
  # take only the first given ip
188
191
  ip_address.split(',').first.strip
189
192
  end
190
193
 
191
- def request_url
192
- @request_url ||= URI.parse(@request.url)
194
+ def request_host(url)
195
+ host_by_hostname(url.host)
193
196
  end
194
197
 
195
- def request_host
196
- host_by_hostname(request_url.host)
197
- end
198
-
199
- def country_from_request
200
- ip = request_ip
198
+ def country_from_request(request)
199
+ ip = request_ip(request)
201
200
  log "Handling GeoIP lookup: IP #{ip}"
202
201
 
203
202
  country = @db.country(ip)
@@ -206,8 +205,8 @@ module GeoRedirect
206
205
  country[:country_code2] unless code.nil? || code.zero?
207
206
  end
208
207
 
209
- def redirect_url(hostname)
210
- url = request_url.clone
208
+ def redirect_url(request, hostname)
209
+ url = URI.parse(request.url)
211
210
  url.port = nil
212
211
  url.host = hostname if hostname
213
212
 
@@ -223,11 +222,11 @@ module GeoRedirect
223
222
  url
224
223
  end
225
224
 
226
- def should_redirect?(hostname, same_host)
225
+ def should_redirect?(request, hostname, same_host)
227
226
  return true if hostname.nil? || same_host
228
227
 
229
228
  hostname_ends_with = %r{#{hostname.tr('.', '\.')}$}
230
- (@request.host =~ hostname_ends_with).nil?
229
+ (request.host =~ hostname_ends_with).nil?
231
230
  end
232
231
  end
233
232
  end
@@ -1,3 +1,3 @@
1
1
  module GeoRedirect
2
- VERSION = '0.7'.freeze
2
+ VERSION = '0.8'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geo_redirect
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.7'
4
+ version: '0.8'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sagie Maoz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-02 00:00:00.000000000 Z
11
+ date: 2017-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -170,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
170
  version: '0'
171
171
  requirements: []
172
172
  rubyforge_project:
173
- rubygems_version: 2.4.8
173
+ rubygems_version: 2.5.1
174
174
  signing_key:
175
175
  specification_version: 4
176
176
  summary: Rack middleware to redirect clients to hostnames based on geo-location
@@ -183,4 +183,3 @@ test_files:
183
183
  - spec/spec_helper.rb
184
184
  - spec/support/geo_redirect.rb
185
185
  - spec/support/rake.rb
186
- has_rdoc: