aboutsummaryrefslogtreecommitdiffstatshomepage
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
parent3b0e5c790ff51756c1317f4af83a2f0b0e66efd9 (diff)
Move ansi stripper to util package
-rw-r--r--Makefile2
-rw-r--r--api/api.go7
-rw-r--r--api/docker.go33
-rw-r--r--util/util.go38
-rw-r--r--util/util_test.go (renamed from api/docker_test.go)6
5 files changed, 48 insertions, 38 deletions
diff --git a/Makefile b/Makefile
index 6867614..45282a3 100644
--- a/Makefile
+++ b/Makefile
@@ -20,5 +20,5 @@ info:
@echo "BIN: $(BIN)"
@echo "SERVICE: $(SERVICE)"
-nonsense-time: nonsense-time.go $(wildcard api/*.go) $(wildcard dashboard/*.go)
+nonsense-time: nonsense-time.go $(wildcard api/*.go) $(wildcard dashboard/*.go) $(wildcard util/*.go)
go build .
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/util/util.go b/util/util.go
new file mode 100644
index 0000000..deb528b
--- /dev/null
+++ b/util/util.go
@@ -0,0 +1,38 @@
+package util
+
+import (
+ "io"
+ "regexp"
+)
+
+// 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()
+}
diff --git a/api/docker_test.go b/util/util_test.go
index 7d85803..1c4ae39 100644
--- a/api/docker_test.go
+++ b/util/util_test.go
@@ -1,8 +1,8 @@
-package api_test
+package util_test;
import (
"io"
- "nonsense-time/api"
+ "nonsense-time/util"
"strings"
"testing"
)
@@ -24,7 +24,7 @@ func (stringReadCloser) Close() error {
func testAnsiStripper(t *testing.T, input string, expected string) {
reader := newStringReadCloser(input)
- cleanReader := api.NewAnsiStripper(reader)
+ cleanReader := util.NewAnsiStripper(reader)
defer cleanReader.Close()
buf := new(strings.Builder)