{"record":{"id":"9b36cac19634fc1b","repo":"caddyserver/caddy","slug":"splitting-listener-address-v","errorCode":null,"errorMessage":"splitting listener address: %v","messagePattern":"splitting listener address: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"caddyconfig/httpcaddyfile/addresses.go","lineNumber":335,"sourceCode":"\t\tif defaultBindValues, ok := options[\"default_bind\"].([]ConfigValue); ok {\n\t\t\tfor _, defaultBindValue := range defaultBindValues {\n\t\t\t\tlnCfgVals = append(lnCfgVals, defaultBindValue.Value.(addressesWithProtocols))\n\t\t\t}\n\t\t} else {\n\t\t\tlnCfgVals = []addressesWithProtocols{{\n\t\t\t\taddresses: []string{\"\"},\n\t\t\t\tprotocols: nil,\n\t\t\t}}\n\t\t}\n\t}\n\n\t// use a map to prevent duplication\n\tlisteners := map[string]map[string]struct{}{}\n\tfor _, lnCfgVal := range lnCfgVals {\n\t\tfor _, lnAddr := range lnCfgVal.addresses {\n\t\t\tlnNetw, lnHost, _, err := caddy.SplitNetworkAddress(lnAddr)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"splitting listener address: %v\", err)\n\t\t\t}\n\t\t\tnetworkAddr, err := caddy.ParseNetworkAddress(caddy.JoinNetworkAddress(lnNetw, lnHost, lnPort))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"parsing network address: %v\", err)\n\t\t\t}\n\t\t\tif _, ok := listeners[addr.String()]; !ok {\n\t\t\t\tlisteners[networkAddr.String()] = map[string]struct{}{}\n\t\t\t}\n\t\t\tfor _, protocol := range lnCfgVal.protocols {\n\t\t\t\tlisteners[networkAddr.String()][protocol] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn listeners, nil\n}\n\n// addressesWithProtocols associates a list of listen addresses","sourceCodeStart":317,"sourceCodeEnd":353,"githubUrl":"https://github.com/caddyserver/caddy/blob/50e54ee279aa1e504fe218ca49ab6ae16c100410/caddyconfig/httpcaddyfile/addresses.go#L317-L353","documentation":"A bind directive address (or default_bind value) could not be split by caddy.SplitNetworkAddress into network/host/port components. This runs after scheme/port resolution, on every address from the block's bind pile, before rejoining with the site's port.","triggerScenarios":"bind (or default_bind) with a malformed address: empty host where one is required, invalid network prefix syntax (e.g. 'tcp/:' or 'unix/' without a path), stray brackets/colons, or a port appearing where only host/network are expected.","commonSituations":"Typos like 'bind 127.0.0.1:' , 'bind tcp//eth0', or copy-pasting full URLs (http://127.0.0.1) into bind instead of bare addresses.","solutions":["Check each bind argument; it must be a bare address, optionally with a network prefix like tcp/ or unix/ (e.g. 'bind 127.0.0.1', 'bind tcp/0.0.0.0', 'bind unix//run/caddy.sock')","Remove any scheme (http://) from bind values","Read the wrapped SplitNetworkAddress error for the precise reason","Validate the whole file with `caddy adapt --config Caddyfile`"],"exampleFix":"# before\nbind http://127.0.0.1\n# after\nbind 127.0.0.1","handlingStrategy":"validation","validationCode":"for _, b := range bindAddresses {\n    if _, _, _, err := caddy.SplitNetworkAddress(b); err != nil {\n        return fmt.Errorf(\"bad bind address %q: %w\", b, err)\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use bare addresses in bind: '127.0.0.1', 'tcp/0.0.0.0', 'unix//run/caddy.sock'","Never include schemes or URLs in bind","Adapt configs in CI to validate bind syntax"],"tags":["caddyfile","bind","listener","network-address"],"backgroundTag":null,"analyzedSha":"50e54ee279aa1e504fe218ca49ab6ae16c100410","analyzedAt":"2026-08-15T09:20:21.641Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}