diff --git a/test/hello.txt b/test/hello.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8ab686eafeb1f44702738c8b0f24f2567c36da6d
--- /dev/null
+++ b/test/hello.txt
@@ -0,0 +1 @@
+Hello, World!
diff --git a/uri.go b/uri.go
new file mode 100644
index 0000000000000000000000000000000000000000..9139e367ddb68c1f96d4b3a2d1cddb48c0d336d5
--- /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)
+}