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) +}