Signed-off-by: David Calavera <david.calavera@gmail.com>
| ... | ... |
@@ -92,7 +92,7 @@ func (cli *DockerCli) CmdExec(args ...string) error {
|
| 92 | 92 |
} |
| 93 | 93 |
} |
| 94 | 94 |
errCh = promise.Go(func() error {
|
| 95 |
- return cli.hijack("POST", "/exec/"+execID+"/start", execConfig.Tty, in, out, stderr, hijacked, execConfig)
|
|
| 95 |
+ return cli.hijackWithContentType("POST", "/exec/"+execID+"/start", "application/json", execConfig.Tty, in, out, stderr, hijacked, execConfig)
|
|
| 96 | 96 |
}) |
| 97 | 97 |
|
| 98 | 98 |
// Acknowledge the hijack before starting |
| ... | ... |
@@ -127,6 +127,10 @@ func (cli *DockerCli) dial() (net.Conn, error) {
|
| 127 | 127 |
} |
| 128 | 128 |
|
| 129 | 129 |
func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.ReadCloser, stdout, stderr io.Writer, started chan io.Closer, data interface{}) error {
|
| 130 |
+ return cli.hijackWithContentType(method, path, "text/plain", setRawTerminal, in, stdout, stderr, started, data) |
|
| 131 |
+} |
|
| 132 |
+ |
|
| 133 |
+func (cli *DockerCli) hijackWithContentType(method, path, contentType string, setRawTerminal bool, in io.ReadCloser, stdout, stderr io.Writer, started chan io.Closer, data interface{}) error {
|
|
| 130 | 134 |
defer func() {
|
| 131 | 135 |
if started != nil {
|
| 132 | 136 |
close(started) |
| ... | ... |
@@ -149,7 +153,7 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea |
| 149 | 149 |
} |
| 150 | 150 |
|
| 151 | 151 |
req.Header.Set("User-Agent", "Docker-Client/"+dockerversion.VERSION+" ("+runtime.GOOS+")")
|
| 152 |
- req.Header.Set("Content-Type", "text/plain")
|
|
| 152 |
+ req.Header.Set("Content-Type", contentType)
|
|
| 153 | 153 |
req.Header.Set("Connection", "Upgrade")
|
| 154 | 154 |
req.Header.Set("Upgrade", "tcp")
|
| 155 | 155 |
req.Host = cli.addr |
| ... | ... |
@@ -60,6 +60,9 @@ func (s *router) postContainerExecStart(ctx context.Context, w http.ResponseWrit |
| 60 | 60 |
if err := httputils.ParseForm(r); err != nil {
|
| 61 | 61 |
return err |
| 62 | 62 |
} |
| 63 |
+ if err := httputils.CheckForJSON(r); err != nil {
|
|
| 64 |
+ return err |
|
| 65 |
+ } |
|
| 63 | 66 |
var ( |
| 64 | 67 |
execName = vars["name"] |
| 65 | 68 |
stdin, inStream io.ReadCloser |