brutella/hkcam

SetupEndpoints issue in a special situation

Opened this issue · 1 comments

0x5e commented

Hi @brutella ,
Thanks for this great project at first :)

I'm testing this project running on my MBP and found a small issue:
When iPhone connects the usb cable with MBP, the camera live stream usually not working in Home App.

And I found when usb cable connected, iPhone sometimes request hap server directly from the wired network, not via wifi.

hkcam/setup.go

Lines 89 to 98 in 959d664

iface, err := ifaceOfRequest(r)
if err != nil {
log.Debug.Println(err)
return
}
ip, err := ipAtInterface(*iface, req.ControllerAddr.IPVersion)
if err != nil {
log.Debug.Println(err)
return
}

The iface value is en14 instead of en0. then the server failed to get ip of en14 because it only have a ipv6 address.

Instead of get localIP from r.Context().Value(http.LocalAddrContextKey), my solution is like this:

  1. Obtain remoteIP from req.ControllerAddr.IPAddr
  2. Enumerate net.Interfaces(), find the proper subnet that contains remoteIP, return the ip of this interface.
func FindLocalIPForRemoteIP(remoteIP string) string {
	ifaces, _ := net.Interfaces()
	for _, iface := range ifaces {
		addrs, _ := iface.Addrs()
		for _, addr := range addrs {
			ip, subnet, _ := net.ParseCIDR(addr.String())
			if subnet.Contains(net.ParseIP(remoteIP)) {
				return ip.String()
			}
		}
	}
	return ""
}


localIP := util.FindLocalIPForRemoteIP(req.ControllerAddr.IPAddr)
if localIP == "" {
	log.Debug.Println("Failed to get localIP")
	return
}

Sounds good to me. Happy to accept a pull request. 😉