Commit 8031a1bd authored by Ali Kord's avatar Ali Kord Committed by Andy Wilkinson

Fix handling of spaces in container's document root

See gh-10706
parent 276a9a0e
...@@ -19,6 +19,7 @@ package org.springframework.boot.context.embedded; ...@@ -19,6 +19,7 @@ package org.springframework.boot.context.embedded;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.JarURLConnection; import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.net.URLConnection; import java.net.URLConnection;
...@@ -87,7 +88,7 @@ public abstract class AbstractEmbeddedServletContainerFactory ...@@ -87,7 +88,7 @@ public abstract class AbstractEmbeddedServletContainerFactory
} }
private File getExplodedWarFileDocumentRoot() { private File getExplodedWarFileDocumentRoot() {
return getExplodedWarFileDocumentRoot(getCodeSourceArchive()); return getExplodedWarFileDocumentRoot(getCodeSourceArchive(getCodeSource()));
} }
protected List<URL> getUrlsOfJarsWithMetaInfResources() { protected List<URL> getUrlsOfJarsWithMetaInfResources() {
...@@ -172,7 +173,7 @@ public abstract class AbstractEmbeddedServletContainerFactory ...@@ -172,7 +173,7 @@ public abstract class AbstractEmbeddedServletContainerFactory
} }
private File getArchiveFileDocumentRoot(String extension) { private File getArchiveFileDocumentRoot(String extension) {
File file = getCodeSourceArchive(); File file = getCodeSourceArchive(getCodeSource());
if (this.logger.isDebugEnabled()) { if (this.logger.isDebugEnabled()) {
this.logger.debug("Code archive: " + file); this.logger.debug("Code archive: " + file);
} }
...@@ -193,19 +194,21 @@ public abstract class AbstractEmbeddedServletContainerFactory ...@@ -193,19 +194,21 @@ public abstract class AbstractEmbeddedServletContainerFactory
return null; return null;
} }
private File getCodeSourceArchive() { File getCodeSourceArchive(CodeSource codeSource) {
try { try {
CodeSource codeSource = getClass().getProtectionDomain().getCodeSource();
URL location = (codeSource == null ? null : codeSource.getLocation()); URL location = (codeSource == null ? null : codeSource.getLocation());
if (location == null) { if (location == null) {
return null; return null;
} }
String path = location.getPath(); String path;
URLConnection connection = location.openConnection(); URLConnection connection = location.openConnection();
if (connection instanceof JarURLConnection) { if (connection instanceof JarURLConnection) {
path = ((JarURLConnection) connection).getJarFile().getName(); path = ((JarURLConnection) connection).getJarFile().getName();
} }
if (path.indexOf("!/") != -1) { else {
path = location.toURI().getPath();
}
if (path.contains("!/")) {
path = path.substring(0, path.indexOf("!/")); path = path.substring(0, path.indexOf("!/"));
} }
return new File(path); return new File(path);
...@@ -213,6 +216,13 @@ public abstract class AbstractEmbeddedServletContainerFactory ...@@ -213,6 +216,13 @@ public abstract class AbstractEmbeddedServletContainerFactory
catch (IOException ex) { catch (IOException ex) {
return null; return null;
} }
catch (URISyntaxException e) {
return null;
}
}
private CodeSource getCodeSource() {
return getClass().getProtectionDomain().getCodeSource();
} }
protected final File getValidSessionStoreDir() { protected final File getValidSessionStoreDir() {
......
...@@ -30,9 +30,11 @@ import java.net.URI; ...@@ -30,9 +30,11 @@ import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.CodeSource;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.KeyStoreException; import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.Arrays; import java.util.Arrays;
...@@ -673,6 +675,22 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests { ...@@ -673,6 +675,22 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
} }
@Test
public void codeSourceArchivePath() throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
final CodeSource codeSource = new CodeSource(new URL("file", "", "/some/test/path/"), (Certificate[]) null);
final File codeSourceArchive = factory.getCodeSourceArchive(codeSource);
assertThat(codeSourceArchive).isEqualTo(new File("/some/test/path/"));
}
@Test
public void codeSourceArchivePathContainingSpaces() throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
final CodeSource codeSource = new CodeSource(new URL("file", "", "/test/path/with%20space/"), (Certificate[]) null);
final File codeSourceArchive = factory.getCodeSourceArchive(codeSource);
assertThat(codeSourceArchive).isEqualTo(new File("/test/path/with space/"));
}
protected Ssl getSsl(ClientAuth clientAuth, String keyPassword, String keyStore) { protected Ssl getSsl(ClientAuth clientAuth, String keyPassword, String keyStore) {
return getSsl(clientAuth, keyPassword, keyStore, null, null, null); return getSsl(clientAuth, keyPassword, keyStore, null, null, null);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment