diff --git a/internal/virtual/engine.go b/internal/virtual/engine.go index b80393b..bcc352e 100644 --- a/internal/virtual/engine.go +++ b/internal/virtual/engine.go @@ -79,7 +79,7 @@ func (e *Engine) fetchMemberIndexes(ctx context.Context, virt models.Virtual, pa results[idx] = result{err: fmt.Errorf("local index %q: %w", name, err)} return } - results[idx] = result{index: MemberIndex{RemoteName: name, RepoType: remote.RepoType, Body: body}} + results[idx] = result{index: MemberIndex{RemoteName: name, RepoType: remote.RepoType, BaseURL: remote.BaseURL, Body: body}} return } @@ -102,7 +102,7 @@ func (e *Engine) fetchMemberIndexes(ctx context.Context, virt models.Virtual, pa return } - results[idx] = result{index: MemberIndex{RemoteName: name, RepoType: remote.RepoType, Body: body}} + results[idx] = result{index: MemberIndex{RemoteName: name, RepoType: remote.RepoType, BaseURL: remote.BaseURL, Body: body}} }(i, memberName) } diff --git a/internal/virtual/helm_merger.go b/internal/virtual/helm_merger.go index 70a47e7..db1d206 100644 --- a/internal/virtual/helm_merger.go +++ b/internal/virtual/helm_merger.go @@ -54,15 +54,26 @@ func (m *HelmMerger) MergeIndexes(members []MemberIndex, proxyBaseURL string) ([ seen[chart][ver.Version] = true if proxyBaseURL != "" { + routePrefix := "remote" + if member.RepoType == "local" { + routePrefix = "local" + } + baseHost := extractHost(member.BaseURL) + for i, u := range ver.URLs { if strings.HasPrefix(u, "http://") || strings.HasPrefix(u, "https://") { - ver.URLs[i] = fmt.Sprintf("%s/api/v1/remote/%s/%s", + if baseHost != "" && extractHost(u) != baseHost { + continue + } + ver.URLs[i] = fmt.Sprintf("%s/api/v1/%s/%s/%s", strings.TrimRight(proxyBaseURL, "/"), + routePrefix, member.RemoteName, extractPath(u)) } else { - ver.URLs[i] = fmt.Sprintf("%s/api/v1/remote/%s/%s", + ver.URLs[i] = fmt.Sprintf("%s/api/v1/%s/%s/%s", strings.TrimRight(proxyBaseURL, "/"), + routePrefix, member.RemoteName, u) } @@ -78,6 +89,19 @@ func (m *HelmMerger) MergeIndexes(members []MemberIndex, proxyBaseURL string) ([ return yaml.Marshal(merged) } +func extractHost(rawURL string) string { + idx := strings.Index(rawURL, "://") + if idx == -1 { + return "" + } + rest := rawURL[idx+3:] + slashIdx := strings.Index(rest, "/") + if slashIdx == -1 { + return rest + } + return rest[:slashIdx] +} + func extractPath(rawURL string) string { idx := strings.Index(rawURL, "://") if idx == -1 { diff --git a/internal/virtual/merger.go b/internal/virtual/merger.go index 4080bf3..d089994 100644 --- a/internal/virtual/merger.go +++ b/internal/virtual/merger.go @@ -9,6 +9,7 @@ import ( type MemberIndex struct { RemoteName string RepoType models.RepoType + BaseURL string Body []byte }