diff options
author | 2024-07-31 16:03:34 +0200 | |
---|---|---|
committer | 2024-07-31 15:03:34 +0100 | |
commit | 38f041cea1ba0cd3492f351353a29aa5b73e2731 (patch) | |
tree | bdd055d5cf7d9c06523c694cb4abe86d220960d0 /internal/api/util/response.go | |
parent | [feature] Object store custom URL (S3) (#3046) (diff) | |
download | gotosocial-38f041cea1ba0cd3492f351353a29aa5b73e2731.tar.xz |
[feature] Allow users to export data via the settings panel (#3140)
* [feature] Allow users to export data via the settings panel
* rename/move some stuff
Diffstat (limited to 'internal/api/util/response.go')
-rw-r--r-- | internal/api/util/response.go | 42 |
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( |