sftp_protocol/packet/
extended.rs

1use super::kind::PacketType;
2use super::PayloadTrait;
3
4#[derive(Debug, Eq, PartialEq, Nom, Serialize)]
5#[nom(BigEndian)]
6#[cfg_attr(test, derive(test_strategy::Arbitrary))]
7pub struct Request {
8	pub id: u32,
9	#[nom(Parse(crate::util::parse_string))]
10	#[serde(serialize_with = "crate::util::str_with_u32_length")]
11	pub request: String,
12	#[nom(Parse(crate::util::parse_u8_vec))]
13	#[serde(serialize_with = "crate::util::vec_with_u32_length")]
14	pub data: Vec<u8>
15}
16
17impl PayloadTrait for Request {
18	const Type: PacketType = PacketType::Extended;
19	fn binsize(&self) -> u32 {
20		4 + (4 + self.request.len() as u32) + (4 + self.data.len() as u32)
21	}
22}
23
24impl From<Request> for super::Payload {
25	fn from(p: Request) -> Self {
26		Self::Extended(p)
27	}
28}
29
30#[derive(Debug, Eq, PartialEq, Nom, Serialize)]
31#[nom(BigEndian)]
32#[cfg_attr(test, derive(test_strategy::Arbitrary))]
33pub struct Response {
34	pub id: u32,
35	#[nom(Parse(crate::util::parse_u8_vec))]
36	#[serde(serialize_with = "crate::util::vec_with_u32_length")]
37	pub data: Vec<u8>
38}
39
40impl PayloadTrait for Response {
41	const Type: PacketType = PacketType::ExtendedReply;
42	fn binsize(&self) -> u32 {
43		4 + (4 + self.data.len() as u32)
44	}
45}
46
47impl From<Response> for super::Payload {
48	fn from(p: Response) -> Self {
49		Self::ExtendedReply(p)
50	}
51}
52
53#[cfg(test)]
54mod tests {
55	use test_strategy::proptest;
56	use crate::parser::encode;
57	use crate::parser::Parser;
58	use super::*;
59
60	#[proptest]
61	fn roundtrip_request_whole(input: Request) {
62		let mut stream = Parser::default();
63		let packet = input.into_packet();
64		stream.write(&encode(&packet)).unwrap();
65		assert_eq!(stream.get_packet(), Ok(Some(packet)));
66		assert_eq!(stream.get_packet(), Ok(None));
67	}
68
69	#[proptest]
70	fn roundtrip_response_whole(input: Response) {
71		let mut stream = Parser::default();
72		let packet = input.into_packet();
73		stream.write(&encode(&packet)).unwrap();
74		assert_eq!(stream.get_packet(), Ok(Some(packet)));
75		assert_eq!(stream.get_packet(), Ok(None));
76	}
77}
78