juicedata/juicefs · error

Invalid endpoint

Error message

Invalid endpoint %s: %s

What it means

newMinio parses the endpoint with url.ParseRequestURI after defaulting the scheme to http. If parsing fails, the endpoint string is not a valid absolute URI (bad scheme, control characters, empty string, etc.) and the constructor returns this wrapped parse error including the underlying url.Error text.

Solutions

  1. Inspect the endpoint value in the error and fix the malformed URL syntax (wrap IPv6 hosts in brackets: 'http://[::1]:9000').
  2. Ensure the endpoint is a non-empty absolute URL with scheme://host[:port].
  3. Quote shell variables and check that environment/config substitution isn't mangling the value.

Example fix

// before
endpoint := "http://::1:9000" // unparseable
// after
endpoint := "http://[::1]:9000"
Defensive patterns

Strategy: validation

Validate before calling

u, err := url.ParseRequestURI(endpoint)
if err != nil || u.Host == "" {
	return fmt.Errorf("endpoint %q is not a valid absolute URL", endpoint)
}

Try / catch

store, err := newMinio(endpoint, ak, sk, "")
if err != nil && strings.Contains(err.Error(), "Invalid endpoint") {
	return fmt.Errorf("fix minio endpoint %q: %w", endpoint, err)
}

Prevention

When it happens

Trigger: Creating a MinIO object store with an unparseable endpoint, e.g. an empty endpoint, 'http://[bad-ipv6', an endpoint containing spaces, or a scheme with invalid characters.

Common situations: Config interpolation leaving an empty or malformed URL; unquoted shell variables stripping characters; IPv6 endpoints missing brackets.

Understand the failure class

Background: "Invalid URL" / "URL cannot be empty": fix the malformed or missing URL behind request-construction failures — this error's family across 50 libraries.

Related errors


AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06). Data as JSON: /api/errors/92730bb9f0180c08. Report an issue: GitHub.

Appendix: source

Thrown at pkg/object/minio.go:67

}

func (m *minio) Limits() Limits {
	return Limits{
		IsSupportMultipartUpload: true,
		IsSupportUploadPartCopy:  true,
		MinPartSize:              5 << 20,
		MaxPartSize:              5 << 30,
		MaxPartCount:             10000,
	}
}

func newMinio(endpoint, accessKey, secretKey, token string) (ObjectStorage, error) {
	if !strings.Contains(endpoint, "://") {
		endpoint = fmt.Sprintf("http://%s", endpoint)
	}
	uri, err := url.ParseRequestURI(endpoint)
	if err != nil {
		return nil, fmt.Errorf("Invalid endpoint %s: %s", endpoint, err)
	}
	ssl := strings.ToLower(uri.Scheme) == "https"
	region := uri.Query().Get("region")
	if region == "" {
		region = os.Getenv("MINIO_REGION")
	}
	if region == "" {
		region = awsDefaultRegion
	}
	if accessKey == "" {
		accessKey = os.Getenv("MINIO_ACCESS_KEY")
	}
	if secretKey == "" {
		secretKey = os.Getenv("MINIO_SECRET_KEY")
	}
	var cfg aws.Config
	if accessKey != "" {
		cfg, err = config.LoadDefaultConfig(ctx, append(defaultChecksumOpts(),

View on GitHub (pinned to c9a67b23e8)