summaryrefslogtreecommitdiff
path: root/daemon/attach.go
diff options
context:
space:
mode:
authorDavid Calavera <david.calavera@gmail.com>2015-12-16 01:41:46 -0500
committerDavid Calavera <david.calavera@gmail.com>2015-12-21 12:34:21 -0500
commitaf94f941df9ee43b61e0e8f9d3c3b3962597eff6 (patch)
tree7d32a9ed27ee5375c4f88cfde98d18d1004d2484 /daemon/attach.go
parent52fd30079a8f9a56402d4c4f1666c96bd9af98da (diff)
downloaddocker-af94f941df9ee43b61e0e8f9d3c3b3962597eff6.tar.gz
Remove `IsPaused` from backend interface.
Move connection hijacking logic to the daemon. Signed-off-by: David Calavera <david.calavera@gmail.com>
Diffstat (limited to 'daemon/attach.go')
-rw-r--r--daemon/attach.go51
1 files changed, 41 insertions, 10 deletions
diff --git a/daemon/attach.go b/daemon/attach.go
index 12b206e13b..451d41c01c 100644
--- a/daemon/attach.go
+++ b/daemon/attach.go
@@ -1,53 +1,84 @@
package daemon
import (
+ "fmt"
"io"
+ "net/http"
"time"
"github.com/Sirupsen/logrus"
"github.com/docker/docker/container"
"github.com/docker/docker/daemon/logger"
+ derr "github.com/docker/docker/errors"
"github.com/docker/docker/pkg/stdcopy"
)
// ContainerAttachWithLogsConfig holds the streams to use when connecting to a container to view logs.
type ContainerAttachWithLogsConfig struct {
- InStream io.ReadCloser
- OutStream io.Writer
- UseStdin, UseStdout, UseStderr bool
- Logs, Stream bool
+ Hijacker http.Hijacker
+ Upgrade bool
+ UseStdin bool
+ UseStdout bool
+ UseStderr bool
+ Logs bool
+ Stream bool
}
// ContainerAttachWithLogs attaches to logs according to the config passed in. See ContainerAttachWithLogsConfig.
func (daemon *Daemon) ContainerAttachWithLogs(prefixOrName string, c *ContainerAttachWithLogsConfig) error {
+ if c.Hijacker == nil {
+ return derr.ErrorCodeNoHijackConnection.WithArgs(prefixOrName)
+ }
container, err := daemon.GetContainer(prefixOrName)
if err != nil {
+ return derr.ErrorCodeNoSuchContainer.WithArgs(prefixOrName)
+ }
+ if container.IsPaused() {
+ return derr.ErrorCodePausedContainer.WithArgs(prefixOrName)
+ }
+
+ conn, _, err := c.Hijacker.Hijack()
+ if err != nil {
return err
}
+ defer conn.Close()
+ // Flush the options to make sure the client sets the raw mode
+ conn.Write([]byte{})
+ inStream := conn.(io.ReadCloser)
+ outStream := conn.(io.Writer)
+
+ if c.Upgrade {
+ fmt.Fprintf(outStream, "HTTP/1.1 101 UPGRADED\r\nContent-Type: application/vnd.docker.raw-stream\r\nConnection: Upgrade\r\nUpgrade: tcp\r\n\r\n")
+ } else {
+ fmt.Fprintf(outStream, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n")
+ }
var errStream io.Writer
if !container.Config.Tty {
- errStream = stdcopy.NewStdWriter(c.OutStream, stdcopy.Stderr)
- c.OutStream = stdcopy.NewStdWriter(c.OutStream, stdcopy.Stdout)
+ errStream = stdcopy.NewStdWriter(outStream, stdcopy.Stderr)
+ outStream = stdcopy.NewStdWriter(outStream, stdcopy.Stdout)
} else {
- errStream = c.OutStream
+ errStream = outStream
}
var stdin io.ReadCloser
var stdout, stderr io.Writer
if c.UseStdin {
- stdin = c.InStream
+ stdin = inStream
}
if c.UseStdout {
- stdout = c.OutStream
+ stdout = outStream
}
if c.UseStderr {
stderr = errStream
}
- return daemon.attachWithLogs(container, stdin, stdout, stderr, c.Logs, c.Stream)
+ if err := daemon.attachWithLogs(container, stdin, stdout, stderr, c.Logs, c.Stream); err != nil {
+ fmt.Fprintf(outStream, "Error attaching: %s\n", err)
+ }
+ return nil
}
// ContainerWsAttachWithLogsConfig attach with websockets, since all