use super::Auth;
#[derive(Debug, PartialEq)]
pub(crate) struct Header {
rpcvers: u32,
prog: u32,
vers: u32,
proc: u32,
cred: Auth,
verf: Auth,
}
impl Header {
pub(crate) fn new(
rpcvers: u32,
prog: u32,
vers: u32,
proc: u32,
cred: &Auth,
verf: &Auth,
) -> Header {
Header {
rpcvers,
prog,
vers,
proc,
cred: cred.clone(),
verf: verf.clone(),
}
}
pub(crate) fn encode(&self, buf: &mut Vec<u8>) {
buf.extend_from_slice(&self.rpcvers.to_be_bytes());
buf.extend_from_slice(&self.prog.to_be_bytes());
buf.extend_from_slice(&self.vers.to_be_bytes());
buf.extend_from_slice(&self.proc.to_be_bytes());
self.cred.encode(buf);
self.verf.encode(buf);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn header_new() {
let unix = Auth::new_unix("localhost", 2, 3);
assert_eq!(
Header::new(9, 8, 7, 6, &Auth::new_null(), &Auth::new_null()),
Header {
rpcvers: 9,
prog: 8,
vers: 7,
proc: 6,
cred: Auth::new_null(),
verf: Auth::new_null()
}
);
assert_eq!(
Header::new(9, 8, 7, 6, &unix, &Auth::new_null()),
Header {
rpcvers: 9,
prog: 8,
vers: 7,
proc: 6,
cred: unix.clone(),
verf: Auth::new_null()
}
);
assert_eq!(
Header::new(9, 8, 7, 6, &Auth::new_null(), &unix),
Header {
rpcvers: 9,
prog: 8,
vers: 7,
proc: 6,
cred: Auth::new_null(),
verf: unix.clone()
}
);
}
#[test]
fn header_pack_null_cred() {
let header = Header::new(1, 2, 3, 4, &Auth::new_null(), &Auth::new_null());
let mut buf = Vec::<u8>::new();
header.encode(&mut buf);
let expected: Vec<u8> = vec![
0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ];
assert_eq!(buf, expected);
assert_eq!(buf.len(), expected.len());
}
#[test]
fn header_pack_unix_cred() {
let header = Header::new(
4,
3,
2,
1,
&Auth::new_unix("machine", 350, 400),
&Auth::new_null(),
);
let mut buf = Vec::<u8>::new();
header.encode(&mut buf);
let mut expected: Vec<u8> = vec![
0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 7, 109, 97, 99, 104, 105, 110, 101, 0, 0, 0, 1, 94, 0, 0, 1, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ];
assert_ne!(buf, expected);
expected.splice(24..28, buf[24..28].to_vec());
assert_eq!(buf, expected);
}
}