{"record":{"id":"a2e272e1f3cc54c6","repo":"cloudflare/cloudflared","slug":"hostname-actually-a-url-s-has-invalid-format-s","errorCode":null,"errorMessage":"Hostname(actually a URL) %s has invalid format %s","messagePattern":"Hostname\\(actually a URL\\) (.+?) has invalid format (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"validation/validation.go","lineNumber":41,"sourceCode":"\nvar (\n\tsupportedProtocols = []string{\"http\", \"https\", \"rdp\", \"ssh\", \"smb\", \"tcp\"}\n\tvalidationTimeout  = time.Duration(30 * time.Second)\n)\n\nfunc ValidateHostname(hostname string) (string, error) {\n\tif hostname == \"\" {\n\t\treturn \"\", nil\n\t}\n\t// users gives url(contains schema) not just hostname\n\tif strings.Contains(hostname, \":\") || strings.Contains(hostname, \"%3A\") {\n\t\tunescapeHostname, err := url.PathUnescape(hostname)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"Hostname(actually a URL) %s has invalid escape characters %s\", hostname, unescapeHostname)\n\t\t}\n\t\thostnameToURL, err := url.Parse(unescapeHostname)\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"Hostname(actually a URL) %s has invalid format %s\", hostname, hostnameToURL)\n\t\t}\n\t\tasciiHostname, err := idna.ToASCII(hostnameToURL.Hostname())\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"Hostname(actually a URL) %s has invalid ASCII encdoing %s\", hostname, asciiHostname)\n\t\t}\n\t\treturn asciiHostname, nil\n\t}\n\n\tasciiHostname, err := idna.ToASCII(hostname)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"Hostname %s has invalid ASCII encdoing %s\", hostname, asciiHostname)\n\t}\n\thostnameToURL, err := url.Parse(asciiHostname)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"Hostname %s is not valid\", hostnameToURL)\n\t}\n\treturn hostnameToURL.RequestURI(), nil\n","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/cloudflare/cloudflared/blob/2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f/validation/validation.go#L23-L59","documentation":"ValidateHostname detects a URL-like input (contains ':' or '%3A'), unescapes it, and calls url.Parse. This error is returned when the unescaped string still fails url.Parse, i.e. the input is not a syntactically valid URL.","triggerScenarios":"Calling ValidateHostname with a URL-shaped string containing ':' or '%3A' that url.Parse rejects, e.g. \"http://[::1\" (unclosed bracket) or \"example.com:port\" with a non-numeric port.","commonSituations":"Users passing a malformed URL where a hostname is expected — bad IPv6 brackets, invalid port, embedded spaces or control characters in the URL.","solutions":["Fix the URL syntax: close IPv6 brackets (http://[::1]:8080), use a numeric port, remove control characters","Pass a bare hostname instead of a URL if only a host is intended","Pre-validate the input with url.Parse before calling ValidateHostname","Percent-encode spaces/unsafe characters properly within the URL"],"exampleFix":"// before\nhostname, err := validation.ValidateHostname(\"http://[::1\")\n// after\nhostname, err := validation.ValidateHostname(\"[::1]\")","handlingStrategy":"validation","validationCode":"func parsableURL(s string) bool {\n    if !strings.Contains(s, \":\") { return true }\n    unesc, err := url.PathUnescape(s)\n    if err != nil { return false }\n    _, err = url.Parse(unesc)\n    return err == nil\n}","typeGuard":null,"tryCatchPattern":"host, err := validation.ValidateHostname(input)\nif err != nil {\n    if strings.Contains(err.Error(), \"invalid format\") {\n        if _, perr := url.Parse(input); perr != nil {\n            return fmt.Errorf(\"%q is not a valid URL: %v\", input, perr)\n        }\n    }\n    return err\n}","preventionTips":["Validate the URL with url.Parse before passing URL-shaped values","Close IPv6 brackets and use numeric ports","Strip whitespace/control characters from config values"],"tags":["hostname","validation","url"],"backgroundTag":"invalid-url-format","analyzedSha":"2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f","analyzedAt":"2026-09-06T04:14:33.757Z","contentChangedAt":"2026-09-06T04:14:33.757Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}