{"record":{"id":"2212b7b59e6a56d7","repo":"grafana/k6","slug":"invalid-stack-url-w","errorCode":null,"errorMessage":"invalid stack URL: %w","messagePattern":"invalid stack URL: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cloudapi/v6/api.go","lineNumber":193,"sourceCode":"\t\tzones = append(zones, LoadZone{\n\t\t\tID:           zone.Id,\n\t\t\tK6LoadZoneID: zone.K6LoadZoneId,\n\t\t\tName:         zone.Name,\n\t\t\tPublic:       zone.Public,\n\t\t\tAvailable:    zone.Available,\n\t\t})\n\t}\n\n\treturn zones, nil\n}\n\n// ValidateToken validates the cloud authentication token.\nfunc (c *Client) ValidateToken(ctx context.Context, stackURL string) (_ *k6cloud.AuthenticationResponse, err error) {\n\tif stackURL == \"\" {\n\t\treturn nil, errors.New(\"stack URL is required to validate token\")\n\t}\n\tif _, err := url.Parse(stackURL); err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid stack URL: %w\", err)\n\t}\n\n\tres, hr, err := c.apiClient.AuthorizationAPI.\n\t\tAuth(c.authCtx(ctx)).\n\t\tXStackUrl(stackURL).\n\t\tExecute()\n\tdefer closeResponse(hr, &err)\n\n\tif err := CheckResponse(hr, err); err != nil {\n\t\treturn nil, err\n\t}\n\tif res == nil {\n\t\treturn nil, errUnknown\n\t}\n\n\treturn res, nil\n}\n","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/cloudapi/v6/api.go#L175-L211","documentation":"v6.Client.ValidateToken (internal/cloudapi/v6/api.go:193) rejects a stack URL that Go's url.Parse cannot parse before sending it as the X-Stack-Url header. url.Parse fails only on grossly malformed input — control characters, invalid bracket/percent syntax — so this error signals a corrupted configuration value, not a merely wrong hostname.","triggerScenarios":"K6_CLOUD_HOST or the passed stackURL containing control characters, a newline from shell quoting, invalid '%' sequences, or malformed IPv6 bracket syntax.","commonSituations":"Copy-pasting URLs with embedded line breaks; env vars assembled by templating that inject stray characters; config values double-quoted or escaped incorrectly in CI.","solutions":["Print the URL with %q to reveal hidden characters and fix the config source","Set a clean https://<stack-host> value with no trailing whitespace or newlines","Validate with url.ParseRequestURI at config-load time to fail with a clearer message","Prefer explicit flags/env over concatenated values when building the URL"],"exampleFix":"# before\nexport K6_CLOUD_HOST=\"https://my-stack.grafana.net \"  # trailing space/newline\n\n# after\nexport K6_CLOUD_HOST=\"https://my-stack.grafana.net\"","handlingStrategy":"validation","validationCode":"u, err := url.ParseRequestURI(stackURL)\nif err != nil || u.Scheme == \"\" || u.Host == \"\" {\n\treturn fmt.Errorf(\"stack URL %q is not a valid absolute URL\", stackURL)\n}","typeGuard":"func isParsableURL(s string) bool {\n\t_, err := url.Parse(s)\n\treturn err == nil\n}","tryCatchPattern":"if _, err := v6Client.ValidateToken(ctx, stackURL); err != nil {\n\tif strings.Contains(err.Error(), \"invalid stack URL\") {\n\t\tlog.Printf(\"stack URL %q is malformed; fix the config source\", stackURL)\n\t}\n\treturn err\n}","preventionTips":["Validate URLs at config load with %q logging to expose hidden characters","Avoid assembling URLs by string concatenation from templated values","Set host config as a single clean literal (https://<stack-host>)"],"tags":["url","validation","configuration","parsing"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}