From e82dcaab520cb5676091f31d90614d3988a725e4 Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Wed, 25 Jan 2017 19:07:27 -0800 Subject: [PATCH] Use binary frame for websocket attach endpoint This fix tries to address the issue raised in 28176 where text frame was used in websocket attach endpoint. In case the data send out contains non utf8 data, the connection will be closed in certain browsers, e.g., Safari. This fix address the issue by change `PayloadType` to `BinaryFrame`. This fix is tested manually with Safari. The docker daemon is inside a Linux Virtual Machine. Create a container with: ``` docker run -itd --name websocket busybox sh -c "while true; do echo -e 'he\\xc3\\x28o'; sleep 5; done" ``` Use the following url (172.16.66.128:2375 is the tcp address of the daemon): ``` file:///websocket.html?url=ws://172.16.66.128:2375/v1.25/containers/websocket/attach/ws?logs=1&stderr=1&stdout=1&stream=1&stdin=1 ``` and the following html: ``` Websocket
Run DockerWebSocket
``` This fix fixes 28176. Signed-off-by: Yong Tang --- api/server/router/container/container_routes.go | 7 +++++++ docs/api/version-history.md | 3 +++ 2 files changed, 10 insertions(+) diff --git a/api/server/router/container/container_routes.go b/api/server/router/container/container_routes.go index 3c389245ce..6823a1a223 100644 --- a/api/server/router/container/container_routes.go +++ b/api/server/router/container/container_routes.go @@ -502,6 +502,8 @@ func (s *containerRouter) wsContainersAttach(ctx context.Context, w http.Respons done := make(chan struct{}) started := make(chan struct{}) + version := httputils.VersionFromContext(ctx) + setupStreams := func() (io.ReadCloser, io.Writer, io.Writer, error) { wsChan := make(chan *websocket.Conn) h := func(conn *websocket.Conn) { @@ -516,6 +518,11 @@ func (s *containerRouter) wsContainersAttach(ctx context.Context, w http.Respons }() conn := <-wsChan + // In case version is higher than 1.26, a binary frame will be sent. + // See 28176 for details. + if versions.GreaterThanOrEqualTo(version, "1.26") { + conn.PayloadType = websocket.BinaryFrame + } return conn, conn, conn, nil } diff --git a/docs/api/version-history.md b/docs/api/version-history.md index b295eda91c..0186318695 100644 --- a/docs/api/version-history.md +++ b/docs/api/version-history.md @@ -17,6 +17,9 @@ keywords: "API, Docker, rcli, REST, documentation" [Docker Engine API v1.26](v1.26/) documentation +* `GET /containers/(id or name)/attach/ws` now returns WebSocket in binary frame format for API version >= v1.26, + and returns WebSocket in text frame format for API version< v1.26, for the purpose of backward-compatibility. + ## v1.25 API changes [Docker Engine API v1.25](v1.25.md) documentation