Merge branch '15652-crunch-run-memory-use'
[arvados.git] / sdk / go / httpserver / responsewriter.go
index 1af4dc87567b7e49060f3b0b764b4f6273154758..8dea759ccb9b1772b816ad565a279975ab751c8a 100644 (file)
@@ -1,43 +1,63 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: Apache-2.0
+
 package httpserver
 
 import (
        "net/http"
 )
 
-// ResponseWriter wraps http.ResponseWriter and exposes the status
+type ResponseWriter interface {
+       http.ResponseWriter
+       WroteStatus() int
+       WroteBodyBytes() int
+}
+
+// responseWriter wraps http.ResponseWriter and exposes the status
 // sent, the number of bytes sent to the client, and the last write
 // error.
-type ResponseWriter struct {
+type responseWriter struct {
        http.ResponseWriter
-       wroteStatus *int        // Last status given to WriteHeader()
-       wroteBodyBytes *int     // Bytes successfully written
-       err *error              // Last error returned from Write()
+       wroteStatus    int   // Last status given to WriteHeader()
+       wroteBodyBytes int   // Bytes successfully written
+       err            error // Last error returned from Write()
 }
 
 func WrapResponseWriter(orig http.ResponseWriter) ResponseWriter {
-       return ResponseWriter{orig, new(int), new(int), new(error)}
+       return &responseWriter{ResponseWriter: orig}
+}
+
+func (w *responseWriter) CloseNotify() <-chan bool {
+       if cn, ok := w.ResponseWriter.(http.CloseNotifier); ok {
+               return cn.CloseNotify()
+       }
+       return nil
 }
 
-func (w ResponseWriter) WriteHeader(s int) {
-       *w.wroteStatus = s
+func (w *responseWriter) WriteHeader(s int) {
+       w.wroteStatus = s
        w.ResponseWriter.WriteHeader(s)
 }
 
-func (w ResponseWriter) Write(data []byte) (n int, err error) {
+func (w *responseWriter) Write(data []byte) (n int, err error) {
+       if w.wroteStatus == 0 {
+               w.WriteHeader(http.StatusOK)
+       }
        n, err = w.ResponseWriter.Write(data)
-       *w.wroteBodyBytes += n
-       *w.err = err
+       w.wroteBodyBytes += n
+       w.err = err
        return
 }
 
-func (w ResponseWriter) WroteStatus() int {
-       return *w.wroteStatus
+func (w *responseWriter) WroteStatus() int {
+       return w.wroteStatus
 }
 
-func (w ResponseWriter) WroteBodyBytes() int {
-       return *w.wroteBodyBytes
+func (w *responseWriter) WroteBodyBytes() int {
+       return w.wroteBodyBytes
 }
 
-func (w ResponseWriter) Err() error {
-       return *w.err
+func (w *responseWriter) Err() error {
+       return w.err
 }