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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use std::borrow::Cow;
use std::fmt::Debug;
use hyper::header::{Header, HeaderFormat};
use error::SSDPResult;
use header::{HeaderRef, HeaderMut};
use message::{MessageType, Listen, Config};
use message::ssdp::SSDPMessage;
use message::multicast::{self, Multicast};
use receiver::FromRawSSDP;
#[derive(Debug, Clone)]
pub struct NotifyMessage {
message: SSDPMessage,
}
impl NotifyMessage {
pub fn new() -> Self {
NotifyMessage { message: SSDPMessage::new(MessageType::Notify) }
}
}
impl Multicast for NotifyMessage {
type Item = ();
fn multicast_with_config(&self, config: &Config) -> SSDPResult<Self::Item> {
multicast::send(&self.message, config)?;
Ok(())
}
}
impl Default for NotifyMessage {
fn default() -> Self {
NotifyMessage::new()
}
}
impl FromRawSSDP for NotifyMessage {
fn raw_ssdp(bytes: &[u8]) -> SSDPResult<NotifyMessage> {
let message = try!(SSDPMessage::raw_ssdp(bytes));
if message.message_type() != MessageType::Notify {
try!(Err("SSDP Message Received Is Not A NotifyMessage"))
} else {
Ok(NotifyMessage { message: message })
}
}
}
impl HeaderRef for NotifyMessage {
fn get<H>(&self) -> Option<&H>
where H: Header + HeaderFormat
{
self.message.get::<H>()
}
fn get_raw(&self, name: &str) -> Option<&[Vec<u8>]> {
self.message.get_raw(name)
}
}
impl HeaderMut for NotifyMessage {
fn set<H>(&mut self, value: H)
where H: Header + HeaderFormat
{
self.message.set(value)
}
fn set_raw<K>(&mut self, name: K, value: Vec<Vec<u8>>)
where K: Into<Cow<'static, str>> + Debug
{
self.message.set_raw(name, value)
}
}
pub struct NotifyListener;
impl Listen for NotifyListener {
type Message = NotifyMessage;
}
#[cfg(test)]
mod tests {
use super::NotifyMessage;
use receiver::FromRawSSDP;
#[test]
fn positive_notify_message_type() {
let raw_message = "NOTIFY * HTTP/1.1\r\nHOST: 192.168.1.1\r\n\r\n";
NotifyMessage::raw_ssdp(raw_message.as_bytes()).unwrap();
}
#[test]
#[should_panic]
fn negative_search_message_type() {
let raw_message = "M-SEARCH * HTTP/1.1\r\nHOST: 192.168.1.1\r\n\r\n";
NotifyMessage::raw_ssdp(raw_message.as_bytes()).unwrap();
}
#[test]
#[should_panic]
fn negative_response_message_type() {
let raw_message = "HTTP/1.1 200 OK\r\n\r\n";
NotifyMessage::raw_ssdp(raw_message.as_bytes()).unwrap();
}
}