simple-ssdp 0.1.0

A SSDP implementation
Documentation
# SSDP
This is an implementation of the RFC draft from [SSDP](https://datatracker.ietf.org/doc/html/draft-cai-ssdp-v1-03).
However, it should be mostly compatible with the newer [UPnP](https://openconnectivity.org/upnp-specs/UPnP-arch-DeviceArchitecture-v2.0-20200417.pdf)

Feel free to contribute at any point.

# Planned features
 - [x] Send `M-SEARCH` request
 - [x] Answer `M-SEARCH` request
 - [x] Store a list of all services answering `M-SEARCH`
 - [ ] Send ALIVE when service comes up
 - [ ] Send BYEBYE when service goes down
 - [ ] Accept header in any order (right now only headers in a pre-defined order are working)

# Examples

### Service
To launch a Service that listens and answers to `M-SEARCH` requests do:

```rust
let desc = ServiceDescription {
    usn_uri: "uuid:83760048-2d32-4e48-854f-f63a8fa9fd09".to_string(), // TODO get from db
    service_type_uri: "AccessTime:Multicast".to_string(),
    expiration: 100,
    location: "https://127.0.0.1/api/v1/adopt".to_string(), // TODO get a servername from conf
};

let service = Service::new(desc);
service.listen(MulticastAddr::Loopback).await;
```

### Client
A client sends a `M-SEARCH` request and stores a list of all answering services.

```rust
let log = LogConfig{
    syslog_server: None,
    syslog_port: None,
    syslog_protocol: None,
    log_level: Some("trace".to_string()),
};

log.initialize_logger();

let client = Client::default();

client
    .discover("uuid:83760048-2d32-4e48-854f-f63a8fa9fd09".to_string(), MulticastAddr::Loopback, "AccessTime:Multicast".to_string())
    .await?;
```

Now you can fetch a `Vec<ServiceDescription>` with all answering services using `client.get_services()`

# License
To be fair this is just a setup I need for another project so feel free to do whatever you like with this. So feel free to choose between:
 - [Apache]APACHE-LICENSE.txt License, Version 2.0 [apache.org]http://www.apache.org/licenses/LICENSE-2.0
 - [MIT]MIT-LICENSE.txt License [opensource.org]http://opensource.org/licenses/MIT

# Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.