1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use super::Message;
use crate::ssdp::packet::{self, FromPacket, ToPacket};
use crate::Error;
use bytes::BytesMut;
use tokio_util::codec::{Decoder, Encoder};
#[derive(Default)]
pub struct Codec {
encoder: packet::Encoder,
decoder: packet::Decoder,
}
impl Codec {
pub fn new() -> Self {
Codec {
encoder: packet::Encoder {},
decoder: packet::Decoder {},
}
}
}
impl Encoder<Message> for Codec {
type Error = Error;
fn encode(&mut self, p: Message, dst: &mut BytesMut) -> Result<(), Self::Error> {
self.encoder.encode(p.to_packet(), dst)
}
}
impl Decoder for Codec {
type Item = Message;
type Error = Error;
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
match self.decoder.decode(src) {
Err(e) => Err(e),
Ok(None) => Ok(None),
Ok(Some(v)) => Message::from_packet(&v).map(Some),
}
}
}
#[cfg(test)]
mod tests {
use super::super::{
types::{Ext, SearchTarget, UniqueServiceName},
SearchResponse,
};
use super::*;
use crate::ssdp::tests::constants::*;
#[test]
fn test_decode_ok() {
let mut buf = BytesMut::from(SEARCH_RESPONSE_EXAMPLE);
let mut decoder = Codec::default();
let message = Message::SearchResponse(SearchResponse {
max_age: "max-age=1800".into(),
date: Some("Mon, 25 May 2020 02:39:02 GMT".into()),
location: "http://192.168.7.1:1900/igd.xml".into(),
secure_location: None,
server: "eeroOS/latest UPnP/1.0 eero/latest".into(),
target: SearchTarget::UUID("fcdb9233-a63f-41da-b42c-7cfeb99c8adf".parse().unwrap()),
unique_service_name: UniqueServiceName {
uuid: "fcdb9233-a63f-41da-b42c-7cfeb99c8adf".into(),
search_target: None,
},
ext: Ext {},
boot_id: None,
config_id: None,
search_port: None,
});
assert_eq!(message, decoder.decode(&mut buf).unwrap().unwrap())
}
}