diff options
author | SoniEx2 <endermoneymod@gmail.com> | 2021-06-13 00:30:06 -0300 |
---|---|---|
committer | SoniEx2 <endermoneymod@gmail.com> | 2021-06-13 00:30:06 -0300 |
commit | 664f28009be26a02639325951445b84f523fc3a0 (patch) | |
tree | a47d93d2dcd37c9741b8263523d5969c1be92be8 | |
parent | 7c1613d49b6f4e84266262f04c0dd012c3415368 (diff) |
Fix base64 handling
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/lib.rs | 19 |
2 files changed, 18 insertions, 3 deletions
diff --git a/Cargo.toml b/Cargo.toml index 12c7351..996f8b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "testserver" -version = "0.1.0" +version = "0.1.1" description = "Static HTTP webserver that stores resources as strings" readme = "README.md" authors = ["SoniEx2 <endermoneymod@gmail.com>"] diff --git a/src/lib.rs b/src/lib.rs index a6c16d9..af2f994 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,6 +53,13 @@ impl Server { } } +/// Decodes base64 as output by the `base64` utility. Properly handles +/// 76-column base64. +fn decode_base64(s: &'static str) -> Result<Vec<u8>, base64::DecodeError> { + // cba to avoid allocation + base64::decode(s.split('\n').collect::<String>()) +} + /// Spawns a webserver to serve the given archive. /// /// The archive is an .a (ar) file, in a format that can be parsed by the ar @@ -153,8 +160,16 @@ pub fn serve(archive: &'static str) -> Server { current = Some(Archive::new(inner)); } else if kind == ".b" { // base64 - let inner = base64::decode(inner.into_inner()); - let inner = Cursor::new(inner.unwrap()); + let inner = decode_base64(inner.into_inner()); + let inner = match inner { + Ok(inner) => inner, + Err(e) => { + eprintln!("{}", e); + break + } + }; + let size = inner.len(); + let inner = Cursor::new(inner); response = Response::new( 200.into(), vec![], |