"bytes"
"encoding/xml"
"errors"
+ "fmt"
"io/ioutil"
"net"
"net/http"
return
}
socket := conn.(*net.UDPConn)
- defer socket.Close()
+ defer socket.Close() // nolint: errcheck
- err = socket.SetDeadline(time.Now().Add(3 * time.Second))
- if err != nil {
- return
+ if err := socket.SetDeadline(time.Now().Add(3 * time.Second)); err != nil {
+ return nil, err
}
st := "InternetGatewayDevice:1"
return
}
var n int
- n, _, err = socket.ReadFromUDP(answerBytes)
+ _, _, err = socket.ReadFromUDP(answerBytes)
+ if err != nil {
+ return
+ }
+
for {
n, _, err = socket.ReadFromUDP(answerBytes)
if err != nil {
break
}
answer := string(answerBytes[0:n])
- if strings.Index(answer, st) < 0 {
+ if !strings.Contains(answer, st) {
continue
}
// HTTP header field names are case-insensitive.
return
}
}
- err = errors.New("UPnP port discovery failed.")
+ err = errors.New("UPnP port discovery failed")
return
}
func getChildDevice(d *Device, deviceType string) *Device {
dl := d.DeviceList.Device
for i := 0; i < len(dl); i++ {
- if strings.Index(dl[i].DeviceType, deviceType) >= 0 {
+ if strings.Contains(dl[i].DeviceType, deviceType) {
return &dl[i]
}
}
func getChildService(d *Device, serviceType string) *UPNPService {
sl := d.ServiceList.Service
for i := 0; i < len(sl); i++ {
- if strings.Index(sl[i].ServiceType, serviceType) >= 0 {
+ if strings.Contains(sl[i].ServiceType, serviceType) {
return &sl[i]
}
}
if err != nil {
return
}
- defer r.Body.Close()
+ defer r.Body.Close() // nolint: errcheck
+
if r.StatusCode >= 400 {
err = errors.New(string(r.StatusCode))
return
return
}
a := &root.Device
- if strings.Index(a.DeviceType, "InternetGatewayDevice:1") < 0 {
+ if !strings.Contains(a.DeviceType, "InternetGatewayDevice:1") {
err = errors.New("No InternetGatewayDevice")
return
}
+
b := getChildDevice(a, "WANDevice:1")
if b == nil {
err = errors.New("No WANDevice")
var response *http.Response
response, err = soapRequest(n.serviceURL, "GetExternalIPAddress", message, n.urnDomain)
if response != nil {
- defer response.Body.Close()
+ defer response.Body.Close() // nolint: errcheck
}
if err != nil {
return
}
+
var envelope Envelope
data, err := ioutil.ReadAll(response.Body)
+ if err != nil {
+ return
+ }
+
reader := bytes.NewReader(data)
- xml.NewDecoder(reader).Decode(&envelope)
+ err = xml.NewDecoder(reader).Decode(&envelope)
+ if err != nil {
+ return
+ }
info = statusInfo{envelope.Soap.ExternalIP.IPAddress}
return
}
+// GetExternalAddress returns an external IP. If GetExternalIPAddress action
+// fails or IP returned is invalid, GetExternalAddress returns an error.
func (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) {
info, err := n.getExternalIPAddress()
if err != nil {
return
}
addr = net.ParseIP(info.externalIpAddress)
+ if addr == nil {
+ err = fmt.Errorf("Failed to parse IP: %v", info.externalIpAddress)
+ }
+
return
}
var response *http.Response
response, err = soapRequest(n.serviceURL, "AddPortMapping", message, n.urnDomain)
if response != nil {
- defer response.Body.Close()
+ defer response.Body.Close() // nolint: errcheck
}
if err != nil {
return
var response *http.Response
response, err = soapRequest(n.serviceURL, "DeletePortMapping", message, n.urnDomain)
if response != nil {
- defer response.Body.Close()
+ defer response.Body.Close() // nolint: errcheck
}
if err != nil {
return