fix: Improve error handling of UPnP feature

This commit is contained in:
Mike Wang
2024-05-29 01:26:42 +08:00
parent b3ac3d8651
commit ee1efa044d

View File

@@ -1170,7 +1170,11 @@ class UPnPDevice(object):
return s[1] return s[1]
def _get_srv_dict(self, url): def _get_srv_dict(self, url):
xmlcontent = self._http_get(url).decode("utf-8", "ignore") try:
xmlcontent = self._http_get(url).decode("utf-8", "ignore")
except (OSError, socket.error, ValueError) as ex:
Logger.error("upnp: failed to load service from %s: %s" % (url, ex))
return
services_d = {} services_d = {}
srv_str_l = re.findall(r"<service\s*>([\s\S]+?)</service\s*>", xmlcontent) srv_str_l = re.findall(r"<service\s*>([\s\S]+?)</service\s*>", xmlcontent)
for srv_str in srv_str_l: for srv_str in srv_str_l:
@@ -1714,14 +1718,26 @@ def natter_main(show_title = True):
# UPnP # UPnP
upnp = None upnp = None
upnp_router = None
upnp_ready = False
if upnp_enabled: if upnp_enabled:
upnp = UPnPClient(bind_ip=natter_addr[0], interface=bind_interface) upnp = UPnPClient(bind_ip=natter_addr[0], interface=bind_interface)
Logger.info() Logger.info()
Logger.info("Scanning UPnP Devices...") Logger.info("Scanning UPnP Devices...")
upnp_router = upnp.discover_router() try:
if upnp_router: upnp_router = upnp.discover_router()
Logger.info("[UPnP] Found router %s" % upnp_router.ipaddr) except (OSError, socket.error, ValueError) as ex:
Logger.error("upnp: failed to discover router: %s" % ex)
if upnp_router:
Logger.info("[UPnP] Found router %s" % upnp_router.ipaddr)
try:
upnp.forward("", bind_port, bind_ip, bind_port, udp=udp_mode, duration=interval*3) upnp.forward("", bind_port, bind_ip, bind_port, udp=udp_mode, duration=interval*3)
except (OSError, socket.error, ValueError) as ex:
Logger.error("upnp: failed to forward port: %s" % ex)
else:
upnp_ready = True
# Display route information # Display route information
Logger.info() Logger.info()
@@ -1804,7 +1820,7 @@ def natter_main(show_title = True):
Logger.error("keep-alive: connection broken: %s" % ex) Logger.error("keep-alive: connection broken: %s" % ex)
keep_alive.reset() keep_alive.reset()
need_recheck = True need_recheck = True
if upnp: if upnp_ready:
try: try:
upnp.renew() upnp.renew()
except (OSError, socket.error) as ex: except (OSError, socket.error) as ex: