{"record":{"id":"4ca36d7e9d8ff535","repo":"sgl-project/sglang","slug":"missing-closing-bracket-in-ipv6-address-addr-r","errorCode":null,"errorMessage":"Missing closing bracket in IPv6 address: {addr!r}","messagePattern":"Missing closing bracket in IPv6 address: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/utils/network.py","lineNumber":532,"sourceCode":"\n            [::1]:8000          → NetworkAddress(\"::1\", 8000)\n            127.0.0.1:8000      → NetworkAddress(\"127.0.0.1\", 8000)\n            my-hostname:8000    → NetworkAddress(\"my-hostname\", 8000)\n\n        IPv6 addresses **must** be bracketed.  Bare ``::1:8000`` is\n        ambiguous and will raise ``ValueError``.\n\n        Raises:\n            ValueError: If the string cannot be unambiguously parsed.\n        \"\"\"\n        if not addr:\n            raise ValueError(\"Empty address string\")\n\n        # --- Bracketed IPv6: [addr]:port ---\n        if addr.startswith(\"[\"):\n            close = addr.find(\"]\")\n            if close == -1:\n                raise ValueError(f\"Missing closing bracket in IPv6 address: {addr!r}\")\n            host = addr[1:close]\n            if not _is_ipv6(host):\n                raise ValueError(f\"Invalid IPv6 address inside brackets: {host!r}\")\n            rest = addr[close + 1 :]\n            if not rest.startswith(\":\") or len(rest) < 2:\n                raise ValueError(\n                    f\"Expected ':port' after closing bracket, got: {rest!r}\"\n                )\n            return NetworkAddress(host, _parse_port(rest[1:]))\n\n        # --- Plain host:port (IPv4 / hostname) ---\n        if \":\" not in addr:\n            raise ValueError(f\"Missing port in address (expected host:port): {addr!r}\")\n        host, port_str = addr.rsplit(\":\", 1)\n        if not host:\n            raise ValueError(f\"Empty host in address: {addr!r}\")\n        # Guard against bare IPv6 slipping through\n        if \":\" in host and _is_ipv6(host):","sourceCodeStart":514,"sourceCodeEnd":550,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/utils/network.py#L514-L550","documentation":"In NetworkAddress.parse, a leading '[' enters the bracketed-IPv6 branch; if no matching ']' is found the string is malformed (e.g., '[::1' or '[::1]8080' missing the port separator handled later) and ValueError is raised naming the address.","triggerScenarios":"parse(\"[fe80::1\") — an IPv6 endpoint where the closing bracket was lost in quoting/shell interpolation.","commonSituations":"Shell commands dropping brackets, YAML configs mangling [..] syntax, or hand-built address strings concatenating host and port without the ']:' separator.","solutions":["Use the canonical form [ipv6]:port, e.g. \"[::1]:8000\".","Quote the address in shell/YAML to prevent bracket stripping.","Construct via NetworkAddress(host, port) directly when building programmatically."],"exampleFix":"# before\nNetworkAddress.parse(\"fe80::1:8000\")   # ambiguous / unbracketed\n\n# after\nNetworkAddress.parse(\"[fe80::1]:8000\")","handlingStrategy":"validation","validationCode":"def valid_endpoint(s: str) -> bool:\n    return s.count(\"[\") == s.count(\"]\") and (not s.startswith(\"[\") or s.find(\"]\") != -1)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always quote IPv6 endpoints ([::1]:port) in shells and YAML.","Build addresses with NetworkAddress(host, port) instead of string concatenation."],"tags":["network","ipv6","parsing"],"backgroundTag":"invalid-endpoint-string","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}