diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | api/api.go | 7 | ||||
| -rw-r--r-- | api/docker.go | 33 | ||||
| -rw-r--r-- | util/util.go | 38 | ||||
| -rw-r--r-- | util/util_test.go (renamed from api/docker_test.go) | 6 |
5 files changed, 48 insertions, 38 deletions
@@ -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 . @@ -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) |
