X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/bdc29d3129f6d75aa9ce0a24ffb849a272b06f08..e42bf8fbe66f822066e13c08b346005a52e1aa4a:/sdk/go/arvados/container_gateway.go diff --git a/sdk/go/arvados/container_gateway.go b/sdk/go/arvados/container_gateway.go index d1d512856a..897ae434e1 100644 --- a/sdk/go/arvados/container_gateway.go +++ b/sdk/go/arvados/container_gateway.go @@ -15,13 +15,16 @@ import ( ) func (cresp ConnectionResponse) ServeHTTP(w http.ResponseWriter, req *http.Request) { + defer cresp.Conn.Close() hj, ok := w.(http.Hijacker) if !ok { http.Error(w, "ResponseWriter does not support connection upgrade", http.StatusInternalServerError) return } w.Header().Set("Connection", "upgrade") - w.Header().Set("Upgrade", cresp.UpgradeHeader) + for k, v := range cresp.Header { + w.Header()[k] = v + } w.WriteHeader(http.StatusSwitchingProtocols) conn, bufrw, err := hj.Hijack() if err != nil { @@ -31,8 +34,8 @@ func (cresp ConnectionResponse) ServeHTTP(w http.ResponseWriter, req *http.Reque defer conn.Close() var bytesIn, bytesOut int64 + ctx, cancel := context.WithCancel(req.Context()) var wg sync.WaitGroup - ctx, cancel := context.WithCancel(context.Background()) wg.Add(1) go func() { defer wg.Done() @@ -44,7 +47,7 @@ func (cresp ConnectionResponse) ServeHTTP(w http.ResponseWriter, req *http.Reque bytesOut += n } if err != nil { - ctxlog.FromContext(req.Context()).WithError(err).Error("error copying downstream") + ctxlog.FromContext(ctx).WithError(err).Error("error copying downstream") } }() wg.Add(1) @@ -58,17 +61,19 @@ func (cresp ConnectionResponse) ServeHTTP(w http.ResponseWriter, req *http.Reque bytesIn += n } if err != nil { - ctxlog.FromContext(req.Context()).WithError(err).Error("error copying upstream") + ctxlog.FromContext(ctx).WithError(err).Error("error copying upstream") } }() <-ctx.Done() - if cresp.Logger != nil { - go func() { - wg.Wait() + go func() { + // Wait for both io.Copy goroutines to finish and increment + // their byte counters. + wg.Wait() + if cresp.Logger != nil { cresp.Logger.WithFields(logrus.Fields{ "bytesIn": bytesIn, "bytesOut": bytesOut, }).Info("closed connection") - }() - } + } + }() }