You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
portainer/pkg/libhelm/validate_repo.go

50 lines
1.1 KiB

package libhelm
import (
"errors"
"fmt"
"net/http"
"net/url"
"path"
"strings"
"time"
)
func ValidateHelmRepositoryURL(repoUrl string, client *http.Client) error {
if repoUrl == "" {
return errors.New("URL is required")
}
url, err := url.ParseRequestURI(repoUrl)
if err != nil {
return fmt.Errorf("invalid helm repository URL '%s': %w", repoUrl, err)
}
if !strings.EqualFold(url.Scheme, "http") && !strings.EqualFold(url.Scheme, "https") {
return fmt.Errorf("invalid helm repository URL '%s'", repoUrl)
}
url.Path = path.Join(url.Path, "index.yaml")
if client == nil {
client = &http.Client{
Timeout: time.Second * 10,
Transport: http.DefaultTransport,
}
}
const invalidChartRepo = "%s is not a valid chart repository or cannot be reached: %w"
response, err := client.Head(url.String())
if err != nil {
return fmt.Errorf(invalidChartRepo, repoUrl, err)
}
// Success is indicated with 2xx status codes. 3xx status codes indicate a redirect.
statusOK := response.StatusCode >= 200 && response.StatusCode < 300
if !statusOK {
return fmt.Errorf(invalidChartRepo, repoUrl, err)
}
return nil
}