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
use message::IsMessage;
use message::response::CoAPResponse;
use message::packet::Packet;
use message::header::Header;
use std::net::SocketAddr;

#[derive(Debug)]
pub struct CoAPRequest {
    pub message: Packet,
    pub response: Option<CoAPResponse>,
    pub source: Option<SocketAddr>,
}

impl CoAPRequest {
    pub fn new() -> CoAPRequest {
        CoAPRequest {
            response: None,
            message: Packet::new(),
            source: None,
        }
    }

    pub fn from_packet(packet: Packet, source: &SocketAddr) -> CoAPRequest {
        CoAPRequest {
            response: CoAPResponse::new(&packet),
            message: packet,
            source: Some(source.clone()),
        }
    }
}

impl IsMessage for CoAPRequest {
    fn get_message(&self) -> &Packet {
        &self.message
    }
    fn get_mut_message(&mut self) -> &mut Packet {
        &mut self.message
    }
    fn get_header(&self) -> &Header {
        &self.message.header
    }
    fn get_mut_header(&mut self) -> &mut Header {
        &mut self.message.header
    }
}

#[cfg(test)]
mod test {
    use super::*;
    use message::packet::{Packet, CoAPOption};
    use message::header::MessageType;
    use message::IsMessage;
    use std::net::SocketAddr;
    use std::str::FromStr;

    #[test]
    fn test_request_create() {

        let mut packet = Packet::new();
        let mut request1 = CoAPRequest::new();

        packet.set_token(vec![0x17, 0x38]);
        request1.set_token(vec![0x17, 0x38]);

        packet.add_option(CoAPOption::UriPath, b"test-interface".to_vec());
        request1.add_option(CoAPOption::UriPath, b"test-interface".to_vec());

        packet.header.set_message_id(42);
        request1.set_message_id(42);

        packet.header.set_version(2);
        request1.set_version(2);

        packet.header.set_type(MessageType::Confirmable);
        request1.set_type(MessageType::Confirmable);

        packet.header.set_code("0.04");
        request1.set_code("0.04");

        let request2 = CoAPRequest::from_packet(packet,
                                                &SocketAddr::from_str("127.0.0.1:1234").unwrap());

        assert_eq!(request1.message.to_bytes().unwrap(),
                   request2.message.to_bytes().unwrap());

    }
}