Ignore newlines when decoding
This commit is contained in:
parent
0493911702
commit
841160d2d5
1 changed files with 34 additions and 18 deletions
|
@ -28,19 +28,32 @@ impl<R: Read, W: Write> Decoder<R, W> {
|
||||||
/// `Error::MissingPadding`
|
/// `Error::MissingPadding`
|
||||||
/// - `intError` should never be returned. If this error is recieved the code
|
/// - `intError` should never be returned. If this error is recieved the code
|
||||||
/// is somehow broken. Please file a bug.
|
/// is somehow broken. Please file a bug.
|
||||||
pub fn decode(&mut self) -> Result<(), Error> {
|
pub fn decode(mut self) -> Result<W, Error> {
|
||||||
|
let mut byte_reader = self.reader.bytes();
|
||||||
loop {
|
loop {
|
||||||
let mut in_buf = [0_u8; 4];
|
let mut in_buf = [0_u8; 4];
|
||||||
let mut out_buf = [0_u8; 3];
|
let mut out_buf = [0_u8; 3];
|
||||||
let mut num = 0_u32;
|
let mut num = 0_u32;
|
||||||
let mut n_bytes = 0;
|
let mut n_bytes = 0;
|
||||||
loop {
|
while n_bytes < 4 {
|
||||||
n_bytes += match self.reader.read(&mut in_buf) {
|
if let Some(byte) = byte_reader.next() {
|
||||||
Ok(n) => n,
|
match byte {
|
||||||
Err(e) if e.kind() == ErrorKind::Interrupted => continue,
|
Ok(b) => {
|
||||||
Err(e) => return Err(e.into()),
|
if b == b'\n' {
|
||||||
};
|
continue;
|
||||||
break;
|
}
|
||||||
|
in_buf[n_bytes] = b;
|
||||||
|
n_bytes += 1;
|
||||||
|
}
|
||||||
|
Err(e) => match e.kind() {
|
||||||
|
ErrorKind::UnexpectedEof => break,
|
||||||
|
ErrorKind::Interrupted => continue,
|
||||||
|
_ => return Err(e.into()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
match n_bytes {
|
match n_bytes {
|
||||||
0 => break,
|
0 => break,
|
||||||
|
@ -70,7 +83,7 @@ impl<R: Read, W: Write> Decoder<R, W> {
|
||||||
}
|
}
|
||||||
self.writer.write_all(&out_buf[0..olen])?;
|
self.writer.write_all(&out_buf[0..olen])?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(self.writer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,16 +93,19 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn decode() {
|
fn decode() {
|
||||||
let mut decoder = Decoder::new("SGVsbG8sIFdvcmxk".as_bytes(), vec![], None);
|
let mut output = vec![];
|
||||||
decoder.decode().unwrap();
|
let mut decoder = Decoder::new("SGVsbG8sIFdvcmxk".as_bytes(), output, None);
|
||||||
assert_eq!(String::from_utf8(decoder.writer).unwrap(), "Hello, World");
|
output = decoder.decode().unwrap();
|
||||||
decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), vec![], None);
|
assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World");
|
||||||
decoder.decode().unwrap();
|
output.clear();
|
||||||
assert_eq!(String::from_utf8(decoder.writer).unwrap(), "Hello, World!");
|
decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), output, None);
|
||||||
decoder = Decoder::new("SGVsbG8sIFdvcmxkIQo=".as_bytes(), vec![], None);
|
output = decoder.decode().unwrap();
|
||||||
decoder.decode().unwrap();
|
assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World!");
|
||||||
|
output.clear();
|
||||||
|
decoder = Decoder::new("SGVsbG8sIFdvcmxkIQo=".as_bytes(), output, None);
|
||||||
|
output = decoder.decode().unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
String::from_utf8(decoder.writer).unwrap(),
|
String::from_utf8(output).unwrap(),
|
||||||
"Hello, World!\n"
|
"Hello, World!\n"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue