wovnrb 3.10.3 → 3.11.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a84546815e1636edb448a8c2f323b6edbf663a908000b5ecfd69b9a72ff14bf9
4
- data.tar.gz: 4b77c5b14ee1db412c8c493be90a36bbb3ff4c541622d1c0f2797fca752fcbb4
3
+ metadata.gz: 363a963f8aa66c621e8a5a9c74e539ab34aa5b691db5b13c184d10b2a9d3bdce
4
+ data.tar.gz: 6f3aad667b5a978fbb3c4df193ec25eeb567193d7b8be46ca32b4abb2d4f3257
5
5
  SHA512:
6
- metadata.gz: 444e6126427329e19fb1d327a8719ba7067c1b308664ee877408e5ce00520228f267e37e803ec99098b6c90ab75bf27545a33393ad1497f0c6a240c60c06a5ba
7
- data.tar.gz: fb8922dfa76c4a303e37f16e12a6c172ab9066e406bbe986bfb2aaab4b9954366f2f89cf051934405892e64a5e71b7ee3315c1c288f3b04a6922dfc01cf240bb
6
+ metadata.gz: d9b16d7c6fe502f7d4669f32360a7f1827ffb6b889fffc609ad1aed1a577209e56737916ced62d891116f3dcd747f69ba136850a1ca52d5aaf06e2dd30e3c3c4
7
+ data.tar.gz: 633ef1dbc42ed6943b789133f0574e758bda8867101392dae272353d97d79cb308c37108740aa7aa0499ef48acfbfc59244e1c47f91c69f7781a53c96e1d93a8
data/lib/wovnrb/store.rb CHANGED
@@ -41,7 +41,8 @@ module Wovnrb
41
41
  'compress_api_requests' => true,
42
42
  'translate_canonical_tag' => true,
43
43
  'custom_domain_langs' => {},
44
- 'insert_hreflangs' => true
44
+ 'insert_hreflangs' => true,
45
+ 'use_cookie_lang' => false
45
46
  )
46
47
  end
47
48
 
@@ -1,3 +1,3 @@
1
1
  module Wovnrb
2
- VERSION = '3.10.3'.freeze
2
+ VERSION = '3.11.1'.freeze
3
3
  end
data/lib/wovnrb.rb CHANGED
@@ -25,7 +25,8 @@ module Wovnrb
25
25
 
26
26
  def call(env)
27
27
  # disabled by previous Rack middleware
28
- return @app.call(env) if Rack::Request.new(env).params['wovn_disable'] == true
28
+ request = Rack::Request.new(env)
29
+ return @app.call(env) if request.params['wovn_disable'] == true
29
30
 
30
31
  @store.settings.clear_dynamic_settings!
31
32
  return @app.call(env) unless Store.instance.valid_settings?
@@ -35,8 +36,17 @@ module Wovnrb
35
36
  default_lang = @store.settings['default_lang']
36
37
  return @app.call(env) if @store.settings['test_mode'] && @store.settings['test_url'] != headers.url
37
38
 
39
+ cookie_lang = request.cookies['wovn_selected_lang']
40
+ request_lang = headers.lang_code
41
+ is_get_request = request.get?
42
+
43
+ if @store.settings['use_cookie_lang'] && cookie_lang.present? && request_lang != cookie_lang && request_lang == @store.default_lang && is_get_request
44
+ redirect_headers = headers.redirect(cookie_lang)
45
+ return [302, redirect_headers, ['']]
46
+ end
47
+
38
48
  # redirect if the path is set to the default language (for SEO purposes)
39
- if explicit_default_lang?(headers)
49
+ if explicit_default_lang?(headers) && is_get_request
40
50
  redirect_headers = headers.redirect(default_lang)
41
51
  return [307, redirect_headers, ['']]
42
52
  end
@@ -53,8 +63,6 @@ module Wovnrb
53
63
  # disabled by next Rack middleware
54
64
  return output(headers, status, res_headers, body) unless res_headers['Content-Type']&.include?('html')
55
65
 
56
- request = Rack::Request.new(env)
57
-
58
66
  return output(headers, status, res_headers, body) if request.params['wovn_disable'] == true
59
67
 
60
68
  @store.settings.update_dynamic_settings!(request.params)
@@ -239,6 +239,7 @@ HTML
239
239
  'rack.request.form_input' => '',
240
240
  'rack.request.form_hash' => {},
241
241
  'rack.request.form_pairs' => [],
242
+ 'rack.request.cookie_hash' => {},
242
243
  'HTTP_HOST' => 'test.com',
243
244
  'REQUEST_URI' => '/en/ignored',
244
245
  'PATH_INFO' => '/en/ignored'
@@ -247,6 +248,140 @@ HTML
247
248
  assert_call_affects_env(settings, env, mock_api: false, affected: false)
248
249
  end
249
250
 
