Skip to content

Commit

Permalink
#48: Add local address information
Browse files Browse the repository at this point in the history
  • Loading branch information
mh-cbon authored and huin committed Mar 22, 2022
1 parent ca81a64 commit e739c71
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
8 changes: 8 additions & 0 deletions goupnp.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ import (
"encoding/xml"
"fmt"
"io"
"net"
"net/http"
"net/url"
"time"

"github.com/huin/goupnp/httpu"
"github.com/huin/goupnp/ssdp"
)

Expand Down Expand Up @@ -63,6 +65,9 @@ type MaybeRootDevice struct {
// the discovery of a device, regardless of if there was an error probing it.
Location *url.URL

// The address from which the device was discovered (if known - otherwise nil).
LocalAddr net.IP

// Any error encountered probing a discovered device.
Err error
}
Expand Down Expand Up @@ -99,6 +104,9 @@ func DiscoverDevices(searchTarget string) ([]MaybeRootDevice, error) {
} else {
maybe.Root = root
}
if i := response.Header.Get(httpu.LocalAddressHeader); len(i) > 0 {
maybe.LocalAddr = net.ParseIP(i)
}
}

return results, nil
Expand Down
7 changes: 7 additions & 0 deletions httpu/httpu.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,16 @@ func (httpu *HTTPUClient) Do(
continue
}

// Set the related local address used to discover the device.
if a, ok := httpu.conn.LocalAddr().(*net.UDPAddr); ok {
response.Header.Add(LocalAddressHeader, a.IP.String())
}

responses = append(responses, response)
}

// Timeout reached - return discovered responses.
return responses, nil
}

const LocalAddressHeader = "goupnp-local-address"
19 changes: 18 additions & 1 deletion service_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package goupnp

import (
"fmt"
"net"
"net/url"

"github.com/huin/goupnp/soap"
Expand All @@ -17,6 +18,7 @@ type ServiceClient struct {
RootDevice *RootDevice
Location *url.URL
Service *Service
localAddr net.IP
}

// NewServiceClients discovers services, and returns clients for them. err will
Expand All @@ -36,7 +38,7 @@ func NewServiceClients(searchTarget string) (clients []ServiceClient, errors []e
continue
}

deviceClients, err := NewServiceClientsFromRootDevice(maybeRootDevice.Root, maybeRootDevice.Location, searchTarget)
deviceClients, err := newServiceClientsFromRootDevice(maybeRootDevice.Root, maybeRootDevice.Location, searchTarget, maybeRootDevice.LocalAddr)
if err != nil {
errors = append(errors, err)
continue
Expand All @@ -61,6 +63,15 @@ func NewServiceClientsByURL(loc *url.URL, searchTarget string) ([]ServiceClient,
// a given root device. The loc parameter is simply assigned to the
// Location attribute of the returned ServiceClient(s).
func NewServiceClientsFromRootDevice(rootDevice *RootDevice, loc *url.URL, searchTarget string) ([]ServiceClient, error) {
return newServiceClientsFromRootDevice(rootDevice, loc, searchTarget, nil)
}

func newServiceClientsFromRootDevice(
rootDevice *RootDevice,
loc *url.URL,
searchTarget string,
lAddr net.IP,
) ([]ServiceClient, error) {
device := &rootDevice.Device
srvs := device.FindService(searchTarget)
if len(srvs) == 0 {
Expand All @@ -75,6 +86,7 @@ func NewServiceClientsFromRootDevice(rootDevice *RootDevice, loc *url.URL, searc
RootDevice: rootDevice,
Location: loc,
Service: srv,
localAddr: lAddr,
})
}
return clients, nil
Expand All @@ -86,3 +98,8 @@ func NewServiceClientsFromRootDevice(rootDevice *RootDevice, loc *url.URL, searc
func (client *ServiceClient) GetServiceClient() *ServiceClient {
return client
}

// LocalAddr returns the address from which the device was discovered (if known - otherwise empty).
func (client *ServiceClient) LocalAddr() net.IP {
return client.localAddr
}

0 comments on commit e739c71

Please sign in to comment.