Skip to content

Commit 13948bd

Browse files
authored
Merge pull request #55 from betagouv/fix_header_decoder
Fix header decoder
2 parents a887660 + 3dfa07a commit 13948bd

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

src/decipher_type.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#[derive(Debug, Clone, Copy)]
1+
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
22
pub enum DecipherType {
33
Encrypted { chunk_size: usize },
44
Plaintext,

src/header_decoder.rs

+25-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ where
3939
}
4040
Poll::Ready(None) => {
4141
trace!("poll: over");
42-
Poll::Ready((DecipherType::Plaintext, None))
42+
Poll::Ready((DecipherType::Plaintext, Some(decoder.buffer.clone())))
4343
}
4444
Poll::Ready(Some(Err(e))) => {
4545
error!("poll: error {:?}", e);
@@ -75,9 +75,32 @@ where
7575
}
7676
}
7777
} else {
78-
Poll::Pending
78+
trace!("not enough byte to decide decypher type");
79+
Pin::new(decoder).poll(cx)
7980
}
8081
}
8182
}
8283
}
8384
}
85+
86+
#[cfg(test)]
87+
mod tests {
88+
use super::*;
89+
90+
#[test]
91+
fn header_decoder() {
92+
use actix_web::Error;
93+
94+
let clear: &[u8] = b"something not encrypted";
95+
96+
let source: Result<Bytes, Error> = Ok(Bytes::from(&clear[..]));
97+
let source_stream = futures::stream::once(Box::pin(async { source }));
98+
99+
let mut boxy: Box<dyn Stream<Item = Result<Bytes, _>> + Unpin> = Box::new(source_stream);
100+
101+
let result = futures::executor::block_on(HeaderDecoder::new(&mut boxy));
102+
103+
assert_eq!(DecipherType::Plaintext, result.0);
104+
assert_eq!(Some(BytesMut::from(&clear[..])), result.1);
105+
}
106+
}

src/proxy.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -182,18 +182,12 @@ async fn fetch(
182182
let mut boxy: Box<dyn Stream<Item = Result<Bytes, _>> + Unpin> = Box::new(res);
183183
let header_decoder = HeaderDecoder::new(&mut boxy);
184184
let (cypher_type, buff) = header_decoder.await;
185+
let fetch_length = original_length
186+
.map(|content_length| decrypted_content_length(content_length, cypher_type));
185187

186188
let decoder =
187189
Decoder::new_from_cypher_and_buffer(config.key.clone(), boxy, cypher_type, buff);
188190

189-
let fetch_length = original_length.map(|content_length| {
190-
if config.noop {
191-
content_length
192-
} else {
193-
decrypted_content_length(content_length, cypher_type)
194-
}
195-
});
196-
197191
if let Some(length) = fetch_length {
198192
Ok(client_resp.no_chunking(length as u64).streaming(decoder))
199193
} else {

0 commit comments

Comments
 (0)