| | |
| | |
| | |
| |
|
| | package cookiejar |
| |
|
| | |
| |
|
| | import ( |
| | "fmt" |
| | "net/http/internal/ascii" |
| | "strings" |
| | "unicode/utf8" |
| | ) |
| |
|
| | |
| | |
| | |
| | |
| | const ( |
| | base int32 = 36 |
| | damp int32 = 700 |
| | initialBias int32 = 72 |
| | initialN int32 = 128 |
| | skew int32 = 38 |
| | tmax int32 = 26 |
| | tmin int32 = 1 |
| | ) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | func encode(prefix, s string) (string, error) { |
| | output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) |
| | copy(output, prefix) |
| | delta, n, bias := int32(0), initialN, initialBias |
| | b, remaining := int32(0), int32(0) |
| | for _, r := range s { |
| | if r < utf8.RuneSelf { |
| | b++ |
| | output = append(output, byte(r)) |
| | } else { |
| | remaining++ |
| | } |
| | } |
| | h := b |
| | if b > 0 { |
| | output = append(output, '-') |
| | } |
| | for remaining != 0 { |
| | m := int32(0x7fffffff) |
| | for _, r := range s { |
| | if m > r && r >= n { |
| | m = r |
| | } |
| | } |
| | delta += (m - n) * (h + 1) |
| | if delta < 0 { |
| | return "", fmt.Errorf("cookiejar: invalid label %q", s) |
| | } |
| | n = m |
| | for _, r := range s { |
| | if r < n { |
| | delta++ |
| | if delta < 0 { |
| | return "", fmt.Errorf("cookiejar: invalid label %q", s) |
| | } |
| | continue |
| | } |
| | if r > n { |
| | continue |
| | } |
| | q := delta |
| | for k := base; ; k += base { |
| | t := k - bias |
| | if t < tmin { |
| | t = tmin |
| | } else if t > tmax { |
| | t = tmax |
| | } |
| | if q < t { |
| | break |
| | } |
| | output = append(output, encodeDigit(t+(q-t)%(base-t))) |
| | q = (q - t) / (base - t) |
| | } |
| | output = append(output, encodeDigit(q)) |
| | bias = adapt(delta, h+1, h == b) |
| | delta = 0 |
| | h++ |
| | remaining-- |
| | } |
| | delta++ |
| | n++ |
| | } |
| | return string(output), nil |
| | } |
| |
|
| | func encodeDigit(digit int32) byte { |
| | switch { |
| | case 0 <= digit && digit < 26: |
| | return byte(digit + 'a') |
| | case 26 <= digit && digit < 36: |
| | return byte(digit + ('0' - 26)) |
| | } |
| | panic("cookiejar: internal error in punycode encoding") |
| | } |
| |
|
| | |
| | func adapt(delta, numPoints int32, firstTime bool) int32 { |
| | if firstTime { |
| | delta /= damp |
| | } else { |
| | delta /= 2 |
| | } |
| | delta += delta / numPoints |
| | k := int32(0) |
| | for delta > ((base-tmin)*tmax)/2 { |
| | delta /= base - tmin |
| | k += base |
| | } |
| | return k + (base-tmin+1)*delta/(delta+skew) |
| | } |
| |
|
| | |
| | |
| |
|
| | |
| | const acePrefix = "xn--" |
| |
|
| | |
| | |
| | |
| | func toASCII(s string) (string, error) { |
| | if ascii.Is(s) { |
| | return s, nil |
| | } |
| | labels := strings.Split(s, ".") |
| | for i, label := range labels { |
| | if !ascii.Is(label) { |
| | a, err := encode(acePrefix, label) |
| | if err != nil { |
| | return "", err |
| | } |
| | labels[i] = a |
| | } |
| | } |
| | return strings.Join(labels, "."), nil |
| | } |
| |
|