-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
server.go
59 lines (53 loc) · 1.2 KB
/
server.go
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package main
import (
"fmt"
"strconv"
"strings"
)
type server struct {
host string
port uint16
}
func getHostAndPort(addr string) (server, error) {
parts := strings.Split(addr, ":")
// IPv4
if len(parts) == 1 {
return server{parts[0], 9000}, nil
}
if len(parts) == 2 {
u, err := strconv.ParseUint(parts[1], 10, 16)
return server{parts[0], uint16(u)}, err
}
// IPv6
if addr[0] != '[' {
return server{fmt.Sprintf("[%s]", addr), 9000}, nil
}
if addr[len(addr)-1] == ']' {
return server{addr, 9000}, nil
}
u, err := strconv.ParseUint(parts[len(parts)-1], 10, 16)
addr = strings.Join(parts[:len(parts)-1], ":")
return server{addr, uint16(u)}, err
}
func getServers(addrstr string) ([]server, error) {
arr := strings.Split(addrstr, ",")
servers := make([]server, len(arr))
for i, addr := range arr {
addr = strings.TrimSpace(addr)
server, err := getHostAndPort(addr)
if err != nil {
return nil, err
}
servers[i] = server
}
return servers, nil
}
func serversToInterface(servers []server) [][]interface{} {
ret := make([][]interface{}, len(servers))
for i, svr := range servers {
ret[i] = make([]interface{}, 2)
ret[i][0] = svr.host
ret[i][1] = int(svr.port)
}
return ret
}