File: normalize.go

package info (click to toggle)
sigsum-go 0.14.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,076 kB
  • sloc: sh: 809; makefile: 93
file content (33 lines) | stat: -rw-r--r-- 897 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package token

import (
	"fmt"
	"strings"

	"golang.org/x/net/idna"
	"golang.org/x/text/unicode/norm"
)

// Normalizes a utf8 domain name.
func NormalizeDomainName(domain string) (string, error) {
	n := norm.NFKC.String(domain) // Unicode normalization
	l := strings.ToLower(n)       // Unicode lowercase
	a, err := idna.ToASCII(l)     // A-label form (no-op for all-ascii labels)
	if err != nil {
		return "", fmt.Errorf("failed converting domain %q to a-label form: %v", l, err)
	}
	u, err := idna.ToUnicode(a)
	if err != nil {
		return "", fmt.Errorf("failed converting domain %q to u-label form: %v", a, err)
	}
	if !norm.NFKC.IsNormalString(u) {
		return "", fmt.Errorf("a-label domain %q was decoded to un-normalized unicode %q",
			a, u)
	}
	if strings.ToLower(u) != u {
		return "", fmt.Errorf("a-label domain %q was decoded to not all-lowercase unicode %q",
			a, u)
	}

	return u, nil
}