wovnrb 3.6.0 → 3.7.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,9 +5,9 @@ module Wovnrb
5
5
  # Generates new instance of Wovnrb::Headers.
6
6
  # Its parameters are set by parsing env variable.
7
7
 
8
- def initialize(env, settings)
8
+ def initialize(env, settings, url_lang_switcher)
9
9
  request = Rack::Request.new(env)
10
-
10
+ @url_lang_switcher = url_lang_switcher
11
11
  @env = env
12
12
  @settings = settings
13
13
  @protocol = request.scheme
@@ -31,11 +31,11 @@ module Wovnrb
31
31
  else
32
32
  @env['HTTP_HOST']
33
33
  end
34
- @host = settings['url_pattern'] == 'subdomain' ? remove_lang(@host, lang_code) : @host
34
+ @host = settings['url_pattern'] == 'subdomain' ? @url_lang_switcher.remove_lang_from_uri_component(@host, lang_code) : @host
35
35
  @pathname, @query = @env['REQUEST_URI'].split('?')
36
- @pathname = settings['url_pattern'] == 'path' ? remove_lang(@pathname, lang_code) : @pathname
36
+ @pathname = settings['url_pattern'] == 'path' ? @url_lang_switcher.remove_lang_from_uri_component(@pathname, lang_code) : @pathname
37
37
  @query ||= ''
38
- @url = "#{@host}#{@pathname}#{(@query.empty? ? '' : '?') + remove_lang(@query, lang_code)}"
38
+ @url = "#{@host}#{@pathname}#{(@query.empty? ? '' : '?') + @url_lang_switcher.remove_lang_from_uri_component(@query, lang_code)}"
39
39
  if settings['query'].empty?
40
40
  @query = ''
41
41
  else
@@ -51,7 +51,7 @@ module Wovnrb
51
51
  "?#{query_vals.sort.join('&')}"
52
52
  end
53
53
  end
54
- @query = remove_lang(@query, lang_code)
54
+ @query = @url_lang_switcher.remove_lang_from_uri_component(@query, lang_code)
55
55
  @pathname_with_trailing_slash_if_present = @pathname
56
56
  @pathname = @pathname.gsub(/\/$/, '')
57
57
  end
@@ -103,81 +103,38 @@ module Wovnrb
103
103
  def redirect_location(lang)
104
104
  if lang == @settings['default_lang']
105
105
  # IS THIS RIGHT??
106
- "#{protocol}://#{url}"
107
- # return remove_lang("#{@env['HTTP_HOST']}#{@env['REQUEST_URI']}", lang)
108
- else
109
- # TODO test
110
- lang_code = Store.instance.settings['custom_lang_aliases'][lang] || lang
111
- location = url
112
- case @settings['url_pattern']
113
- when 'query'
114
- lang_param_name = @settings['lang_param_name']
115
- location = if /\?/.match?(location)
116
- "#{location}&#{lang_param_name}=#{lang_code}"
117
- else
118
- "#{location}?#{lang_param_name}=#{lang_code}"
119
- end
120
- when 'subdomain'
121
- location = "#{lang_code.downcase}.#{location}"
122
- # when 'path'
123
- else
124
- location = location.sub(/(\/|$)/, "/#{lang_code}/")
125
- end
126
- "#{protocol}://#{location}"
106
+ return url_with_scheme
127
107
  end
108
+
109
+ @url_lang_switcher.add_lang_code(url_with_scheme, lang, self)
128
110
  end
129
111
 
130
112
  def request_out(_def_lang = @settings['default_lang'])
131
113
  @env['wovnrb.target_lang'] = lang_code
132
114
  case @settings['url_pattern']
133
115
  when 'query'
