From 73a2d87132c49d04b3f6bfa3d674d4d4854a4c21 Mon Sep 17 00:00:00 2001 From: Stephan Buys Date: Wed, 31 May 2017 12:29:14 +0200 Subject: Fix stdin and stderr handling during docker exec --- Cargo.toml | 7 ++++--- src/lib.rs | 1 + src/tty.rs | 30 +++++++++++++++++++++--------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 15b82c8..f0dcb9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/src/lib.rs b/src/lib.rs index 12e0cdf..530e65c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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; diff --git a/src/tty.rs b/src/tty.rs index 446ab26..509c468 100644 --- a/src/tty.rs +++ b/src/tty.rs @@ -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) -> Tty { let mut stdout: Vec = vec![]; let mut stderr: Vec = 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 = 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 = header[4..8].to_vec(); + let mut buffer = vec![0; Cursor::new(&payload_size).read_u32::().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, -- cgit v1.2.3