From b84d75a7310c9be037f4c2f06eaea920c2bb8e00 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Thu, 28 Dec 2017 13:03:45 -0500 Subject: [PATCH] Implement Proto{De,En}code for LoginResponse. --- src/proto/server/response.rs | 67 ++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/proto/server/response.rs b/src/proto/server/response.rs index c295f9e..32b71db 100644 --- a/src/proto/server/response.rs +++ b/src/proto/server/response.rs @@ -110,6 +110,10 @@ impl ProtoEncode for ServerResponse { encoder.encode_u32(CODE_FILE_SEARCH)?; response.encode(encoder)?; }, + ServerResponse::LoginResponse(ref response) => { + encoder.encode_u32(CODE_LOGIN)?; + response.encode(encoder)?; + }, _ => { unimplemented!(); }, @@ -130,6 +134,10 @@ impl ProtoDecode for ServerResponse { let response = FileSearchResponse::decode(decoder)?; ServerResponse::FileSearchResponse(response) }, + CODE_LOGIN => { + let response = LoginResponse::decode(decoder)?; + ServerResponse::LoginResponse(response) + }, _ => { return Err(DecodeError::UnknownCodeError(code)); }, @@ -289,6 +297,49 @@ impl ReadFromPacket for LoginResponse { } } +impl ProtoEncode for LoginResponse { + fn encode(&self, encoder: &mut ProtoEncoder) -> Result<(), io::Error> { + match *self { + LoginResponse::LoginOk { ref motd, ip, password_md5_opt: _ } => { + encoder.encode_bool(true)?; + encoder.encode_string(motd)?; + encoder.encode_ipv4_addr(ip)?; + }, + LoginResponse::LoginFail { ref reason } => { + encoder.encode_bool(false)?; + encoder.encode_string(reason)?; + }, + }; + Ok(()) + } +} + +impl ProtoDecode for LoginResponse { + fn decode(decoder: &mut ProtoDecoder) -> Result { + let ok = decoder.decode_bool()?; + if !ok { + let reason = decoder.decode_string()?; + return Ok(LoginResponse::LoginFail { + reason: reason, + }) + } + + let motd = decoder.decode_string()?; + let ip = decoder.decode_ipv4_addr()?; + + match decoder.decode_bool() { + Ok(value) => debug!("LoginResponse last field: {}", value), + Err(e) => debug!("Error reading LoginResponse field: {:?}", e), + } + + Ok(LoginResponse::LoginOk { + motd: motd, + ip: ip, + password_md5_opt: None, + }) + } +} + /*==================* * PARENT MIN SPEED * *==================*/ @@ -760,4 +811,20 @@ mod tests { query: "foo.txt".to_string(), })) } + + #[test] + fn roundtrip_login_ok() { + roundtrip(ServerResponse::LoginResponse(LoginResponse::LoginOk { + motd: "welcome one welcome all!".to_string(), + ip: net::Ipv4Addr::new(127, 0, 0, 1), + password_md5_opt: None, + })) + } + + #[test] + fn roundtrip_login_fail() { + roundtrip(ServerResponse::LoginResponse(LoginResponse::LoginFail { + reason: "I just don't like you".to_string(), + })) + } }