wovnrb 3.6.0 → 3.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/{makefile → Makefile} +0 -0
- data/docker/rails/Dockerfile +2 -2
- data/docker/rails/Dockerfile.ECS +2 -2
- data/docker/rails/TestSite/Gemfile +1 -1
- data/docker/rails/TestSite/package.json +3 -3
- data/docker/rails/TestSite/yarn.lock +1150 -1466
- data/lib/wovnrb/headers.rb +21 -64
- data/lib/wovnrb/store.rb +1 -1
- data/lib/wovnrb/url_language_switcher.rb +29 -1
- data/lib/wovnrb/version.rb +1 -1
- data/lib/wovnrb.rb +4 -3
- data/test/lib/api_translator_test.rb +9 -6
- data/test/lib/headers_test.rb +659 -6223
- data/test/lib/lang_test.rb +0 -265
- data/test/lib/services/html_converter_test.rb +12 -6
- data/test/lib/store_test.rb +1 -1
- data/test/lib/url_language_switcher_test.rb +152 -1
- data/test/lib/wovnrb_test.rb +13 -2
- data/test/test_helper.rb +11 -3
- data/wovnrb.gemspec +0 -1
- metadata +7 -21
data/lib/wovnrb/headers.rb
CHANGED
@@ -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' ?
|
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' ?
|
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? ? '' : '?') +
|
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 =
|
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
|
-
|
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'] =
|
135
|
-
@env['QUERY_STRING'] =
|
136
|
-
@env['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'] =
|
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'] =
|
142
|
-
@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'] =
|
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'] =
|
148
|
-
@env['REQUEST_PATH'] =
|
149
|
-
@env['PATH_INFO'] =
|
150
|
-
@env['ORIGINAL_FULLPATH'] =
|
151
|
-
@env['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'] =
|
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
|
data/lib/wovnrb/version.rb
CHANGED
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
|
-
|
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
|
|