251
+ def test_call__with_use_cookie_lang_true__cookie_lang_is_target_lang__should_redirect
252
+ settings = {
253
+ 'project_token' => '123456',
254
+ 'url_pattern' => 'path',
255
+ 'default_lang' => 'ja',
256
+ 'supported_langs' => %w[ja en],
257
+ 'use_cookie_lang' => true
258
+ }
259
+ env = Wovnrb.get_env(
260
+ {
261
+ 'url' => 'http://test.com/foo',
262
+ 'HTTP_COOKIE' => 'wovn_selected_lang=en'
263
+ }
264
+ )
265
+
266
+ sut = Wovnrb::Interceptor.new(get_app, settings)
267
+ status, res_headers, _body = sut.call(env)
268
+
269
+ assert_equal(302, status)
270
+ assert_equal('http://test.com/en/foo', res_headers['location'])
271
+ end
272
+
273
+ def test_call__with_use_cookie_lang_true__request_method_is_post__should_not_redirect
274
+ settings = {
275
+ 'project_token' => '123456',
276
+ 'url_pattern' => 'path',
277
+ 'default_lang' => 'ja',
278
+ 'supported_langs' => %w[ja en],
279
+ 'use_cookie_lang' => true
280
+ }
281
+ env = Wovnrb.get_env(
282
+ {
283
+ 'url' => 'http://test.com/foo',
284
+ 'HTTP_COOKIE' => 'wovn_selected_lang=en',
285
+ 'REQUEST_METHOD' => 'POST'
286
+ }
287
+ )
288
+
289
+ sut = Wovnrb::Interceptor.new(get_app, settings)
290
+ status, res_headers, _body = sut.call(env)
291
+
292
+ assert_equal(200, status)
293
+ assert_nil(res_headers['location'])
294
+ end
295
+
296
+ def test_call__with_use_cookie_lang_true__cookie_lang_is_default_lang__should_not_redirect
297
+ settings = {
298
+ 'project_token' => '123456',
299
+ 'url_pattern' => 'path',
300
+ 'default_lang' => 'ja',
301
+ 'supported_langs' => %w[ja en],
302
+ 'use_cookie_lang' => true
303
+ }
304
+ env = Wovnrb.get_env(
305
+ {
306
+ 'url' => 'http://test.com/foo',
307
+ 'HTTP_COOKIE' => 'wovn_selected_lang=ja'
308
+ }
309
+ )
310
+
311
+ sut = Wovnrb::Interceptor.new(get_app, settings)
312
+ status, res_headers, _body = sut.call(env)
313
+
314
+ assert_equal(200, status)
315
+ assert_nil(res_headers['location'])
316
+ end
317
+
318
+ def test_call__with_use_cookie_lang_true__cookie_lang_is_different_target_lang__should_not_redirect
319
+ settings = {
320
+ 'project_token' => '123456',
321
+ 'url_pattern' => 'path',
322
+ 'default_lang' => 'ja',
323
+ 'supported_langs' => %w[ja en fr],
324
+ 'use_cookie_lang' => true
325
+ }
326
+ env = Wovnrb.get_env(
327
+ {
328
+ 'url' => 'http://test.com/en/foo',
329
+ 'HTTP_COOKIE' => 'wovn_selected_lang=fr'
330
+ }
331
+ )
332
+
333
+ mock_translation_api_response('', '')
334
+ sut = Wovnrb::Interceptor.new(get_app, settings)
335
+ status, res_headers, _body = sut.call(env)
336
+
337
+ assert_equal(200, status)
338
+ assert_nil(res_headers['location'])
339
+ end
340
+
341
+ def test_call__with_use_cookie_lang_true__cookie_lang_is_empty__should_not_redirect
342
+ settings = {
343
+ 'project_token' => '123456',
344
+ 'url_pattern' => 'path',
345
+ 'default_lang' => 'ja',
346
+ 'supported_langs' => %w[ja en],
347
+ 'use_cookie_lang' => true
348
+ }
349
+ env = Wovnrb.get_env(
350
+ {
351
+ 'url' => 'http://test.com/foo',
352
+ 'HTTP_COOKIE' => ''
353
+ }
354
+ )
355
+
356
+ sut = Wovnrb::Interceptor.new(get_app, settings)
357
+ status, res_headers, _body = sut.call(env)
358
+
359
+ assert_equal(200, status)
360
+ assert_nil(res_headers['location'])
361
+ end
362
+
363
+ def test_call__with_use_cookie_lang_false__should_not_redirect
364
+ settings = {
365
+ 'project_token' => '123456',
366
+ 'url_pattern' => 'path',
367
+ 'default_lang' => 'ja',
368
+ 'supported_langs' => %w[ja en],
369
+ 'use_cookie_lang' => false
370
+ }
371
+ env = Wovnrb.get_env(
372
+ {
373
+ 'url' => 'http://test.com/foo',
374
+ 'HTTP_COOKIE' => 'wovn_selected_lang=en'
375
+ }
376
+ )
377
+
378
+ sut = Wovnrb::Interceptor.new(get_app, settings)
379
+ status, res_headers, _body = sut.call(env)
380
+
381
+ assert_equal(200, status)
382
+ assert_nil(res_headers['location'])
383
+ end
384
+
250
385
  private
251
386
 
252
387
  def assert_call_affects_env(settings, env, mock_api:, affected:)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wovnrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.10.3
4
+ version: 3.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wovn Technologies, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-27 00:00:00.000000000 Z
11
+ date: 2023-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport