public boolean parseIp(@Nullable String ipString) {
      if (ipString == null || ipString.isEmpty()) return false;
      IpFamily format = detectFamily(ipString);
      if (format == IpFamily.IPv4) {
        ipv4 = ipString;
        ipv4Bytes = getIpv4Bytes(ipv4);
      } else if (format == IpFamily.IPv4Embedded) {
        ipv4 = ipString.substring(ipString.lastIndexOf(':') + 1);
        ipv4Bytes = getIpv4Bytes(ipv4);
      } else if (format == IpFamily.IPv6) {
        byte[] addressBytes = textToNumericFormatV6(ipString);
        if (addressBytes == null) return false;
        ipv6 = writeIpV6(addressBytes); // ensures consistent format
        ipv6Bytes = addressBytes;
      } else {
        return false;
      }
      return true;
    }
Returns true if {@link Endpoint#ipv4()} or {@link Endpoint#ipv6()} could be parsed from the
input.

<p>Returns boolean not this for conditional parsing. For example:
<pre>{@code
if (!builder.parseIp(input.getHeader("X-Forwarded-For"))) {
  builder.parseIp(input.getRemoteAddr());
}
}</pre>

@see #parseIp(InetAddress)
zipkin/src/main/java/zipkin2/Endpoint.java