diff options
author | Stephan Buys <stephan.buys@panoptix.co.za> | 2017-05-31 12:29:14 +0200 |
---|---|---|
committer | Joxit <joxit972@gmail.com> | 2017-05-31 22:09:57 +0200 |
commit | 73a2d87132c49d04b3f6bfa3d674d4d4854a4c21 (patch) | |
tree | cb21e3cfe052c90fe523fa404f44864e260bad63 | |
parent | c2bf1d2d8056eae8297fb1b4d452f0656816f7fa (diff) |
Fix stdin and stderr handling during docker exec
-rw-r--r-- | Cargo.toml | 7 | ||||
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/tty.rs | 30 |
3 files changed, 26 insertions, 12 deletions
@@ -11,13 +11,14 @@ keywords = ["docker", "unix", "containers", "hyper", "ship"] license = "MIT" [dependencies] +byteorder = "1.0.0" flate2 = "0.2" +hyper = "0.10" +hyper-openssl = "0.2" hyperlocal = "0.3" -log = "0.3" jed = "0.1" +log = "0.3" openssl = "0.9" -hyper = "0.10" -hyper-openssl = "0.2" rustc-serialize = "0.3" tar = "0.3" url = "0.5" @@ -24,6 +24,7 @@ extern crate openssl; extern crate rustc_serialize; extern crate url; extern crate tar; +extern crate byteorder; pub mod builder; pub mod rep; @@ -1,26 +1,38 @@ use std::io::Read; +use std::io::Cursor; +use byteorder::{BigEndian, ReadBytesExt}; + pub struct Tty { pub stdout: String, pub stderr: String, } +// https://docs.docker.com/engine/api/v1.26/#operation/ContainerAttach impl Tty { pub fn new(mut stream: Box<Read>) -> Tty { let mut stdout: Vec<u8> = vec![]; let mut stderr: Vec<u8> = vec![]; loop { + // 8 byte header [ STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4 ] let mut header = [0; 8]; - match stream.read(&mut header) { - Ok(0) => break, + match stream.read_exact(&mut header) { Ok(_) => { - let mut body: Vec<u8> = vec![0; header[7] as usize]; - if let Ok(_) = stream.read(&mut body) { - if header[0] == 1 { - stdout.append(&mut body); - } - if header[0] == 2 { - stderr.append(&mut body); + let payload_size: Vec<u8> = header[4..8].to_vec(); + let mut buffer = vec![0; Cursor::new(&payload_size).read_u32::<BigEndian>().unwrap() as usize]; + match stream.read_exact(&mut buffer) { + Ok(_) => { + match header[0] { + // stdin, unhandled + 0 => break, + // stdout + 1 => stdout.append(&mut buffer), + // stderr + 2 => stderr.append(&mut buffer), + //unhandled + _ => break, + } } + Err(_) => break, }; } Err(_) => break, |