{"record":{"id":"9e2255a6e0b606d0","repo":"openzipkin/zipkin","slug":"s-contains-an-invalid-ipv6-literal","errorCode":null,"errorMessage":"%s contains an invalid IPv6 literal","messagePattern":"(.+?) contains an invalid IPv6 literal","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"zipkin-storage/cassandra/src/main/java/zipkin2/storage/cassandra/internal/HostAndPort.java","lineNumber":61,"sourceCode":"  }\n\n  @Override public String toString() {\n    return \"HostAndPort{host=\" + host + \", port=\" + port + \"}\";\n  }\n\n  /**\n   * Constructs a host-port pair from the given string, defaulting to the indicated port if absent\n   */\n  public static HostAndPort fromString(String hostPort, int defaultPort) {\n    if (hostPort == null) throw new NullPointerException(\"hostPort == null\");\n\n    String host = hostPort;\n    int endHostIndex = hostPort.length();\n    if (hostPort.startsWith(\"[\")) { // Bracketed IPv6\n      endHostIndex = hostPort.lastIndexOf(']') + 1;\n      host = hostPort.substring(1, endHostIndex == 0 ? 1 : endHostIndex - 1);\n      if (!Endpoint.newBuilder().parseIp(host)) { // reuse our IPv6 validator\n        throw new IllegalArgumentException(hostPort + \" contains an invalid IPv6 literal\");\n      }\n    } else {\n      int colonIndex = hostPort.indexOf(':'), nextColonIndex = hostPort.lastIndexOf(':');\n      if (colonIndex >= 0) {\n        if (colonIndex == nextColonIndex) { // only 1 colon\n          host = hostPort.substring(0, colonIndex);\n          endHostIndex = colonIndex;\n        } else if (!Endpoint.newBuilder().parseIp(hostPort)) { // reuse our IPv6 validator\n          throw new IllegalArgumentException(hostPort + \" is an invalid IPv6 literal\");\n        }\n      }\n    }\n    if (host.isEmpty()) throw new IllegalArgumentException(hostPort + \" has an empty host\");\n    if (endHostIndex + 1 < hostPort.length() && hostPort.charAt(endHostIndex) == ':') {\n      return new HostAndPort(host, validatePort(hostPort.substring(endHostIndex + 1), hostPort));\n    }\n    return new HostAndPort(host, defaultPort);\n  }","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/openzipkin/zipkin/blob/878ce2a1fad54ca941d17fdcf2e1d924b148eb1f/zipkin-storage/cassandra/src/main/java/zipkin2/storage/cassandra/internal/HostAndPort.java#L43-L79","documentation":"Thrown by HostAndPort.fromString for a bracketed IPv6 literal like '[garbage]:9042' whose inner address fails the Endpoint IPv6 validator. Bracketed forms are expected to contain a valid IPv6 address; anything else is rejected with IllegalArgumentException('%s contains an invalid IPv6 literal').","triggerScenarios":"Passing '[::zz]:9042', '[]', or a bracketed host that is actually a hostname; malformed copy-paste of IPv6 contact points.","commonSituations":"IPv6 contact-point config where the address has a typo, missing hex digits, or the operator bracketed a DNS name by mistake.","solutions":["Correct the IPv6 literal, e.g. '[2001:db8::1]:9042'.","If the value is a hostname, remove the brackets: 'cassandra.example.com:9042'.","Validate candidate IPv6 literals with a regex/Inet6Address parse before config load."],"exampleFix":"# before\nCASSANDRA_CONTACT_POINTS=[2001:db8::zz]:9042\n\n# after\nCASSANDRA_CONTACT_POINTS=[2001:db8::1]:9042","handlingStrategy":"validation","validationCode":"static boolean isBracketedIpv6Literal(String s) {\n  return s != null && s.startsWith(\"[\") && s.contains(\"]\")\n    && Endpoint.newBuilder().parseIp(s.substring(1, s.lastIndexOf(']')));\n}\nif (hostPort.startsWith(\"[\") && !isBracketedIpv6Literal(hostPort)) throw new IllegalArgumentException(\"Bad IPv6: \" + hostPort);","typeGuard":"static boolean isValidBracketedIpv6(String s) { return s != null && s.startsWith(\"[\") && s.lastIndexOf(']') > 1 && Endpoint.newBuilder().parseIp(s.substring(1, s.lastIndexOf(']'))); }","tryCatchPattern":"catch (IllegalArgumentException e) { if (e.getMessage().endsWith(\"contains an invalid IPv6 literal\")) failConfigValidation(e.getMessage()); else throw e; }","preventionTips":["Validate IPv6 literals with Inet6Address/Endpoint.parseIp during config linting.","Only bracket actual IPv6 addresses, never hostnames."],"tags":["cassandra","zipkin","ipv6","contact-points","validation"],"backgroundTag":null,"analyzedSha":"878ce2a1fad54ca941d17fdcf2e1d924b148eb1f","analyzedAt":"2026-08-14T15:17:09.895Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}