|
@@ -65,6 +65,18 @@ func hijackServer(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) {
|
|
|
return conn, conn, nil
|
|
|
}
|
|
|
|
|
|
+func closeStreams(streams ...interface{}) {
|
|
|
+ for _, stream := range streams {
|
|
|
+ if tcpc, ok := stream.(interface {
|
|
|
+ CloseWrite() error
|
|
|
+ }); ok {
|
|
|
+ tcpc.CloseWrite()
|
|
|
+ } else if closer, ok := stream.(io.Closer); ok {
|
|
|
+ closer.Close()
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// Check to make sure request's Content-Type is application/json
|
|
|
func checkForJson(r *http.Request) error {
|
|
|
ct := r.Header.Get("Content-Type")
|
|
@@ -871,20 +883,7 @@ func postContainersAttach(eng *engine.Engine, version version.Version, w http.Re
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- defer func() {
|
|
|
- if tcpc, ok := inStream.(*net.TCPConn); ok {
|
|
|
- tcpc.CloseWrite()
|
|
|
- } else {
|
|
|
- inStream.Close()
|
|
|
- }
|
|
|
- }()
|
|
|
- defer func() {
|
|
|
- if tcpc, ok := outStream.(*net.TCPConn); ok {
|
|
|
- tcpc.CloseWrite()
|
|
|
- } else if closer, ok := outStream.(io.Closer); ok {
|
|
|
- closer.Close()
|
|
|
- }
|
|
|
- }()
|
|
|
+ defer closeStreams(inStream, outStream)
|
|
|
|
|
|
var errStream io.Writer
|
|
|
|
|
@@ -1134,25 +1133,7 @@ func postContainerExecStart(eng *engine.Engine, version version.Version, w http.
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
- defer func() {
|
|
|
- if cw, ok := inStream.(interface {
|
|
|
- CloseWrite() error
|
|
|
- }); ok {
|
|
|
- cw.CloseWrite()
|
|
|
- } else {
|
|
|
- inStream.Close()
|
|
|
- }
|
|
|
- }()
|
|
|
- defer func() {
|
|
|
- if cw, ok := outStream.(interface {
|
|
|
- CloseWrite() error
|
|
|
- }); ok {
|
|
|
- cw.CloseWrite()
|
|
|
- } else if closer, ok := outStream.(io.Closer); ok {
|
|
|
- closer.Close()
|
|
|
- }
|
|
|
- }()
|
|
|
+ defer closeStreams(inStream, outStream)
|
|
|
|
|
|
var errStream io.Writer
|
|
|
|