41 lines
1.1 KiB
Go
41 lines
1.1 KiB
Go
|
package ssdp
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net"
|
||
|
)
|
||
|
|
||
|
// LocationProvider provides address for Location header which can be reached from
|
||
|
// "from" address network.
|
||
|
type LocationProvider interface {
|
||
|
// Location provides an address be reachable from the network located
|
||
|
// by "from" address or "ifi" interface.
|
||
|
// One of "from" or "ifi" must not be nil.
|
||
|
Location(from net.Addr, ifi *net.Interface) string
|
||
|
}
|
||
|
|
||
|
// LocationProviderFunc type is an adapter to allow the use of ordinary
|
||
|
// functions are location providers.
|
||
|
type LocationProviderFunc func(net.Addr, *net.Interface) string
|
||
|
|
||
|
func (f LocationProviderFunc) Location(from net.Addr, ifi *net.Interface) string {
|
||
|
return f(from, ifi)
|
||
|
}
|
||
|
|
||
|
type fixedLocation string
|
||
|
|
||
|
func (s fixedLocation) Location(net.Addr, *net.Interface) string {
|
||
|
return string(s)
|
||
|
}
|
||
|
|
||
|
func toLocationProvider(v interface{}) (LocationProvider, error) {
|
||
|
switch w := v.(type) {
|
||
|
case string:
|
||
|
return fixedLocation(w), nil
|
||
|
case LocationProvider:
|
||
|
return w, nil
|
||
|
default:
|
||
|
return nil, fmt.Errorf("location should be a string or a ssdp.LocationProvider but got %T", w)
|
||
|
}
|
||
|
}
|