diff --git a/internal/config/query.go b/internal/config/query.go index 8546cb7..c752d7c 100644 --- a/internal/config/query.go +++ b/internal/config/query.go @@ -35,10 +35,10 @@ func (cfg *Config) HomepageConfig() H.HomePageConfig { cert, _ := cfg.autocertProvider.GetCert(nil) if cert != nil { proto = "https" - port = common.ProxyHTTPPort + port = common.ProxyHTTPSPort } else { proto = "http" - port = common.ProxyHTTPSPort + port = common.ProxyHTTPPort } hpCfg := H.NewHomePageConfig() @@ -49,8 +49,13 @@ func (cfg *Config) HomepageConfig() H.HomePageConfig { entry := r.Entry() item := entry.Homepage - if item == nil { - item = &H.HomePageItem{} + + if !item.Initialized { + item.Show = r.Entry().IsExplicit || !p.IsExplicitOnly() + } + + if !item.Show || r.Type() != R.RouteTypeReverseProxy { + return } if item.Name == "" { @@ -61,20 +66,27 @@ func (cfg *Config) HomepageConfig() H.HomePageConfig { if item.Category == "" { item.Category = "Docker" } + if item.Icon == "" { + item.Icon = "🐳" + } item.SourceType = string(PR.ProviderTypeDocker) } else if p.GetType() == PR.ProviderTypeFile { if item.Category == "" { item.Category = "Others" } + if item.Icon == "" { + item.Icon = "🔗" + } item.SourceType = string(PR.ProviderTypeFile) } - if item.URL == "" && r.Type() == R.RouteTypeReverseProxy { + if item.URL == "" { if len(domains) > 0 { item.URL = fmt.Sprintf("%s://%s.%s:%s", proto, strings.ToLower(alias), domains[0], port) } } - hpCfg.Add(item) + + hpCfg.Add(&item) }) return hpCfg } diff --git a/internal/docker/label.go b/internal/docker/label.go index 63e072f..aa11909 100644 --- a/internal/docker/label.go +++ b/internal/docker/label.go @@ -58,7 +58,7 @@ func ApplyLabel[T any](obj *T, l *Label) E.NestedError { } dst, ok := field.Interface().(NestedLabelMap) if !ok { - return E.Invalid("type", field.Type()) + return U.Deserialize(U.SerializedObject{nestedLabel.Namespace: nestedLabel.Value}, field.Addr().Interface()) } if dst == nil { field.Set(reflect.MakeMap(reflect.TypeFor[NestedLabelMap]())) diff --git a/internal/homepage/homepage.go b/internal/homepage/homepage.go index 5a44319..ea10d4e 100644 --- a/internal/homepage/homepage.go +++ b/internal/homepage/homepage.go @@ -5,13 +5,16 @@ type ( HomePageCategory []*HomePageItem HomePageItem struct { + Show bool `yaml:"show" json:"show"` Name string `yaml:"name" json:"name"` - Icon string `yaml:"icon" json:"icon,omitempty"` - URL string `yaml:"url" json:"url,omitempty"` // URL or unicodes + Icon string `yaml:"icon" json:"icon"` + URL string `yaml:"url" json:"url"` // URL or unicodes Category string `yaml:"category" json:"category"` - SourceType string `yaml:"source_type" json:"source_type,omitempty"` - Description string `yaml:"description" json:"description,omitempty"` - WidgetConfig map[string]any `yaml:",flow" json:"widget_config,omitempty"` + SourceType string `yaml:"source_type" json:"source_type"` + Description string `yaml:"description" json:"description"` + WidgetConfig map[string]any `yaml:",flow" json:"widget_config"` + + Initialized bool `yaml:"-" json:"-"` } ) diff --git a/internal/models/raw_entry.go b/internal/models/raw_entry.go index bc280c8..d6c0d19 100644 --- a/internal/models/raw_entry.go +++ b/internal/models/raw_entry.go @@ -22,7 +22,7 @@ type ( NoTLSVerify bool `yaml:"no_tls_verify" json:"no_tls_verify,omitempty"` // https proxy only PathPatterns []string `yaml:"path_patterns" json:"path_patterns,omitempty"` // http(s) proxy only Middlewares D.NestedLabelMap `yaml:"middlewares" json:"middlewares,omitempty"` - Homepage *H.HomePageItem `yaml:"homepage" json:"homepage"` + Homepage H.HomePageItem `yaml:"homepage" json:"homepage"` /* Docker only */ *D.ProxyProperties `yaml:"-" json:"proxy_properties"` diff --git a/internal/proxy/provider/docker.go b/internal/proxy/provider/docker.go index ae53a40..2a06c63 100755 --- a/internal/proxy/provider/docker.go +++ b/internal/proxy/provider/docker.go @@ -9,7 +9,6 @@ import ( "github.com/sirupsen/logrus" D "github.com/yusing/go-proxy/internal/docker" E "github.com/yusing/go-proxy/internal/error" - H "github.com/yusing/go-proxy/internal/homepage" M "github.com/yusing/go-proxy/internal/models" R "github.com/yusing/go-proxy/internal/route" W "github.com/yusing/go-proxy/internal/watcher" @@ -185,7 +184,6 @@ func (p *DockerProvider) entriesFromContainerLabels(container D.Container) (entr Alias: a, Host: p.hostname, ProxyProperties: container.ProxyProperties, - Homepage: &H.HomePageItem{}, }) } diff --git a/internal/proxy/provider/provider.go b/internal/proxy/provider/provider.go index b58cdc8..af2541f 100644 --- a/internal/proxy/provider/provider.go +++ b/internal/proxy/provider/provider.go @@ -77,14 +77,9 @@ func NewDockerProvider(name string, dockerHost string) (p *Provider, err E.Neste if name == "" { return nil, E.Invalid("provider name", "empty") } - explicitOnly := false - if name[len(name)-1] == '!' { - explicitOnly = true - name = name[:len(name)-1] - } p = newProvider(name, ProviderTypeDocker) - p.ProviderImpl, err = DockerProviderImpl(dockerHost, explicitOnly) + p.ProviderImpl, err = DockerProviderImpl(dockerHost, p.IsExplicitOnly()) if err != nil { return nil, err } @@ -92,6 +87,10 @@ func NewDockerProvider(name string, dockerHost string) (p *Provider, err E.Neste return } +func (p *Provider) IsExplicitOnly() bool { + return p.name[len(p.name)-1] == '!' +} + func (p *Provider) GetName() string { return p.name } diff --git a/internal/utils/serialization.go b/internal/utils/serialization.go index b9a7f32..02553a9 100644 --- a/internal/utils/serialization.go +++ b/internal/utils/serialization.go @@ -122,14 +122,21 @@ func Serialize(data any) (SerializedObject, E.NestedError) { // // The function returns an error if the target value is not a struct or a map[string]any, or if there is an error during deserialization. func Deserialize(src SerializedObject, dst any) E.NestedError { - if src == nil || dst == nil { - return nil + if src == nil { + return E.Invalid("src", "nil") + } + + if dst == nil { + return E.Invalid("nil dst", fmt.Sprintf("type: %T", dst)) } dstV := reflect.ValueOf(dst) dstT := dstV.Type() if dstV.Kind() == reflect.Ptr { + if dstV.IsNil() { + return E.Invalid("nil dst", fmt.Sprintf("type: %T", dst)) + } dstV = dstV.Elem() dstT = dstV.Type() } @@ -153,7 +160,7 @@ func Deserialize(src SerializedObject, dst any) E.NestedError { return err.Subject(k) } } else { - return E.Unexpected("field", k) + return E.Unexpected("field", k).Subjectf("%T", dst) } } } else if dstV.Kind() == reflect.Map && dstT.Key().Kind() == reflect.String {