HADOOP-15217. FsUrlConnection does not handle paths with spaces. Contributed by Joseph Fourny and Zsolt Venczel.

(cherry picked from commit ba4011d64f)
This commit is contained in:
Xiao Chen 2018-06-05 21:17:42 -07:00
parent b0283fc193
commit f1c91e9fda
2 changed files with 29 additions and 9 deletions

View File

@ -57,7 +57,7 @@ class FsUrlConnection extends URLConnection {
try { try {
LOG.debug("Connecting to {}", url); LOG.debug("Connecting to {}", url);
FileSystem fs = FileSystem.get(url.toURI(), conf); FileSystem fs = FileSystem.get(url.toURI(), conf);
is = fs.open(new Path(url.getPath())); is = fs.open(new Path(url.toURI()));
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
throw new IOException(e.toString()); throw new IOException(e.toString());
} }

View File

@ -18,14 +18,19 @@
package org.apache.hadoop.fs; package org.apache.hadoop.fs;
import org.apache.hadoop.test.GenericTestUtils;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.Timeout;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random; import java.util.Random;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
/** /**
* Test of the URL stream handler factory. * Test of the URL stream handler factory.
@ -35,7 +40,9 @@ public class TestUrlStreamHandlerFactory {
private static final int RUNS = 20; private static final int RUNS = 20;
private static final int THREADS = 10; private static final int THREADS = 10;
private static final int TASKS = 200; private static final int TASKS = 200;
private static final int TIMEOUT = 30;
@Rule
public Timeout globalTimeout = new Timeout(30000);
@Test @Test
public void testConcurrency() throws Exception { public void testConcurrency() throws Exception {
@ -62,12 +69,6 @@ public class TestUrlStreamHandlerFactory {
} }
executor.shutdown(); executor.shutdown();
try {
executor.awaitTermination(TIMEOUT, TimeUnit.SECONDS);
executor.shutdownNow();
} catch (InterruptedException e) {
// pass
}
// check for exceptions // check for exceptions
for (Future future : futures) { for (Future future : futures) {
@ -77,4 +78,23 @@ public class TestUrlStreamHandlerFactory {
future.get(); future.get();
} }
} }
@Test
public void testFsUrlStreamHandlerFactory() throws IOException {
File myFile = new File(GenericTestUtils.getTestDir(), "foo bar.txt");
myFile.createNewFile();
// Create URL directly from File (JRE builds it).
URL myUrl = myFile.toURI().toURL();
// Succeeds.
myUrl.openStream().close();
// Replace handling of file: scheme with FsUrlStreamHandler.
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
URL myUrl2 = myFile.toURI().toURL();
myUrl2.openStream();
}
} }