[web] fix: using the wrong locale format for the Accept-Language header

This commit is contained in:
Vinicius Moreira
2022-03-25 12:53:14 -03:00
parent 6c8adfe1ed
commit e654ae06a5
4 changed files with 73 additions and 5 deletions

View File

@@ -26,6 +26,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- executed commands are not displayed on the system default language and encoding (requires Flatpak >= 1.12) [#242](https://github.com/vinifmor/bauh/issues/242)
- applications and runtimes descriptions are not displayed on the system default language (when available) [#242](https://github.com/vinifmor/bauh/issues/242)
- Web
- using the wrong locale format for the Accept-Language header
- UI:
- fix: rare crash when updating table items

View File

@@ -59,6 +59,8 @@ RE_PROTOCOL_STRIP = re.compile(r'[a-zA-Z]+://')
RE_SEVERAL_SPACES = re.compile(r'\s+')
RE_SYMBOLS_SPLIT = re.compile(r'[\-|_\s:.]')
DEFAULT_LANGUAGE_HEADER = 'en-US, en'
class WebApplicationManager(SoftwareManager):
@@ -77,12 +79,28 @@ class WebApplicationManager(SoftwareManager):
self.idxman = SearchIndexManager(logger=context.logger)
self._custom_actions: Optional[Iterable[CustomSoftwareAction]] = None
def _get_lang_header(self) -> str:
def get_accept_language_header(self) -> str:
try:
system_locale = locale.getdefaultlocale()
return system_locale[0] if system_locale else 'en_US'
syslocale = locale.getdefaultlocale()
if syslocale:
locale_split = syslocale[0].split('_')
if len(locale_split) == 2:
sys_lang = f'{locale_split[0]}-{locale_split[1]}, {locale_split[0]}'
if DEFAULT_LANGUAGE_HEADER.split(',')[1].strip() not in sys_lang:
return f'{sys_lang}, {DEFAULT_LANGUAGE_HEADER}'
return sys_lang
else:
return f'{syslocale[0]}, {DEFAULT_LANGUAGE_HEADER}'
else:
return DEFAULT_LANGUAGE_HEADER
except:
return 'en_US'
return DEFAULT_LANGUAGE_HEADER
def clean_environment(self, root_password: Optional[str], watcher: ProcessWatcher) -> bool:
handler = ProcessHandler(watcher)
@@ -221,7 +239,7 @@ class WebApplicationManager(SoftwareManager):
super(WebApplicationManager, self).serialize_to_disk(pkg=pkg, icon_bytes=None, only_icon=False)
def _request_url(self, url: str) -> Optional[Response]:
headers = {'Accept-language': self._get_lang_header(), 'User-Agent': UA_CHROME}
headers = {'Accept-language': self.get_accept_language_header(), 'User-Agent': UA_CHROME}
try:
return self.http_client.get(url, headers=headers, ignore_ssl=True, single_call=True, session=False, allow_redirects=True)

View File

View File

@@ -0,0 +1,47 @@
from unittest import TestCase
from unittest.mock import Mock, patch
from bauh.gems.web.controller import DEFAULT_LANGUAGE_HEADER
from bauh.gems.web.controller import WebApplicationManager
class ControllerTest(TestCase):
def test_DEFAULT_LANGUAGE_HEADER(self):
self.assertEqual('en-US, en', DEFAULT_LANGUAGE_HEADER)
class WebApplicationManagerTest(TestCase):
def setUp(self):
self.manager = WebApplicationManager(context=Mock())
@patch('locale.getdefaultlocale', side_effect=Exception)
def test_get_accept_language_header__must_return_default_locale_when_exception_raised(self, getdefaultlocale: Mock):
returned = self.manager.get_accept_language_header()
self.assertEqual(DEFAULT_LANGUAGE_HEADER, returned)
getdefaultlocale.assert_called_once()
@patch('locale.getdefaultlocale', return_value=None)
def test_get_accept_language_header__must_return_default_locale_when_no_locale_is_returned(self, getdefaultlocale: Mock):
returned = self.manager.get_accept_language_header()
self.assertEqual(DEFAULT_LANGUAGE_HEADER, returned)
getdefaultlocale.assert_called_once()
@patch('locale.getdefaultlocale', return_value=['es_AR'])
def test_get_accept_language_header__must_return_the_system_locale_without_underscore_plus_default_locale(self, getdefaultlocale: Mock):
returned = self.manager.get_accept_language_header()
self.assertEqual(f'es-AR, es, {DEFAULT_LANGUAGE_HEADER}', returned)
getdefaultlocale.assert_called_once()
@patch('locale.getdefaultlocale', return_value=['es'])
def test_get_accept_language_header__must_return_the_simple_system_locale_plus_default_locale(self, getdefaultlocale: Mock):
returned = self.manager.get_accept_language_header()
self.assertEqual(f'es, {DEFAULT_LANGUAGE_HEADER}', returned)
getdefaultlocale.assert_called_once()
@patch('locale.getdefaultlocale', return_value=['en_IN'])
def test_get_accept_language_header__must_not_concatenate_default_locale_if_system_locale_has_it(self, getdefaultlocale: Mock):
returned = self.manager.get_accept_language_header()
self.assertEqual(f'en-IN, en', returned)
getdefaultlocale.assert_called_once()