134
- @env['REQUEST_URI'] = remove_lang(@env['REQUEST_URI']) if @env.key?('REQUEST_URI')
135
- @env['QUERY_STRING'] = remove_lang(@env['QUERY_STRING']) if @env.key?('QUERY_STRING')
136
- @env['ORIGINAL_FULLPATH'] = remove_lang(@env['ORIGINAL_FULLPATH']) if @env.key?('ORIGINAL_FULLPATH')
116
+ @env['REQUEST_URI'] = @url_lang_switcher.remove_lang_from_uri_component(@env['REQUEST_URI'], lang_code) if @env.key?('REQUEST_URI')
117
+ @env['QUERY_STRING'] = @url_lang_switcher.remove_lang_from_uri_component(@env['QUERY_STRING'], lang_code) if @env.key?('QUERY_STRING')
118
+ @env['ORIGINAL_FULLPATH'] = @url_lang_switcher.remove_lang_from_uri_component(@env['ORIGINAL_FULLPATH'], lang_code) if @env.key?('ORIGINAL_FULLPATH')
137
119
  when 'subdomain'
138
120
  if @settings['use_proxy'] && @env.key?('HTTP_X_FORWARDED_HOST')
139
- @env['HTTP_X_FORWARDED_HOST'] = remove_lang(@env['HTTP_X_FORWARDED_HOST'])
121
+ @env['HTTP_X_FORWARDED_HOST'] = @url_lang_switcher.remove_lang_from_uri_component(@env['HTTP_X_FORWARDED_HOST'], lang_code)
140
122
  else
141
- @env['HTTP_HOST'] = remove_lang(@env['HTTP_HOST'])
142
- @env['SERVER_NAME'] = remove_lang(@env['SERVER_NAME'])
123
+ @env['HTTP_HOST'] = @url_lang_switcher.remove_lang_from_uri_component(@env['HTTP_HOST'], lang_code)
124
+ @env['SERVER_NAME'] = @url_lang_switcher.remove_lang_from_uri_component(@env['SERVER_NAME'], lang_code)
143
125
  end
144
- @env['HTTP_REFERER'] = remove_lang(@env['HTTP_REFERER']) if @env.key?('HTTP_REFERER')
126
+ @env['HTTP_REFERER'] = @url_lang_switcher.remove_lang_from_uri_component(@env['HTTP_REFERER'], lang_code) if @env.key?('HTTP_REFERER')
145
127
  # when 'path'
146
128
  else
147
- @env['REQUEST_URI'] = remove_lang(@env['REQUEST_URI'])
148
- @env['REQUEST_PATH'] = remove_lang(@env['REQUEST_PATH']) if @env.key?('REQUEST_PATH')
149
- @env['PATH_INFO'] = remove_lang(@env['PATH_INFO'])
150
- @env['ORIGINAL_FULLPATH'] = remove_lang(@env['ORIGINAL_FULLPATH']) if @env.key?('ORIGINAL_FULLPATH')
151
- @env['HTTP_REFERER'] = remove_lang(@env['HTTP_REFERER']) if @env.key?('HTTP_REFERER')
129
+ @env['REQUEST_URI'] = @url_lang_switcher.remove_lang_from_uri_component(@env['REQUEST_URI'], lang_code)
130
+ @env['REQUEST_PATH'] = @url_lang_switcher.remove_lang_from_uri_component(@env['REQUEST_PATH'], lang_code) if @env.key?('REQUEST_PATH')
131
+ @env['PATH_INFO'] = @url_lang_switcher.remove_lang_from_uri_component(@env['PATH_INFO'], lang_code)
132
+ @env['ORIGINAL_FULLPATH'] = @url_lang_switcher.remove_lang_from_uri_component(@env['ORIGINAL_FULLPATH'], lang_code) if @env.key?('ORIGINAL_FULLPATH')
133
+ @env['HTTP_REFERER'] = @url_lang_switcher.remove_lang_from_uri_component(@env['HTTP_REFERER'], lang_code) if @env.key?('HTTP_REFERER')
152
134
  end
153
135
  @env
154
136
  end
155
137
 
