bitfold_core/
interceptor.rs1use std::net::SocketAddr;
7
8pub trait Interceptor: Send {
33 fn on_receive(&mut self, addr: &SocketAddr, data: &mut [u8]) -> bool;
43
44 fn on_send(&mut self, addr: &SocketAddr, data: &mut Vec<u8>) -> bool;
54}
55
56#[derive(Debug, Clone, Copy)]
60pub struct NoOpInterceptor;
61
62impl Interceptor for NoOpInterceptor {
63 fn on_receive(&mut self, _addr: &SocketAddr, _data: &mut [u8]) -> bool {
64 true
65 }
66
67 fn on_send(&mut self, _addr: &SocketAddr, _data: &mut Vec<u8>) -> bool {
68 true
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use std::net::{IpAddr, Ipv4Addr};
75
76 use super::*;
77
78 struct CountingInterceptor {
79 received: usize,
80 sent: usize,
81 }
82
83 impl Interceptor for CountingInterceptor {
84 fn on_receive(&mut self, _addr: &SocketAddr, _data: &mut [u8]) -> bool {
85 self.received += 1;
86 true
87 }
88
89 fn on_send(&mut self, _addr: &SocketAddr, _data: &mut Vec<u8>) -> bool {
90 self.sent += 1;
91 true
92 }
93 }
94
95 #[test]
96 fn test_counting_interceptor() {
97 let mut interceptor = CountingInterceptor { received: 0, sent: 0 };
98 let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
99
100 let mut data = vec![1, 2, 3];
101 assert!(interceptor.on_receive(&addr, &mut data));
102 assert_eq!(interceptor.received, 1);
103
104 assert!(interceptor.on_send(&addr, &mut data));
105 assert_eq!(interceptor.sent, 1);
106 }
107
108 struct DroppingInterceptor;
109
110 impl Interceptor for DroppingInterceptor {
111 fn on_receive(&mut self, _addr: &SocketAddr, _data: &mut [u8]) -> bool {
112 false }
114
115 fn on_send(&mut self, _addr: &SocketAddr, _data: &mut Vec<u8>) -> bool {
116 false }
118 }
119
120 #[test]
121 fn test_dropping_interceptor() {
122 let mut interceptor = DroppingInterceptor;
123 let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
124
125 let mut data = vec![1, 2, 3];
126 assert!(!interceptor.on_receive(&addr, &mut data));
127 assert!(!interceptor.on_send(&addr, &mut data));
128 }
129
130 struct ModifyingInterceptor;
131
132 impl Interceptor for ModifyingInterceptor {
133 fn on_receive(&mut self, _addr: &SocketAddr, data: &mut [u8]) -> bool {
134 for byte in data.iter_mut() {
136 *byte ^= 0x55;
137 }
138 true
139 }
140
141 fn on_send(&mut self, _addr: &SocketAddr, data: &mut Vec<u8>) -> bool {
142 for byte in data.iter_mut() {
144 *byte ^= 0x55;
145 }
146 true
147 }
148 }
149
150 #[test]
151 fn test_modifying_interceptor() {
152 let mut interceptor = ModifyingInterceptor;
153 let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
154
155 let mut data = vec![0xAA, 0xBB, 0xCC];
156 let original = data.clone();
157
158 assert!(interceptor.on_send(&addr, &mut data));
159 assert_ne!(data, original); assert!(interceptor.on_receive(&addr, &mut data));
162 assert_eq!(data, original); }
164
165 #[test]
166 fn test_noop_interceptor() {
167 let mut interceptor = NoOpInterceptor;
168 let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
169
170 let mut data = vec![1, 2, 3];
171 let original = data.clone();
172
173 assert!(interceptor.on_receive(&addr, &mut data));
174 assert_eq!(data, original);
175
176 assert!(interceptor.on_send(&addr, &mut data));
177 assert_eq!(data, original);
178 }
179}