From b4355fb17ac3ebefcc82e2ede51763937d16bfa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Hedenstr=C3=B6m?= <erik@hedenstroem.com> Date: Sat, 18 May 2024 21:44:58 +0000 Subject: [PATCH] Implemented URI support for input --- test/hello.txt | 1 + uri.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 test/hello.txt create mode 100644 uri.go diff --git a/test/hello.txt b/test/hello.txt new file mode 100644 index 0000000..8ab686e --- /dev/null +++ b/test/hello.txt @@ -0,0 +1 @@ +Hello, World! diff --git a/uri.go b/uri.go new file mode 100644 index 0000000..9139e36 --- /dev/null +++ b/uri.go @@ -0,0 +1,60 @@ +package snok + +import ( + "bytes" + "encoding/base64" + "io" + "net/http" + "net/url" + "os" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func openURI(t *testing.T, uri string) io.Reader { + parsedURL, err := url.Parse(uri) + require.NoError(t, err) + switch parsedURL.Scheme { + case "http", "https": + return openHTTP(t, uri) + case "file": + return openFile(t, parsedURL) + case "data": + return openData(t, parsedURL) + default: + return strings.NewReader(uri) + } +} + +func openHTTP(t *testing.T, uri string) io.Reader { + resp, err := http.Get(uri) + require.NoError(t, err) + return resp.Body +} + +func openFile(t *testing.T, parsedURL *url.URL) io.Reader { + path := parsedURL.Opaque + file, err := os.Open(path) + require.NoError(t, err) + return file +} + +func openData(t *testing.T, parsedURL *url.URL) io.Reader { + data := parsedURL.Opaque + require.NotEmpty(t, data, "Empty data URI") + + parts := strings.SplitN(data, ",", 2) + require.Len(t, parts, 2, "Invalid data URI format: %s", data) + + header := parts[0] + body := parts[1] + if strings.Contains(header, ";base64") { + decoded, err := base64.StdEncoding.DecodeString(body) + require.NoError(t, err) + return bytes.NewReader(decoded) + } + + return strings.NewReader(body) +} -- GitLab