156
- # TODO: this should be in Lang for reusability
157
- # Remove language code from the URI.
158
- #
159
- # @param uri [String] original URI
160
- # @param lang_code [String] language code
161
- # @return [String] removed URI
162
- def remove_lang(uri, lang = path_lang)
163
- lang_code = Store.instance.settings['custom_lang_aliases'][lang] || lang
164
-
165
- # Do nothing if lang is empty.
166
- return uri if lang_code.nil? || lang_code.empty?
167
-
168
- case @settings['url_pattern']
169
- when 'query'
170
- lang_param_name = @settings['lang_param_name']
171
- uri.sub(/(^|\?|&)#{lang_param_name}=#{lang_code}(&|$)/, '\1').gsub(/(\?|&)$/, '')
172
- when 'subdomain'
173
- rp = Regexp.new("(^|(//))#{lang_code}\\.", 'i')
174
- uri.sub(rp, '\1')
175
- # when 'path'
176
- else
177
- uri.sub(/\/#{lang_code}(\/|$)/, '/')
178
- end
179
- end
180
-
181
138
  def out(headers)
182
139
  r = Regexp.new("//#{@host}")
183
140
  lang_code = Store.instance.settings['custom_lang_aliases'][self.lang_code] || self.lang_code
data/lib/wovnrb/store.rb CHANGED
@@ -151,7 +151,7 @@ module Wovnrb
151
151
  when 'query'
152
152
  @settings['url_pattern_reg'] = "((\\?.*&)|\\?)#{@settings['lang_param_name']}=(?<lang>[^&]+)(&|$)"
153
153
  when 'subdomain'
154
- @settings['url_pattern_reg'] = "^(?<lang>[^.]+)\."
154
+ @settings['url_pattern_reg'] = '^(?<lang>[^.]+)\.'
155
155
  end
156
156
 
157
157
  @settings['test_mode'] = !(@settings['test_mode'] != true || @settings['test_mode'] != 'on')
@@ -9,7 +9,7 @@ module Wovnrb
9
9
 
10
10
  # Adds language code to URL in "href" variable by "pattern" variable and own lang_code.
11
11
  # When lang_code is 'ja', add_lang_code('https://wovn.io', 'path', url) returns 'https://wovn.io/ja/'.
12
- # @param [String] href original URL.
12
+ # @param [String] href original URL. (This condition is not validated against)
13
13
  # @param [String] to_lang_code language code.
14
14
  def add_lang_code(href, to_lang_code, headers)
15
15
  return nil if href.nil?
@@ -26,6 +26,34 @@ module Wovnrb
26
26
  end
27
27
  end
28
28
 
29
+ # Removes language code from a URI component (path, hostname, query etc), and returns it.
30
+ #
31
+ # @param uri [String] original URI component
32
+ # @param lang [String] language code
33
+ # @return [String] removed URI
34
+ def remove_lang_from_uri_component(uri, lang)
35
+ lang_code = @store.settings['custom_lang_aliases'][lang] || lang
36
+
37
+ return uri if lang_code.blank?
38
+
39
+ case @store.settings['url_pattern']
40
+ when 'query'
41
+ lang_param_name = @store.settings['lang_param_name']
42
+ uri.sub(/(^|\?|&)#{lang_param_name}=#{lang_code}(&|$)/, '\1').gsub(/(\?|&)$/, '')
43
+ when 'subdomain'
44
+ rp = Regexp.new("(^|(//))#{lang_code}\\.", 'i')
45
+ uri.sub(rp, '\1')
46
+ when 'path'
47
+ # ^(.*://|//)? 1: schema (optional) like https://
48
+ # ([^/]*/)? 2: host (optional) like wovn.io, with trailing '/' (mandatory)
49
+ # (/|$) 3: path or end-of-string
50
+ lang_code_pattern = %r{^(.*://|//)?([^/]*/)?#{lang_code}(/|$)}
51
+ uri.sub(lang_code_pattern, '\1\2')
52
+ else
53
+ raise RuntimeError("Invalid URL pattern: #{@store.settings['url_pattern']}")
54
+ end
55
+ end
56
+
29
57
  private
30
58
 
31
59
  delegate :default_lang_alias, to: :@store
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = '3.6.0'.freeze
2
+ VERSION = '3.7.2'.freeze
3
3
  end
data/lib/wovnrb.rb CHANGED
@@ -20,6 +20,7 @@ module Wovnrb
20
20
  @store = Store.instance
21
21
  opts = opts.transform_keys(&:to_s)
22
22
  @store.update_settings(opts)
23
+ @url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(@store)
23
24
  end
24
25
 
25
26
  def call(env)
@@ -30,7 +31,7 @@ module Wovnrb
30
31
  return @app.call(env) unless Store.instance.valid_settings?
31
32
 
32
33
  @env = env
33
- headers = Headers.new(env, @store.settings)
34
+ headers = Headers.new(env, @store.settings, @url_lang_switcher)
34
35
  default_lang = @store.settings['default_lang']
35
36
  return @app.call(env) if @store.settings['test_mode'] && @store.settings['test_url'] != headers.url
36
37
 
@@ -77,8 +78,8 @@ module Wovnrb
77
78
  html_body = Helpers::NokogumboHelper.parse_html(string_body)
78
79
 
79
80
  if !wovn_ignored?(html_body) && !amp_page?(html_body)
80
- url_lang_switcher = Wovnrb::UrlLanguageSwitcher.new(@store)
81
- html_converter = HtmlConverter.new(html_body, @store, headers, url_lang_switcher)
81
+
82
+ html_converter = HtmlConverter.new(html_body, @store, headers, @url_lang_switcher)
82
83
 
83
84
  if needs_api?(html_body, headers)
84
85
  converted_html, marker = html_converter.build_api_compatible_html
@@ -69,14 +69,15 @@ module Wovnrb
69
69
  'custom_lang_aliases' => { 'ja' => 'Japanese' },
70
70
  'default_lang' => 'en',
71
71
  'url_pattern' => 'subdomain',
72
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
72
+ 'url_pattern_reg' => '^(?<lang>[^.]+)\.',
73
73
  'lang_param_name' => 'lang'
74
74
  }
75
75
  store = Wovnrb::Store.instance
76
76
  store.update_settings(settings)
77
77
  headers = Wovnrb::Headers.new(
78
78
  Wovnrb.get_env('url' => 'http://fr.wovn.io/test', 'HTTP_USER_AGENT' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'),
79
- Wovnrb.get_settings(settings)
79
+ Wovnrb.get_settings(settings),
80
+ UrlLanguageSwitcher.new(store)
80
81
  )
81
82
  api_translator = ApiTranslator.new(store, headers, REQUEST_UUID)
82
83
  assert_equal(5.0, api_translator.send(:api_timeout))
@@ -88,7 +89,7 @@ module Wovnrb
88
89
  'custom_lang_aliases' => { 'ja' => 'Japanese' },
89
90
  'default_lang' => 'en',
90
91
  'url_pattern' => 'subdomain',
91
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
92
+ 'url_pattern_reg' => '^(?<lang>[^.]+)\.',
92
93
  'lang_param_name' => 'lang'
93
94
  }
94
95
  store = Wovnrb::Store.instance
@@ -97,7 +98,8 @@ module Wovnrb
97
98
  env.delete('HTTP_USER_AGENT')
98
99
  headers = Wovnrb::Headers.new(
99
100
  env,
100
- Wovnrb.get_settings(settings)
101
+ Wovnrb.get_settings(settings),
102
+ UrlLanguageSwitcher.new(store)
101
103
  )
102
104
  api_translator = ApiTranslator.new(store, headers, REQUEST_UUID)
103
105
  assert_equal(1.0, api_translator.send(:api_timeout))
@@ -134,14 +136,15 @@ module Wovnrb
134
136
  'custom_lang_aliases' => { 'ja' => 'Japanese' },
135
137
  'default_lang' => 'en',
136
138
  'url_pattern' => 'subdomain',
137
- 'url_pattern_reg' => '^(?<lang>[^.]+).',
139
+ 'url_pattern_reg' => '^(?<lang>[^.]+)\.',
138
140
  'lang_param_name' => 'lang'
139
141
  }
140
142
  store = Wovnrb::Store.instance
141
143
  store.update_settings(settings)
142
144
  headers = Wovnrb::Headers.new(
143
145
  Wovnrb.get_env('url' => 'http://fr.wovn.io/test'),
144
- Wovnrb.get_settings(settings)
146
+ Wovnrb.get_settings(settings),
147
+ UrlLanguageSwitcher.new(store)
145
148
  )
146
149
  api_translator = ApiTranslator.new(store, headers, REQUEST_UUID)
147
150