in preinit_connection.go [183:228]
func parseRemotePeer(p initParams, remoteAddr net.Addr) (PeerInfo, peerAddressComponents, error) {
var (
remotePeer PeerInfo
remotePeerAddress peerAddressComponents
ok bool
)
if remotePeer.HostPort, ok = p[InitParamHostPort]; !ok {
return remotePeer, remotePeerAddress, fmt.Errorf("header %v is required", InitParamHostPort)
}
if remotePeer.ProcessName, ok = p[InitParamProcessName]; !ok {
return remotePeer, remotePeerAddress, fmt.Errorf("header %v is required", InitParamProcessName)
}
// If the remote host:port is ephemeral, use the socket address as the
// host:port and set IsEphemeral to true.
if isEphemeralHostPort(remotePeer.HostPort) {
remotePeer.HostPort = remoteAddr.String()
remotePeer.IsEphemeral = true
}
remotePeer.Version.Language = p[InitParamTChannelLanguage]
remotePeer.Version.LanguageVersion = p[InitParamTChannelLanguageVersion]
remotePeer.Version.TChannelVersion = p[InitParamTChannelVersion]
address := remotePeer.HostPort
if sHost, sPort, err := net.SplitHostPort(address); err == nil {
address = sHost
if p, err := strconv.ParseUint(sPort, 10, 16); err == nil {
remotePeerAddress.port = uint16(p)
}
}
if address == "localhost" {
remotePeerAddress.ipv4 = 127<<24 | 1
} else if ip := net.ParseIP(address); ip != nil {
if ip4 := ip.To4(); ip4 != nil {
remotePeerAddress.ipv4 = binary.BigEndian.Uint32(ip4)
} else {
remotePeerAddress.ipv6 = address
}
} else {
remotePeerAddress.hostname = address
}
return remotePeer, remotePeerAddress, nil
}