summaryrefslogtreecommitdiff
path: root/internal/api/util/response.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/api/util/response.go')
-rw-r--r--internal/api/util/response.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/internal/api/util/response.go b/internal/api/util/response.go
index afdc578aa..01f15ccfb 100644
--- a/internal/api/util/response.go
+++ b/internal/api/util/response.go
@@ -18,6 +18,7 @@
package util
import (
+ "encoding/csv"
"encoding/json"
"encoding/xml"
"io"
@@ -213,6 +214,47 @@ func EncodeXMLResponse(
putBuf(buf)
}
+// EncodeCSVResponse encodes 'records' as CSV HTTP response
+// to ResponseWriter with given status code, using CSV content-type.
+func EncodeCSVResponse(
+ rw http.ResponseWriter,
+ r *http.Request,
+ statusCode int,
+ records [][]string,
+) {
+ // Acquire buffer.
+ buf := getBuf()
+
+ // Wrap buffer in CSV writer.
+ csvWriter := csv.NewWriter(buf)
+
+ // Write all the records to the buffer.
+ if err := csvWriter.WriteAll(records); err == nil {
+ // Respond with the now-known
+ // size byte slice within buf.
+ WriteResponseBytes(rw, r,
+ statusCode,
+ TextCSV,
+ buf.B,
+ )
+ } else {
+ // This will always be an csv error, we
+ // can't really add any more useful context.
+ log.Error(r.Context(), err)
+
+ // Any error returned here is unrecoverable,
+ // set Internal Server Error JSON response.
+ WriteResponseBytes(rw, r,
+ http.StatusInternalServerError,
+ AppJSON,
+ StatusInternalServerErrorJSON,
+ )
+ }
+
+ // Release.
+ putBuf(buf)
+}
+
// writeResponseUnknownLength handles reading data of unknown legnth
// efficiently into memory, and passing on to WriteResponseBytes().
func writeResponseUnknownLength(