This is an automated email from the ASF dual-hosted git repository.
rmaucher pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.1.x by this push:
new 95e9c9b49e Replace various existing patterns with the URLConnection wrapper
95e9c9b49e is described below
commit 95e9c9b49e25e0ad92318dd8844a25773df03d8e
Author: remm <[email protected]>
AuthorDate: Fri Jul 3 16:24:13 2026 +0200
Replace various existing patterns with the URLConnection wrapper
---
.../catalina/ssi/SSIServletExternalResolver.java | 40 ++++------------
.../org/apache/catalina/startup/ContextConfig.java | 31 +++---------
.../apache/catalina/users/MemoryUserDatabase.java | 56 +++++++++-------------
java/org/apache/jasper/JspCompilationContext.java | 27 ++++-------
java/org/apache/jasper/compiler/Compiler.java | 14 +++---
java/org/apache/jasper/compiler/TldCache.java | 11 ++---
java/org/apache/tomcat/Jar.java | 1 +
.../tomcat/util/file/ConfigurationSource.java | 10 +---
8 files changed, 61 insertions(+), 129 deletions(-)
diff --git a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
index 28e3a991c4..a1e04cf317 100644
--- a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
+++ b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
@@ -37,8 +37,8 @@ import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.connector.Request;
-import org.apache.tomcat.util.ExceptionUtils;
import org.apache.tomcat.util.buf.B2CConverter;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
import org.apache.tomcat.util.buf.UDecoder;
import org.apache.tomcat.util.http.Method;
import org.apache.tomcat.util.http.RequestUtil;
@@ -607,23 +607,12 @@ public class SSIServletExternalResolver implements SSIExternalResolver {
*/
@Override
public long getFileLastModified(String path, boolean virtual) throws IOException {
- long lastModified = 0;
- URLConnection urlConnection = null;
- try {
- urlConnection = getURLConnection(path, virtual);
- lastModified = urlConnection.getLastModified();
- } catch (IOException ignore) {
+ try (CloseableURLConnection urlConnection = new CloseableURLConnection(getURLConnection(path, virtual))) {
+ return urlConnection.getLastModified();
+ } catch (IOException e) {
// Ignore this. It will always fail for non-file based includes
- } finally {
- if (urlConnection != null) {
- try {
- urlConnection.getInputStream().close();
- } catch (Exception e) {
- ExceptionUtils.handleThrowable(e);
- }
- }
+ return 0L;
}
- return lastModified;
}
@@ -639,23 +628,12 @@ public class SSIServletExternalResolver implements SSIExternalResolver {
*/
@Override
public long getFileSize(String path, boolean virtual) throws IOException {
- long fileSize = -1;
- URLConnection urlConnection = null;
- try {
- urlConnection = getURLConnection(path, virtual);
- fileSize = urlConnection.getContentLengthLong();
- } catch (IOException ignore) {
+ try (CloseableURLConnection urlConnection = new CloseableURLConnection(getURLConnection(path, virtual))) {
+ return urlConnection.getContentLengthLong();
+ } catch (IOException e) {
// Ignore this. It will always fail for non-file based includes
- } finally {
- if (urlConnection != null) {
- try {
- urlConnection.getInputStream().close();
- } catch (Exception e) {
- ExceptionUtils.handleThrowable(e);
- }
- }
+ return -1L;
}
- return fileSize;
}
diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java
index 5439096706..23ae602ba1 100644
--- a/java/org/apache/catalina/startup/ContextConfig.java
+++ b/java/org/apache/catalina/startup/ContextConfig.java
@@ -84,6 +84,7 @@ import org.apache.tomcat.util.bcel.classfile.ClassParser;
import org.apache.tomcat.util.bcel.classfile.ElementValue;
import org.apache.tomcat.util.bcel.classfile.ElementValuePair;
import org.apache.tomcat.util.bcel.classfile.JavaClass;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
import org.apache.tomcat.util.buf.UriUtil;
import org.apache.tomcat.util.descriptor.InputSourceUtil;
import org.apache.tomcat.util.descriptor.XmlErrorHandler;
@@ -1696,42 +1697,24 @@ public class ContextConfig implements LifecycleListener {
long hostTimeStamp = 0;
if (globalWebXml != null) {
- URLConnection uc = null;
try {
URI uri = new URI(globalWebXml.getSystemId());
- URL url = uri.toURL();
- uc = url.openConnection();
- globalTimeStamp = uc.getLastModified();
+ try (CloseableURLConnection uc = new CloseableURLConnection(uri.toURL())) {
+ globalTimeStamp = uc.getLastModified();
+ }
} catch (IOException | URISyntaxException | IllegalArgumentException e) {
globalTimeStamp = -1;
- } finally {
- if (uc != null) {
- try {
- uc.getInputStream().close();
- } catch (Exception e) {
- ExceptionUtils.handleThrowable(e);
- }
- }
}
}
if (hostWebXml != null) {
- URLConnection uc = null;
try {
URI uri = new URI(hostWebXml.getSystemId());
- URL url = uri.toURL();
- uc = url.openConnection();
- hostTimeStamp = uc.getLastModified();
+ try (CloseableURLConnection uc = new CloseableURLConnection(uri.toURL())) {
+ hostTimeStamp = uc.getLastModified();
+ }
} catch (IOException | URISyntaxException | IllegalArgumentException e) {
hostTimeStamp = -1;
- } finally {
- if (uc != null) {
- try {
- uc.getInputStream().close();
- } catch (Exception e) {
- ExceptionUtils.handleThrowable(e);
- }
- }
}
}
diff --git a/java/org/apache/catalina/users/MemoryUserDatabase.java b/java/org/apache/catalina/users/MemoryUserDatabase.java
index f958909d74..a6543d818d 100644
--- a/java/org/apache/catalina/users/MemoryUserDatabase.java
+++ b/java/org/apache/catalina/users/MemoryUserDatabase.java
@@ -23,8 +23,6 @@ import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
@@ -40,6 +38,7 @@ import org.apache.catalina.User;
import org.apache.catalina.UserDatabase;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
import org.apache.tomcat.util.digester.AbstractObjectCreationFactory;
import org.apache.tomcat.util.digester.Digester;
import org.apache.tomcat.util.file.ConfigFileLoader;
@@ -627,43 +626,34 @@ public class MemoryUserDatabase implements UserDatabase {
}
URI uri = ConfigFileLoader.getSource().getURI(getPathname());
- URLConnection uConn = null;
try {
- URL url = uri.toURL();
- uConn = url.openConnection();
-
- if (this.lastModified != uConn.getLastModified()) {
- writeLock.lock();
- try {
- long detectedLastModified = uConn.getLastModified();
- // Last modified as a resolution of 1s. Ensure that a write
- // to the file is not in progress by ensuring that the last
- // modified time is at least 2 seconds ago.
- if (this.lastModified != detectedLastModified &&
- detectedLastModified + 2000 < System.currentTimeMillis()) {
- log.info(sm.getString("memoryUserDatabase.reload", id, uri));
- open();
+ try (CloseableURLConnection uConn = new CloseableURLConnection(uri.toURL())) {
+ if (this.lastModified != uConn.getLastModified()) {
+ writeLock.lock();
+ try {
+ long detectedLastModified = uConn.getLastModified();
+ // Last modified as a resolution of 1s. Ensure that a write
+ // to the file is not in progress by ensuring that the last
+ // modified time is at least 2 seconds ago.
+ if (this.lastModified != detectedLastModified &&
+ detectedLastModified + 2000 < System.currentTimeMillis()) {
+ log.info(sm.getString("memoryUserDatabase.reload", id, uri));
+ open();
+ }
+ } finally {
+ writeLock.unlock();
}
- } finally {
- writeLock.unlock();
}
+ } catch (FileNotFoundException fnfe) {
+ // The file doesn't exist.
+ // This has been logged above. No need to log again.
+ // Set the last modified time to avoid repeated log messages
+ this.lastModified = 0;
+ } catch (IOException ioe) {
+ log.warn(sm.getString("memoryUserDatabase.fileClose", pathname), ioe);
}
} catch (Exception e) {
log.error(sm.getString("memoryUserDatabase.reloadError", id, uri), e);
- } finally {
- if (uConn != null) {
- try {
- // Can't close a uConn directly. Have to do it like this.
- uConn.getInputStream().close();
- } catch (FileNotFoundException fnfe) {
- // The file doesn't exist.
- // This has been logged above. No need to log again.
- // Set the last modified time to avoid repeated log messages
- this.lastModified = 0;
- } catch (IOException ioe) {
- log.warn(sm.getString("memoryUserDatabase.fileClose", pathname), ioe);
- }
- }
}
}
diff --git a/java/org/apache/jasper/JspCompilationContext.java b/java/org/apache/jasper/JspCompilationContext.java
index 56418eecdd..947129d371 100644
--- a/java/org/apache/jasper/JspCompilationContext.java
+++ b/java/org/apache/jasper/JspCompilationContext.java
@@ -40,6 +40,7 @@ import org.apache.jasper.servlet.JspServletWrapper;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.Jar;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
/**
@@ -449,7 +450,6 @@ public class JspCompilationContext {
*/
public Long getLastModified(String resource, Jar tagJar) {
long result = -1;
- URLConnection uc = null;
try {
if (tagJar != null) {
if (resource.startsWith("/")) {
@@ -462,32 +462,23 @@ public class JspCompilationContext {
incrementRemoved();
return Long.valueOf(result);
}
- uc = jspUrl.openConnection();
- if (uc instanceof JarURLConnection) {
- JarEntry jarEntry = ((JarURLConnection) uc).getJarEntry();
- if (jarEntry != null) {
- result = jarEntry.getTime();
+ try (CloseableURLConnection uc = new CloseableURLConnection(jspUrl)) {
+ if (uc.getConnection() instanceof JarURLConnection) {
+ JarEntry jarEntry = ((JarURLConnection) uc.getConnection()).getJarEntry();
+ if (jarEntry != null) {
+ result = jarEntry.getTime();
+ } else {
+ result = uc.getLastModified();
+ }
} else {
result = uc.getLastModified();
}
- } else {
- result = uc.getLastModified();
}
}
} catch (IOException ioe) {
if (log.isDebugEnabled()) {
log.debug(Localizer.getMessage("jsp.error.lastModified", getJspFile()), ioe);
}
- } finally {
- if (uc != null) {
- try {
- uc.getInputStream().close();
- } catch (Exception e) {
- if (log.isDebugEnabled()) {
- log.debug(Localizer.getMessage("jsp.error.lastModified", getJspFile()), e);
- }
- }
- }
}
return Long.valueOf(result);
}
diff --git a/java/org/apache/jasper/compiler/Compiler.java b/java/org/apache/jasper/compiler/Compiler.java
index a46f8bb23c..ad2b1c2ca6 100644
--- a/java/org/apache/jasper/compiler/Compiler.java
+++ b/java/org/apache/jasper/compiler/Compiler.java
@@ -25,7 +25,6 @@ import java.io.UnsupportedEncodingException;
import java.net.JarURLConnection;
import java.net.URI;
import java.net.URL;
-import java.net.URLConnection;
import java.util.Map;
import java.util.Map.Entry;
@@ -37,6 +36,7 @@ import org.apache.jasper.servlet.JspServletWrapper;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.Jar;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
import org.apache.tomcat.util.scan.JarFactory;
@@ -559,13 +559,13 @@ public abstract class Compiler {
if (includeUrl == null) {
return true;
}
- URLConnection iuc = includeUrl.openConnection();
- if (iuc instanceof JarURLConnection) {
- includeLastModified = ((JarURLConnection) iuc).getJarEntry().getTime();
- } else {
- includeLastModified = iuc.getLastModified();
+ try (CloseableURLConnection iuc = new CloseableURLConnection(includeUrl)) {
+ if (iuc.getConnection() instanceof JarURLConnection) {
+ includeLastModified = ((JarURLConnection) iuc.getConnection()).getJarEntry().getTime();
+ } else {
+ includeLastModified = iuc.getLastModified();
+ }
}
- iuc.getInputStream().close();
}
if (includeLastModified != include.getValue().longValue()) {
diff --git a/java/org/apache/jasper/compiler/TldCache.java b/java/org/apache/jasper/compiler/TldCache.java
index 1e1094d07c..181fc73d62 100644
--- a/java/org/apache/jasper/compiler/TldCache.java
+++ b/java/org/apache/jasper/compiler/TldCache.java
@@ -18,7 +18,6 @@ package org.apache.jasper.compiler;
import java.io.IOException;
import java.net.URL;
-import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -28,6 +27,7 @@ import jakarta.servlet.ServletContext;
import org.apache.jasper.Constants;
import org.apache.jasper.JasperException;
import org.apache.tomcat.Jar;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
import org.apache.tomcat.util.descriptor.tld.TaglibXml;
import org.apache.tomcat.util.descriptor.tld.TldParser;
import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
@@ -168,13 +168,8 @@ public class TldCache {
// webappPath will be null for JARs containing TLDs that are on
// the class path but not part of the web application
URL url = servletContext.getResource(tldResourcePath.getWebappPath());
- URLConnection conn = url.openConnection();
- result[0] = conn.getLastModified();
- if ("file".equals(url.getProtocol())) {
- // Reading the last modified time opens an input stream so we
- // need to make sure it is closed again otherwise the TLD file
- // will be locked until GC runs.
- conn.getInputStream().close();
+ try (CloseableURLConnection conn = new CloseableURLConnection(url)) {
+ result[0] = conn.getLastModified();
}
}
try (Jar jar = tldResourcePath.openJar()) {
diff --git a/java/org/apache/tomcat/Jar.java b/java/org/apache/tomcat/Jar.java
index 4fbca5db16..0afa18d1c2 100644
--- a/java/org/apache/tomcat/Jar.java
+++ b/java/org/apache/tomcat/Jar.java
@@ -62,6 +62,7 @@ public interface Jar extends AutoCloseable {
URL jarUrl = getJarFileURL();
URLConnection urlConn = null;
try {
+ // Note: this cannot use CloseableURLConnection due to Tomcat JAR packaging
urlConn = jarUrl.openConnection();
return urlConn.getLastModified();
} finally {
diff --git a/java/org/apache/tomcat/util/file/ConfigurationSource.java b/java/org/apache/tomcat/util/file/ConfigurationSource.java
index 04f778cc4e..fbd4518d61 100644
--- a/java/org/apache/tomcat/util/file/ConfigurationSource.java
+++ b/java/org/apache/tomcat/util/file/ConfigurationSource.java
@@ -24,8 +24,8 @@ import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
-import java.net.URLConnection;
+import org.apache.tomcat.util.buf.CloseableURLConnection;
import org.apache.tomcat.util.buf.UriUtil;
/**
@@ -128,14 +128,8 @@ public interface ConfigurationSource {
* @throws IOException if an I/O error occurs while fetching the last modified time
*/
public long getLastModified() throws MalformedURLException, IOException {
- URLConnection connection = null;
- try {
- connection = uri.toURL().openConnection();
+ try (CloseableURLConnection connection = new CloseableURLConnection(uri.toURL())) {
return connection.getLastModified();
- } finally {
- if (connection != null) {
- connection.getInputStream().close();
- }
}
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.