valyala/fasthttp · error

invalid ipv6 address

Error message

invalid ipv6 address

What it means

After host/zone checks pass, validateIPv6Literal validates the actual IPv6 address bytes inside the brackets. errInvalidIPv6Address is returned when the address itself cannot be parsed — wrong number of groups, invalid hex digits, bad embedded IPv4, or misplaced '::'.

Solutions

  1. Correct the address syntax (validate with net.ParseIP after stripping brackets before use).
  2. Resolve hostnames to IPs and format with net.IP.String() wrapped in brackets instead of hand-writing addresses.
  3. Use URI.Parse with a full URL and handle the error to catch malformed literals early.

Example fix

// before
req.Header.SetHost("[1:2:3]") // invalid ipv6 address
// after
ip := net.ParseIP("fd00::1")
req.Header.SetHost("[" + ip.String() + "]") // "[fd00::1]"
Defensive patterns

Strategy: validation

Validate before calling

func validIPv6Addr(host string) bool {
    inner := strings.TrimSuffix(strings.TrimPrefix(host, "["), "]")
    if i := strings.IndexByte(inner, '%'); i >= 0 {
        inner = inner[:i]
    }
    ip := net.ParseIP(inner)
    return ip != nil && strings.Contains(inner, ":")
}

Prevention

When it happens

Trigger: Setting a host such as '[zz::1]', '[1:2:3]' (too few groups, no ::), '[::1::2]' (multiple '::'), or '[1.2.3.4]' through URI parsing / SetHost paths.

Common situations: Typos when hardcoding IPv6 endpoints in config; interpolating variables into host strings; DNS returning unexpected literals that code blindly brackets before passing to fasthttp.

Related errors


AI-assisted analysis of valyala/fasthttp@c96f600972 (2026-08-31). Data as JSON: /api/errors/8d06c379522ebaf0. Report an issue: GitHub.

Appendix: source

Thrown at ipv6.go:11

package fasthttp

import (
	"bytes"
	"errors"
)

var (
	errInvalidIPv6Host    = errors.New("invalid ipv6 host")
	errInvalidIPv6Zone    = errors.New("invalid ipv6 zone")
	errInvalidIPv6Address = errors.New("invalid ipv6 address")
)

func validateIPv6Literal(host []byte) error {
	if len(host) == 0 || host[0] != '[' {
		return nil
	}
	end := bytes.IndexByte(host, ']')
	if end < 0 || end == 1 {
		return errInvalidIPv6Host
	}
	addr := host[1:end]

	// Optional zone.
	if zi := bytes.IndexByte(addr, '%'); zi >= 0 {
		if zi == len(addr)-1 {
			return errInvalidIPv6Zone
		}
		addr = addr[:zi]

View on GitHub (pinned to c96f600972)