tsirysndr / upnp-client-rs

This is a UPnP client library for Rust.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Parser panics when device has no serviceList

seijikun opened this issue · comments

Thank you very much for this awesome library!
I was searching for a lib that I can use to send media urls to my Kodi instance...
Opened the crate page of upnp-client, scrolled down and was very surprised to see a code example of exactly what I need!

Unfortunately, we seem to have a device in our network that doesn't have a serviceList entry, which sometimes makes the parser crash in line 100.

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/upnp-client-0.1.7/src/parser.rs:100:33
stack backtrace:
   0: rust_begin_unwind
             at /rustc/f15f0ea73972786e426732c5b92ba9a904b866c4/library/std/src/panicking.rs:579:5
   1: core::panicking::panic_fmt
             at /rustc/f15f0ea73972786e426732c5b92ba9a904b866c4/library/core/src/panicking.rs:64:14
   2: core::panicking::panic
             at /rustc/f15f0ea73972786e426732c5b92ba9a904b866c4/library/core/src/panicking.rs:114:5
   3: core::option::Option<T>::unwrap
             at /rustc/f15f0ea73972786e426732c5b92ba9a904b866c4/library/core/src/option.rs:942:21
   4: upnp_client::parser::parse_services::{{closure}}
             at /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/upnp-client-0.1.7/src/parser.rs:100:20
   5: upnp_client::parser::parse_location::{{closure}}
             at /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/upnp-client-0.1.7/src/parser.rs:70:59
   6: upnp_client::discovery::discover_pnp_locations::{{closure}}
             at /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/upnp-client-0.1.7/src/discovery.rs:53:41
   7: <async_stream::async_stream::AsyncStream<T,U> as futures_core::stream::Stream>::poll_next
             at /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/async-stream-0.3.5/src/async_stream.rs:56:13
   8: <core::pin::Pin<P> as futures_core::stream::Stream>::poll_next
             at /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-core-0.3.28/src/stream.rs:120:9
   9: futures_util::stream::stream::StreamExt::poll_next_unpin
             at /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.28/src/stream/stream/mod.rs:1632:9
  10: <futures_util::stream::stream::next::Next<St> as core::future::future::Future>::poll
             at /home/seiji/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.28/src/stream/stream/next.rs:32:9
  11: my_upnp_test::main::{{closure}}
             at ./src/main.rs:17:44
   ...

This is the value of xml_root when it crashes:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<device>
		<deviceType>urn:schemas-upnp-org:device:WLANAccessPointDevice:1</deviceType>
		<friendlyName>NETGEAR47B64C</friendlyName>
		<manufacturer>NETGEAR</manufacturer>
		<manufacturerURL>https://www.netgear.com</manufacturerURL>
		<modelDescription>NETGEAR Dual Band Access Point</modelDescription>
		<modelName>WAX214</modelName>
		<modelNumber>WAX214</modelNumber>
		<modelURL>https://www.netgear.com</modelURL>
		<firmwareVersion>2.1.1.3</firmwareVersion>
		<insightMode>0</insightMode>
		<serialNumber>XXXXXXXXX</serialNumber>
		<UDN>uuid:919ba4ec-ec93-490f-b0e3-80CC9C47B64C</UDN>
		<presentationURL>http://xxxxxx/</presentationURL>
	</device>
</root>

Thank you for your interest in the project, I'm very happy that it will help other people :-) I looked at the solution you proposed and it looks good to me