| package router | |
| import ( | |
| "fmt" | |
| "regexp" | |
| "strconv" | |
| "strings" | |
| ) | |
| const hostPattern = "^.*ip([0-9]{1,3}-[0-9]{1,3}-[0-9]{1,3}-[0-9]{1,3})-([0-9|a-z]+)(?:-?([0-9]{1,5}))?(?:\\.([a-z|A-Z|0-9|_|\\-\\.]+))?(?:\\:([0-9]{1,5}))?$" | |
| var hostRegex *regexp.Regexp | |
| func init() { | |
| hostRegex = regexp.MustCompile(hostPattern) | |
| } | |
| type HostOpts struct { | |
| TLD string | |
| EncodedPort int | |
| Port int | |
| } | |
| type HostInfo struct { | |
| SessionId string | |
| InstanceIP string | |
| TLD string | |
| EncodedPort int | |
| Port int | |
| } | |
| func EncodeHost(sessionId, instanceIP string, opts HostOpts) string { | |
| encodedIP := strings.Replace(instanceIP, ".", "-", -1) | |
| sub := fmt.Sprintf("ip%s-%s", encodedIP, sessionId) | |
| if opts.EncodedPort > 0 { | |
| sub = fmt.Sprintf("%s-%d", sub, opts.EncodedPort) | |
| } | |
| if opts.TLD != "" { | |
| sub = fmt.Sprintf("%s.%s", sub, opts.TLD) | |
| } | |
| if opts.Port > 0 { | |
| sub = fmt.Sprintf("%s:%d", sub, opts.Port) | |
| } | |
| return sub | |
| } | |
| func DecodeHost(host string) (HostInfo, error) { | |
| info := HostInfo{} | |
| matches := hostRegex.FindStringSubmatch(host) | |
| if len(matches) != 6 { | |
| return HostInfo{}, fmt.Errorf("Couldn't find host in string") | |
| } | |
| info.InstanceIP = strings.Replace(matches[1], "-", ".", -1) | |
| info.SessionId = matches[2] | |
| info.TLD = matches[4] | |
| if matches[3] != "" { | |
| i, _ := strconv.Atoi(matches[3]) | |
| info.EncodedPort = i | |
| } | |
| if matches[5] != "" { | |
| i, _ := strconv.Atoi(matches[5]) | |
| info.Port = i | |
| } | |
| return info, nil | |
| } | |