You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by gn...@apache.org on 2026/03/12 11:10:35 UTC
(cxf) branch cleanup/remove-pre-servlet31-compat created (now 7bbe8b7a82)
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a change to branch cleanup/remove-pre-servlet31-compat
in repository https://gitbox.apache.org/repos/asf/cxf.git
at 7bbe8b7a82 Remove pre-Servlet 3.1 backward-compatibility code and fix form post content-type matching
This branch includes the following new commits:
new 7bbe8b7a82 Remove pre-Servlet 3.1 backward-compatibility code and fix form post content-type matching
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(cxf) 01/01: Remove pre-Servlet 3.1 backward-compatibility code and fix form post content-type matching
Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch cleanup/remove-pre-servlet31-compat
in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 7bbe8b7a829ea406b8ed666364ef3bfa2889de0d
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Mar 12 12:10:26 2026 +0100
Remove pre-Servlet 3.1 backward-compatibility code and fix form post content-type matching
CXF now requires Jakarta Servlet 6.x, so the runtime checks for Servlet 3.0/3.1
availability are dead code. This commit:
- Removes the isServlet3 field and reflection check in AbstractHTTPDestination
- Merges Servlet31Continuation into Servlet3Continuation (removing the subclass)
- Removes the IS_31 static check in Servlet3ContinuationProvider
- Simplifies retrieveFromContinuation and setupContinuation
- Fixes FormUtils.isFormPostRequest() to use startsWith instead of equals,
so content types like "application/x-www-form-urlencoded;charset=UTF-16BE"
are correctly recognized as form posts
Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
---
.../java/org/apache/cxf/jaxrs/utils/FormUtils.java | 4 +-
.../transport/http/AbstractHTTPDestination.java | 43 ++++----------------
.../http/Servlet3ContinuationProvider.java | 47 +++++-----------------
3 files changed, 20 insertions(+), 74 deletions(-)
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java
index f8443785ba..63dfd24f50 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/FormUtils.java
@@ -306,7 +306,9 @@ public final class FormUtils {
}
public static boolean isFormPostRequest(Message m) {
- return MediaType.APPLICATION_FORM_URLENCODED.equals(m.get(Message.CONTENT_TYPE))
+ String contentType = (String) m.get(Message.CONTENT_TYPE);
+ return contentType != null
+ && contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED)
&& HttpMethod.POST.equals(m.get(Message.HTTP_REQUEST_METHOD));
}
}
diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
index b96814b876..d1b451280e 100644
--- a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
+++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/AbstractHTTPDestination.java
@@ -36,7 +36,6 @@ import javax.xml.namespace.QName;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
-import jakarta.servlet.ServletRequest;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.cxf.Bus;
@@ -120,7 +119,6 @@ public abstract class AbstractHTTPDestination
protected boolean fixedParameterOrder;
protected boolean multiplexWithAddress;
protected CertConstraints certConstraints;
- protected boolean isServlet3;
protected boolean decodeBasicAuthWithIso8859;
protected ContinuationProviderFactory cproviderFactory;
protected boolean enableWebSocket;
@@ -147,12 +145,6 @@ public abstract class AbstractHTTPDestination
this.bus = b;
this.registry = registry;
this.path = path;
- try {
- ServletRequest.class.getMethod("isAsyncSupported");
- isServlet3 = true;
- } catch (Throwable t) {
- //servlet 2.5 or earlier, no async support
- }
decodeBasicAuthWithIso8859 = PropertyUtils.isTrue(bus.getProperty(DECODE_BASIC_AUTH_WITH_ISO8859));
initConfig();
@@ -513,39 +505,20 @@ public abstract class AbstractHTTPDestination
return contentType;
}
protected Message retrieveFromContinuation(HttpServletRequest req) {
- if (!isServlet3) {
- if (cproviderFactory != null) {
- return cproviderFactory.retrieveFromContinuation(req);
- }
- return null;
- }
- return retrieveFromServlet3Async(req);
- }
-
- protected Message retrieveFromServlet3Async(HttpServletRequest req) {
- try {
- return (Message)req.getAttribute(CXF_CONTINUATION_MESSAGE);
- } catch (Throwable ex) {
- // the request may not implement the Servlet3 API
- }
- return null;
+ return (Message)req.getAttribute(CXF_CONTINUATION_MESSAGE);
}
protected void setupContinuation(Message inMessage,
final HttpServletRequest req,
final HttpServletResponse resp) {
- try {
- if (isServlet3 && req.isAsyncSupported()) {
- inMessage.put(ContinuationProvider.class.getName(),
- new Servlet3ContinuationProvider(req, resp, inMessage));
- } else if (cproviderFactory != null) {
- ContinuationProvider p = cproviderFactory.createContinuationProvider(inMessage, req, resp);
- if (p != null) {
- inMessage.put(ContinuationProvider.class.getName(), p);
- }
+ if (req.isAsyncSupported()) {
+ inMessage.put(ContinuationProvider.class.getName(),
+ new Servlet3ContinuationProvider(req, resp, inMessage));
+ } else if (cproviderFactory != null) {
+ ContinuationProvider p = cproviderFactory.createContinuationProvider(inMessage, req, resp);
+ if (p != null) {
+ inMessage.put(ContinuationProvider.class.getName(), p);
}
- } catch (Throwable ex) {
- // the request may not implement the Servlet3 API
}
}
protected String getBasePath(String contextPath) throws IOException {
diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java
index 2ea28f632c..946ed0c263 100644
--- a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java
+++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Servlet3ContinuationProvider.java
@@ -28,7 +28,6 @@ import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.WriteListener;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-import org.apache.cxf.common.classloader.ClassLoaderUtils;
import org.apache.cxf.common.util.PropertyUtils;
import org.apache.cxf.continuations.Continuation;
import org.apache.cxf.continuations.ContinuationCallback;
@@ -40,18 +39,6 @@ import org.apache.cxf.phase.PhaseInterceptorChain;
*
*/
public class Servlet3ContinuationProvider implements ContinuationProvider {
- static final boolean IS_31;
- static {
- boolean is31;
- try {
- ClassLoaderUtils.loadClass("jakarta.servlet.WriteListener", HttpServletRequest.class);
- is31 = true;
- } catch (Throwable t) {
- is31 = false;
- }
- IS_31 = is31;
- }
-
HttpServletRequest req;
HttpServletResponse resp;
Message inMessage;
@@ -80,7 +67,7 @@ public class Servlet3ContinuationProvider implements ContinuationProvider {
}
if (continuation == null) {
- continuation = IS_31 ? new Servlet31Continuation() : new Servlet3Continuation();
+ continuation = new Servlet3Continuation();
} else {
continuation.startAsyncAgain();
}
@@ -138,7 +125,13 @@ public class Servlet3ContinuationProvider implements ContinuationProvider {
return true;
}
protected void updateMessageForSuspend() {
- inMessage.getExchange().getInMessage().getInterceptorChain().suspend();
+ Message currentMessage = PhaseInterceptorChain.getCurrentMessage();
+ if (currentMessage.get(WriteListener.class) != null) {
+ getOutputStream().setWriteListener(currentMessage.get(WriteListener.class));
+ currentMessage.getInterceptorChain().suspend();
+ } else {
+ inMessage.getExchange().getInMessage().getInterceptorChain().suspend();
+ }
}
public void redispatch() {
if (!isComplete) {
@@ -239,7 +232,7 @@ public class Servlet3ContinuationProvider implements ContinuationProvider {
@Override
public boolean isReadyForWrite() {
- return true;
+ return getOutputStream().isReady();
}
protected ServletOutputStream getOutputStream() {
@@ -255,26 +248,4 @@ public class Servlet3ContinuationProvider implements ContinuationProvider {
return isTimeout;
}
}
- public class Servlet31Continuation extends Servlet3Continuation {
- public Servlet31Continuation() {
- }
-
- @Override
- protected void updateMessageForSuspend() {
- Message currentMessage = PhaseInterceptorChain.getCurrentMessage();
- if (currentMessage.get(WriteListener.class) != null) {
- // CXF Continuation WriteListener will likely need to be introduced
- // for NIO supported with non-Servlet specific mechanisms
- getOutputStream().setWriteListener(currentMessage.get(WriteListener.class));
- currentMessage.getInterceptorChain().suspend();
- } else {
- inMessage.getExchange().getInMessage().getInterceptorChain().suspend();
- }
- }
-
- @Override
- public boolean isReadyForWrite() {
- return getOutputStream().isReady();
- }
- }
}