aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/api
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2024-10-08 13:17:03 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2024-10-08 13:17:03 -0400
commit13c771c84e6b86cebe6df14d0e92001f940581ba (patch)
tree4b76f90de9c783dc3cb5da633bfc8434964e039d /api
parent3b0e5c790ff51756c1317f4af83a2f0b0e66efd9 (diff)
Move ansi stripper to util package
Diffstat (limited to 'api')
-rw-r--r--api/api.go7
-rw-r--r--api/docker.go33
-rw-r--r--api/docker_test.go50
3 files changed, 6 insertions, 84 deletions
diff --git a/api/api.go b/api/api.go
index eb801eb..650e3d2 100644
--- a/api/api.go
+++ b/api/api.go
@@ -5,6 +5,7 @@ import (
"encoding/json"
"log/slog"
"net/http"
+ "nonsense-time/util"
"os"
"strconv"
"time"
@@ -84,10 +85,14 @@ func VttLogs(w http.ResponseWriter, req *http.Request) {
http.Error(w, "Error occured while getting logs", http.StatusInternalServerError)
return
}
+ logReader = util.NewAnsiStripper(logReader)
defer logReader.Close()
- if _, err = stdcopy.StdCopy(w, w, logReader); err != nil {
+ // FIXME: erroring here with "Unrecognized input header: 112"
+ n, err := stdcopy.StdCopy(w, nil, logReader)
+ if err != nil {
Logger.Error("Error occured while writting logs to response", slog.Any("err", err), slog.Any("request", req))
+ Logger.Error("", slog.Int64("written", n))
http.Error(w, "Error occured while writting logs", http.StatusInternalServerError)
return
}
diff --git a/api/docker.go b/api/docker.go
index c79b76d..551c818 100644
--- a/api/docker.go
+++ b/api/docker.go
@@ -5,7 +5,6 @@ import (
"fmt"
"io"
"log/slog"
- "regexp"
"time"
"github.com/docker/docker/api/types/container"
@@ -14,38 +13,6 @@ import (
const vttContainerId string = "foundry-foundry-1"
-// Strip ansi control characters from source
-//
-// The source reader is automatically closed when stripper reader is
-type ansiStripper struct {
- regex regexp.Regexp
- source io.ReadCloser
-}
-
-func NewAnsiStripper(source io.ReadCloser) *ansiStripper {
- striper := new(ansiStripper)
- striper.regex = *regexp.MustCompile(`\x1b[[0-9;]*m`)
- striper.source = source
-
- return striper
-}
-
-func (rc ansiStripper) Read(p []byte) (int, error) {
- n, err := rc.source.Read(p)
- if err != io.EOF && err != nil {
- return n, err
- }
-
- stripped := rc.regex.ReplaceAll(p[:n], []byte(""))
- n = copy(p, stripped)
-
- return n, err
-}
-
-func (rc ansiStripper) Close() error {
- return rc.source.Close()
-}
-
func stopVtt(ctx context.Context) error {
apiClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
diff --git a/api/docker_test.go b/api/docker_test.go
deleted file mode 100644
index 7d85803..0000000
--- a/api/docker_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-package api_test
-
-import (
- "io"
- "nonsense-time/api"
- "strings"
- "testing"
-)
-
-type stringReadCloser struct {
- *strings.Reader
-}
-
-func newStringReadCloser(s string) stringReadCloser {
- rc := stringReadCloser{}
- rc.Reader = strings.NewReader(s)
-
- return rc
-}
-
-func (stringReadCloser) Close() error {
- return nil
-}
-
-func testAnsiStripper(t *testing.T, input string, expected string) {
- reader := newStringReadCloser(input)
- cleanReader := api.NewAnsiStripper(reader)
- defer cleanReader.Close()
-
- buf := new(strings.Builder)
- n, err := io.Copy(buf, cleanReader)
- if err != nil {
- t.Fatal("Error while copying cleaned text to output", err)
- }
-
- result := buf.String()
-
- if n != int64(len(expected)) {
- t.Errorf("Expected to write %d characters but wrote %d\n", 3, n)
- }
-
- if result != expected {
- t.Errorf("Expected string `%s` but wrote `%s`", "abc", result)
- }
-}
-
-func TestStripAnsiColors(t *testing.T) {
- testAnsiStripper(t, "a\x1b[31mbc", "abc")
- testAnsiStripper(t, "[\x1b[32minfo\x1b[39m]", "[info]")
-}