1use self::{events::*, request::Type};
2use crate::{
3 configuration::Configuration,
4 peer::RemotePeer,
5 utils::{multipart::Multipart, unwrap::unwrap_result},
6};
7use log::error;
8use serialize_bits::ser::SerializerData;
9use std::{
10 fmt::Debug,
11 net::{SocketAddr, UdpSocket},
12};
13
14pub mod events;
15pub mod request;
16
17#[derive(Clone, PartialEq, Eq)]
21pub struct Request {
22 pub(crate) request_type: Type,
23 pub(crate) content: Vec<u8>,
24}
25
26impl Debug for Request {
27 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28 f.debug_struct("Request")
29 .field("request_type", &self.request_type)
30 .field("content", &self.content.len())
31 .finish()
32 }
33}
34
35impl Request {
36 pub fn new<D>(data: D) -> Self
38 where
39 D: SerializerData,
40 {
41 let instance = Self {
42 request_type: Type::Message,
43 content: data.to_data().clone(),
44 };
45 log::trace!("Request::new(data) => {:?}", instance);
46 instance
47 }
48
49 #[cfg(not(feature = "ssl"))]
50 pub(crate) fn new_connection(configuration: &Configuration) -> Self {
51 let instance = Self {
52 request_type: Type::Connection,
53 content: vec![0],
54 };
55 log::trace!(
56 "Request::new_connection({:?}) => {:?}",
57 configuration,
58 instance
59 );
60 instance
61 }
62
63 #[cfg(feature = "ssl")]
64 pub(crate) fn new_connection(configuration: &Configuration) -> Self {
65 let content = configuration.ssl.public_key.to_data();
66 let instance = Self {
67 request_type: Type::Connection,
68 content,
69 };
70 log::trace!(
71 "Request::new_connection({:?}) => {:?}",
72 configuration,
73 instance
74 );
75 instance
76 }
77
78 pub(crate) fn new_disconnection() -> Self {
79 let instance = Self {
80 request_type: Type::Disconnection,
81 content: vec![1],
82 };
83 log::trace!("Request::new_disconnection() => {:?}", instance);
84 instance
85 }
86
87 pub(crate) fn new_message(data: &Vec<u8>) -> Self {
88 let instance = Self {
89 request_type: Type::Message,
90 content: data.clone(),
91 };
92 log::trace!("Request::new_message({}) => {:?}", data.len(), instance);
93 instance
94 }
95
96 pub(crate) fn new_share_connection(peers: &Vec<RemotePeer>) -> Self {
97 let mut content = Vec::new();
98 for remote in peers {
99 content.append(&mut remote.addr.to_string().as_bytes().to_vec());
100 content.push(',' as u8);
101 }
102 let instance = Self {
103 request_type: Type::ShareConnection,
104 content: content.clone(),
105 };
106 log::trace!(
107 "Request::new_share_connection({:?}) => {:?}",
108 content,
109 instance
110 );
111 instance
112 }
113
114 pub(crate) fn to_peers_values(&self) -> Vec<SocketAddr> {
115 let mut res = Vec::new();
116 let mut current = Vec::new();
117 for b in self.content.clone() {
118 if b == ',' as u8 {
119 let addr = unwrap_result(
120 unwrap_result(String::from_utf8(current), "Unable to read address").parse(),
121 "Unable to parse address",
122 );
123 res.push(addr);
124 current = Vec::new();
125 } else {
126 current.push(b);
127 }
128 }
129 log::trace!("Request::to_peers_values() => {:?}", res);
130 res
131 }
132
133 #[cfg(feature = "ssl")]
134 pub(crate) fn parse_public_key(&self) -> Vec<u8> {
135 use serialize_bits::des::DeserializerData;
136
137 let content = self.content.clone();
138 let (pk, _) = Vec::from_data(&content, 0);
139 log::trace!("Request::parse_public_key() => {}", pk.len());
140 pk
141 }
142
143 pub(crate) fn to_message_event(&self, remote: &RemotePeer) -> Message {
144 let message = Message {
145 from: remote.clone(),
146 content: self.content.clone(),
147 };
148 log::trace!("Request::to_message_event({:?}) => {:?}", remote, message);
149 message
150 }
151
152 #[cfg(not(feature = "ssl"))]
153 pub(crate) fn send(&self, socket: &UdpSocket, addr: &SocketAddr) -> () {
154 log::trace!("Request::send({:?}, {addr})", socket);
155 let socket_address = unwrap_result(socket.local_addr(), "Unable to get the local address");
156 let parts = Multipart::split(self, &vec![], &socket_address);
157 for part in parts {
158 socket.send_to(&part.to_data(), addr).unwrap_or_else(|e| {
159 error!("Unable to send request : {e}");
160 0
161 });
162 }
163 }
164
165 #[cfg(feature = "ssl")]
166 pub(crate) fn send(&self, socket: &UdpSocket, addr: &SocketAddr, public_key: &Vec<u8>) -> () {
167 log::trace!("Request::send({:?}, {addr}, {})", socket, public_key.len());
168 let socket_address = unwrap_result(socket.local_addr(), "Unable to get the local address");
169 let parts = Multipart::split(self, public_key, &socket_address);
170 for part in parts {
171 socket.send_to(&part.to_data(), addr).unwrap_or_else(|e| {
172 error!("Unable to send request : {e}");
173 0
174 });
175 }
176 }
177}
178
179#[derive(Clone, Debug, PartialEq, Eq)]
183pub struct Response {
184 pub(crate) address: Option<SocketAddr>,
185 pub(crate) data: Vec<u8>,
186}
187
188impl Response {
189 pub fn text(value: &str) -> Self {
191 let instance = Self {
192 address: None,
193 data: value.as_bytes().to_vec(),
194 };
195 log::trace!("Response::text({value}) => {:?}", instance);
196 instance
197 }
198
199 pub fn new<D>(data: D) -> Self
201 where
202 D: SerializerData,
203 {
204 let instance = Self {
205 address: None,
206 data: data.to_data(),
207 };
208 log::trace!("Response::new(data) => {:?}", instance);
209 instance
210 }
211
212 pub(crate) fn to_request(&self) -> Request {
213 let req = Request::new_message(&self.data);
214 log::trace!("Response::to_request() => {:?}", req);
215 req
216 }
217}
218
219#[cfg(not(feature = "ssl"))]
220pub(crate) fn send(socket: &UdpSocket, request: &Request, address: &SocketAddr) {
221 request.send(socket, address);
222}
223
224#[cfg(feature = "ssl")]
225pub(crate) fn send(socket: &UdpSocket, request: &Request, address: &SocketAddr) {
226 request.send(socket, address, &vec![]);
227}