summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Buys <stephan.buys@panoptix.co.za>2017-05-31 12:29:14 +0200
committerJoxit <joxit972@gmail.com>2017-05-31 22:09:57 +0200
commit73a2d87132c49d04b3f6bfa3d674d4d4854a4c21 (patch)
treecb21e3cfe052c90fe523fa404f44864e260bad63
parentc2bf1d2d8056eae8297fb1b4d452f0656816f7fa (diff)
Fix stdin and stderr handling during docker exec
-rw-r--r--Cargo.toml7
-rw-r--r--src/lib.rs1
-rw-r--r--src/tty.rs30
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<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,