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