This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push: new b8babecbe [IO-831] Support getInputStream() for https & http in URIOrigin (#630) b8babecbe is described below commit b8babecbe42f2585c50f0dee7bc42b1201557151 Author: Thach Le <lephuocth...@gmail.com> AuthorDate: Mon Jun 3 01:11:57 2024 +0700 [IO-831] Support getInputStream() for https & http in URIOrigin (#630) * IO-831 Support https & http by URIOrigin * Update test * Fix typo * Fix comment * Remove extra whitespace * Missed refactoring --------- Co-authored-by: Gary Gregory <garydgreg...@users.noreply.github.com> --- .../apache/commons/io/build/AbstractOrigin.java | 15 +++++++++++++ .../org/apache/commons/io/build/URIOriginTest.java | 25 ++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java index 3797c9cc5..fdaef97a9 100644 --- a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java +++ b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java @@ -33,12 +33,14 @@ import java.nio.file.Files; import java.nio.file.OpenOption; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.spi.FileSystemProvider; import java.util.Arrays; import java.util.Objects; import org.apache.commons.io.IOUtils; import org.apache.commons.io.RandomAccessFileMode; import org.apache.commons.io.RandomAccessFiles; +import org.apache.commons.io.file.spi.FileSystemProviders; import org.apache.commons.io.input.CharSequenceInputStream; import org.apache.commons.io.input.CharSequenceReader; import org.apache.commons.io.input.ReaderInputStream; @@ -402,6 +404,19 @@ public abstract class AbstractOrigin<T, B extends AbstractOrigin<T, B>> extends return Paths.get(get()); } + @Override + public InputStream getInputStream(final OpenOption... options) throws IOException { + final URI uri = get(); + final String scheme = uri.getScheme(); + final FileSystemProvider fileSystemProvider = FileSystemProviders.installed().getFileSystemProvider(scheme); + if (fileSystemProvider != null) { + return Files.newInputStream(fileSystemProvider.getPath(uri), options); + } + if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) { + return uri.toURL().openStream(); + } + return Files.newInputStream(getPath(), options); + } } /** diff --git a/src/test/java/org/apache/commons/io/build/URIOriginTest.java b/src/test/java/org/apache/commons/io/build/URIOriginTest.java index f609d7a21..6fe0f98be 100644 --- a/src/test/java/org/apache/commons/io/build/URIOriginTest.java +++ b/src/test/java/org/apache/commons/io/build/URIOriginTest.java @@ -16,11 +16,17 @@ */ package org.apache.commons.io.build; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import java.io.InputStream; import java.net.URI; import java.nio.file.Paths; import org.apache.commons.io.build.AbstractOrigin.URIOrigin; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** * Tests {@link URIOrigin}. @@ -35,4 +41,23 @@ public class URIOriginTest extends AbstractOriginTest<URI, URIOrigin> { setOriginRw(new URIOrigin(Paths.get(FILE_NAME_RW).toUri())); } + @ParameterizedTest + @ValueSource(strings = { + "http://example.com", + "https://example.com" + }) + void testGetInputStream(String uri) throws Exception { + final AbstractOrigin.URIOrigin origin = new AbstractOrigin.URIOrigin(new URI(uri)); + try (final InputStream in = origin.getInputStream()) { + assertNotEquals(-1, in.read()); + } + } + + @Test + void testGetInputStreamFileURI() throws Exception { + final AbstractOrigin.URIOrigin origin = getOriginRo().asThis(); + try (final InputStream in = origin.getInputStream()) { + assertNotEquals(-1, in.read()); + } + } }