socks5_protocol_async/protocol/
auth_method_negotiation_request.rs1use super::shared_internal::*;
2use failure::Error;
3use futures_io::AsyncRead;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct AuthMethodNegotiationRequest {
7 pub methods: Vec<u8>,
8}
9
10impl AuthMethodNegotiationRequest {
11 pub async fn read<AR>(reader: &mut AR) -> Result<Self, Error>
12 where
13 AR: AsyncRead + Unpin,
14 {
15 read_version(reader).await?;
16
17 let nmethods = read_u8(reader).await?;
18 let methods = read_vec(reader, nmethods as usize).await?;
19
20 Ok(Self { methods })
21 }
22}
23
24#[cfg(test)]
25mod test {
26 use super::*;
27 use crate::test_util::*;
28 use futures_util::io::Cursor;
29
30 #[test]
31 fn happy_path() {
32 let mut reader = Cursor::new(&[
33 5, 2, 0xBE, 0xEF, ]);
37 let future = AuthMethodNegotiationRequest::read(&mut reader);
38 let result = extract_future_output(future);
39 assert_eq!(
40 result.unwrap(),
41 AuthMethodNegotiationRequest {
42 methods: vec![0xBE, 0xEF]
43 }
44 )
45 }
46
47 #[test]
48 fn invalid_version() {
49 let mut reader = Cursor::new(&[1]);
50 let future = AuthMethodNegotiationRequest::read(&mut reader);
51 let result = extract_future_output(future);
52 let err = result.unwrap_err();
53 let err = err
54 .downcast::<crate::error::InvalidProtocolVersionError>()
55 .unwrap();
56 assert_eq!(err, crate::error::InvalidProtocolVersionError(1))
57 }
58
59 #[test]
60 fn not_enough_data() {
61 let mut reader = Cursor::new(&[]);
62 let future = AuthMethodNegotiationRequest::read(&mut reader);
63 let result = extract_future_output(future);
64 let err = result.unwrap_err();
65 let err = err.downcast::<std::io::Error>().unwrap();
66 assert_eq!(err.kind(), std::io::ErrorKind::UnexpectedEof);
67 }
68}