Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'workhorse/internal/helper/countingresponsewriter.go')
-rw-r--r--workhorse/internal/helper/countingresponsewriter.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/workhorse/internal/helper/countingresponsewriter.go b/workhorse/internal/helper/countingresponsewriter.go
new file mode 100644
index 00000000000..a79d51d4c6a
--- /dev/null
+++ b/workhorse/internal/helper/countingresponsewriter.go
@@ -0,0 +1,56 @@
+package helper
+
+import (
+ "net/http"
+)
+
+type CountingResponseWriter interface {
+ http.ResponseWriter
+ Count() int64
+ Status() int
+}
+
+type countingResponseWriter struct {
+ rw http.ResponseWriter
+ status int
+ count int64
+}
+
+func NewCountingResponseWriter(rw http.ResponseWriter) CountingResponseWriter {
+ return &countingResponseWriter{rw: rw}
+}
+
+func (c *countingResponseWriter) Header() http.Header {
+ return c.rw.Header()
+}
+
+func (c *countingResponseWriter) Write(data []byte) (int, error) {
+ if c.status == 0 {
+ c.WriteHeader(http.StatusOK)
+ }
+
+ n, err := c.rw.Write(data)
+ c.count += int64(n)
+ return n, err
+}
+
+func (c *countingResponseWriter) WriteHeader(status int) {
+ if c.status != 0 {
+ return
+ }
+
+ c.status = status
+ c.rw.WriteHeader(status)
+}
+
+// Count returns the number of bytes written to the ResponseWriter. This
+// function is not thread-safe.
+func (c *countingResponseWriter) Count() int64 {
+ return c.count
+}
+
+// Status returns the first HTTP status value that was written to the
+// ResponseWriter. This function is not thread-safe.
+func (c *countingResponseWriter) Status() int {
+ return c.status
+}