Return default language when there are no headers

This change also affects test setup: we need to load locale service
without any languages/translations to avoid test flakines
This commit is contained in:
Denis Arh
2021-10-07 15:24:59 +02:00
parent dc56f8a624
commit 832a4557c5
5 changed files with 43 additions and 14 deletions
+15 -11
View File
@@ -17,11 +17,11 @@ func DetectLanguage(ll *service) func(next http.Handler) http.Handler {
// resolve accept-language header
// Accept-Language specifies the language of the response payload.
ctx = SetAcceptLanguageToContext(ctx, resolveAcceptLanguageHeaders(ll, r))
ctx = SetAcceptLanguageToContext(ctx, resolveAcceptLanguageHeaders(r, ll))
// resolve content-language header
// Content-Language specifies the language of the request payload.
ctx = SetContentLanguageToContext(ctx, resolveContentLanguageHeaders(r.Header, ll.Default().Tag))
ctx = SetContentLanguageToContext(ctx, resolveContentLanguageHeaders(r.Header, ll))
next.ServeHTTP(w, r.WithContext(ctx))
})
@@ -36,11 +36,15 @@ func DetectLanguage(ll *service) func(next http.Handler) http.Handler {
// - invalid language: (same as skip)
// - valid language: returns valid language; services will treat translatable content from the payload as translations
// - no header: returns default language; (same as valid language)
func resolveContentLanguageHeaders(h http.Header, def language.Tag) language.Tag {
func resolveContentLanguageHeaders(h http.Header, ll *service) language.Tag {
if ll == nil || ll.Default() == nil {
return language.Und
}
var cLang = h.Get(ContentLanguageHeader)
if cLang == "" {
return def
return ll.Default().Tag
}
if cLang == "skip" {
@@ -55,7 +59,12 @@ func resolveContentLanguageHeaders(h http.Header, def language.Tag) language.Tag
}
}
func resolveAcceptLanguageHeaders(ll *service, r *http.Request) (tag language.Tag) {
func resolveAcceptLanguageHeaders(r *http.Request, ll *service) (tag language.Tag) {
if ll == nil || ll.Default() == nil {
// locale service does not have anything loaded...
return language.Und
}
if ll.opt.DevelopmentMode {
if err := ll.ReloadStatic(); err != nil {
// when in development mode, refresh languages for every request
@@ -64,11 +73,6 @@ func resolveAcceptLanguageHeaders(ll *service, r *http.Request) (tag language.Ta
}
}
if ll.Default() == nil {
// locale service does not have anything loaded...
return
}
var (
raw string
)
@@ -85,7 +89,7 @@ func resolveAcceptLanguageHeaders(ll *service, r *http.Request) (tag language.Ta
if len(raw) == 0 {
// no need for lang detection
return
return ll.Default().Tag
}
// parse & ignore errors
+12 -3
View File
@@ -74,8 +74,18 @@ func SetGlobal(ll *service) {
global = ll
}
func Static(ll ...*Language) *service {
return &service{}
func Static(ll ...*Language) (svc *service) {
svc = &service{
log: zap.NewNop(),
set: make(map[language.Tag]*Language),
}
for _, l := range ll {
svc.set[l.Tag] = l
svc.tags = append(svc.tags, l.Tag)
}
return svc
}
func Service(log *zap.Logger, opt options.LocaleOpt) (*service, error) {
@@ -84,7 +94,6 @@ func Service(log *zap.Logger, opt options.LocaleOpt) (*service, error) {
src: strings.Split(opt.Path, ":"),
log: log.Named("locale"),
}
for _, lang := range strings.Split(opt.Languages, ",") {
lang = strings.TrimSpace(lang)
tag := language.Make(lang)
+5
View File
@@ -16,6 +16,7 @@ import (
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/label"
ltype "github.com/cortezaproject/corteza-server/pkg/label/types"
"github.com/cortezaproject/corteza-server/pkg/locale"
"github.com/cortezaproject/corteza-server/pkg/logger"
"github.com/cortezaproject/corteza-server/pkg/rand"
"github.com/cortezaproject/corteza-server/store"
@@ -26,6 +27,7 @@ import (
_ "github.com/joho/godotenv/autoload"
"github.com/steinfletcher/apitest"
"github.com/stretchr/testify/require"
"golang.org/x/text/language"
)
type (
@@ -70,6 +72,9 @@ func InitTestApp() {
return err
}
// Tests should be executed w/o any locales
locale.SetGlobal(locale.Static(&locale.Language{Tag: language.Und}))
eventbus.Set(eventBus)
return nil
})
+5
View File
@@ -21,6 +21,7 @@ import (
"github.com/cortezaproject/corteza-server/pkg/envoy/yaml"
"github.com/cortezaproject/corteza-server/pkg/eventbus"
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/locale"
"github.com/cortezaproject/corteza-server/pkg/logger"
"github.com/cortezaproject/corteza-server/pkg/objstore/plain"
"github.com/cortezaproject/corteza-server/pkg/rand"
@@ -33,6 +34,7 @@ import (
"github.com/spf13/afero"
"github.com/steinfletcher/apitest"
"github.com/stretchr/testify/require"
"golang.org/x/text/language"
)
type (
@@ -80,6 +82,9 @@ func InitTestApp() {
return err
}
// Tests should be executed w/o any locales
locale.SetGlobal(locale.Static(&locale.Language{Tag: language.Und}))
eventbus.Set(eventBus)
return nil
})
+6
View File
@@ -18,6 +18,7 @@ import (
"github.com/cortezaproject/corteza-server/pkg/id"
"github.com/cortezaproject/corteza-server/pkg/label"
ltype "github.com/cortezaproject/corteza-server/pkg/label/types"
"github.com/cortezaproject/corteza-server/pkg/locale"
"github.com/cortezaproject/corteza-server/pkg/logger"
"github.com/cortezaproject/corteza-server/pkg/objstore/plain"
"github.com/cortezaproject/corteza-server/pkg/rand"
@@ -34,6 +35,7 @@ import (
"github.com/steinfletcher/apitest"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"golang.org/x/text/language"
)
//go:embed static
@@ -90,10 +92,14 @@ func InitTestApp() {
return err
}
// Tests should be executed w/o any locales
locale.SetGlobal(locale.Static(&locale.Language{Tag: language.Und}))
sm = request.NewSessionManager(service.DefaultStore, app.Opt.Auth, service.DefaultLogger)
return nil
})
}
sp, _ := loadSAMLService()