Przeglądaj źródła

Add a error check in postHijacked to avoid docker exec command blocking.

When user execute docker exec command, docker daemon maybe have err return because
of ExecExists check, and then the hijack stream will not be close, it can lead to
docker exec command block.

Signed-off-by: yangshukui <yangshukui@huawei.com>
yangshukui 8 lat temu
rodzic
commit
26231b29e7
1 zmienionych plików z 17 dodań i 3 usunięć
  1. 17 3
      client/hijack.go

+ 17 - 3
client/hijack.go

@@ -1,9 +1,11 @@
 package client
 
 import (
+	"bytes"
 	"crypto/tls"
 	"errors"
 	"fmt"
+	"io/ioutil"
 	"net"
 	"net/http"
 	"net/http/httputil"
@@ -72,11 +74,23 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu
 	defer clientconn.Close()
 
 	// Server hijacks the connection, error 'connection closed' expected
-	_, err = clientconn.Do(req)
+	resp, err := clientconn.Do(req)
+	if err != nil {
+		return types.HijackedResponse{}, err
+	}
 
-	rwc, br := clientconn.Hijack()
+	defer resp.Body.Close()
+	switch resp.StatusCode {
+	case http.StatusOK, http.StatusSwitchingProtocols:
+		rwc, br := clientconn.Hijack()
+		return types.HijackedResponse{Conn: rwc, Reader: br}, err
+	}
 
-	return types.HijackedResponse{Conn: rwc, Reader: br}, err
+	errbody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return types.HijackedResponse{}, err
+	}
+	return types.HijackedResponse{}, fmt.Errorf("Error response from daemon: %s", bytes.TrimSpace(errbody))
 }
 
 func tlsDial(network, addr string, config *tls.Config) (net.Conn, error) {