This is an automated email from the ASF dual-hosted git repository.
dkulp pushed a commit to branch 3.6.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/3.6.x-fixes by this push:
new 2ff1093580 Use a little bit of reflection to allow services to still
run with jetty9 (in Karaf for example) as well as jetty 10.
2ff1093580 is described below
commit 2ff109358027653d1afd6f252cf6f25048cafbb9
Author: Daniel Kulp <[email protected]>
AuthorDate: Thu May 25 10:44:33 2023 -0400
Use a little bit of reflection to allow services to still run with jetty9
(in Karaf for example) as well as jetty 10.
---
parent/pom.xml | 1 +
.../http_jetty/JettyHTTPServerEngine.java | 61 +++++++++++++---------
.../NoUpgradeHTTP2CServerConnectionFactory.java | 44 ++++++++++++++++
.../http_jetty/JettyHTTPDestinationTest.java | 20 +++----
4 files changed, 91 insertions(+), 35 deletions(-)
diff --git a/parent/pom.xml b/parent/pom.xml
index fd7a5af5cc..61f41e9624 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -153,6 +153,7 @@
<cxf.jettison.version>1.5.4</cxf.jettison.version>
<cxf.jetty.osgi.version>[9.2,11)</cxf.jetty.osgi.version>
<cxf.jetty10.version>10.0.15</cxf.jetty10.version>
+ <cxf.jetty9.version>9.4.51.v20230217</cxf.jetty9.version>
<cxf.jetty.version>${cxf.jetty10.version}</cxf.jetty.version>
<cxf.jexl.version>3.2.1</cxf.jexl.version>
<cxf.joda.time.version>2.10.10</cxf.joda.time.version>
diff --git
a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java
b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java
index 2cfe49fdba..658f155e8a 100644
---
a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java
+++
b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.io.Writer;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
@@ -56,13 +57,9 @@ import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.transport.HttpUriMapper;
import org.apache.cxf.transport.http.HttpServerEngineSupport;
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
-import org.eclipse.jetty.http.BadMessageException;
-import org.eclipse.jetty.http.HttpFields.Mutable;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.security.SecurityHandler;
import org.eclipse.jetty.server.AbstractConnector;
import org.eclipse.jetty.server.ConnectionFactory;
@@ -608,7 +605,13 @@ public class JettyHTTPServerEngine implements
ServerEngine, HttpServerEngineSupp
try {
Container container = getContainer(server);
- container.addEventListener(mBeanContainer);
+ Method[] methods =
ReflectionUtil.getDeclaredMethods(container.getClass());
+ for (Method m : methods) {
+ if ("addEventListener".equals(m.getName())) {
+ ReflectionUtil.setAccessible(m).invoke(container,
mBeanContainer);
+ }
+ }
+ //container.addEventListener(mBeanContainer);
mBeanContainer.beanAdded(null, server);
} catch (RuntimeException rex) {
throw rex;
@@ -693,9 +696,18 @@ public class JettyHTTPServerEngine implements
ServerEngine, HttpServerEngineSupp
// additional dependency.
final ALPNServerConnectionFactory alpn = new
ALPNServerConnectionFactory();
alpn.setDefaultProtocol(httpFactory.getProtocol());
+
+ Constructor<SslConnectionFactory>[] cons
+ =
ReflectionUtil.getDeclaredConstructors(SslConnectionFactory.class);
+ for (Constructor<SslConnectionFactory> c : cons) {
+ if (c.getParameterCount() == 2
+ && c.getParameterTypes()[1] == String.class
+ && c.getParameterTypes()[0].isInstance(sslcf))
{
+ SslConnectionFactory scf =
c.newInstance(sslcf, alpn.getProtocol());
+ connectionFactories.add(scf);
+ }
+ }
- final SslConnectionFactory scf = new
SslConnectionFactory(sslcf, alpn.getProtocol());
- connectionFactories.add(scf);
connectionFactories.add(alpn);
connectionFactories.add(new
HTTP2ServerConnectionFactory(httpConfig));
} catch (Throwable ex) {
@@ -705,8 +717,16 @@ public class JettyHTTPServerEngine implements
ServerEngine, HttpServerEngineSupp
}
}
if (connectionFactories.size() == 1) {
- final SslConnectionFactory scf = new
SslConnectionFactory(sslcf, httpFactory.getProtocol());
- connectionFactories.add(scf);
+ Constructor<SslConnectionFactory>[] cons
+ =
ReflectionUtil.getDeclaredConstructors(SslConnectionFactory.class);
+ for (Constructor<SslConnectionFactory> c : cons) {
+ if (c.getParameterCount() == 2
+ && c.getParameterTypes()[1] == String.class
+ && c.getParameterTypes()[0].isInstance(sslcf)) {
+ SslConnectionFactory scf = c.newInstance(sslcf,
httpFactory.getProtocol());
+ connectionFactories.add(scf);
+ }
+ }
}
// Has to be set before the default protocol change
@@ -717,22 +737,13 @@ public class JettyHTTPServerEngine implements
ServerEngine, HttpServerEngineSupp
} else if (isHttp2Enabled(bus)) {
connectionFactories.add(httpFactory);
try {
- connectionFactories.add(new
HTTP2CServerConnectionFactory(httpConfig) {
-
- @Override
- public Connection upgradeConnection(Connector c,
EndPoint endPoint,
-
org.eclipse.jetty.http.MetaData.Request request,
- Mutable
response101)
- throws BadMessageException {
- if (request.getContentLength() > 0
- ||
request.getFields().contains("Transfer-Encoding")) {
- // if there is a body, we cannot upgrade
- return null;
- }
- return super.upgradeConnection(c, endPoint,
request, response101);
- }
- });
+ connectionFactories.add(new
NoUpgradeHTTP2CServerConnectionFactory(httpConfig));
} catch (Throwable ex) {
+ try {
+ connectionFactories.add(new
HTTP2CServerConnectionFactory(httpConfig));
+ } catch (Throwable e2) {
+ //ignore
+ }
if (isHttp2Required(bus)) {
throw ex;
}
@@ -1104,7 +1115,7 @@ public class JettyHTTPServerEngine implements
ServerEngine, HttpServerEngineSupp
}
//After upgrade Jetty to 10.0.12, server.destroy() will clear
all MBeans from container
//The old version doesn't behavior like this and this
- //server.destroy();
+ server.destroy();
server = null;
}
}
diff --git
a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/NoUpgradeHTTP2CServerConnectionFactory.java
b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/NoUpgradeHTTP2CServerConnectionFactory.java
new file mode 100644
index 0000000000..b7f1b0e373
--- /dev/null
+++
b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/NoUpgradeHTTP2CServerConnectionFactory.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.transport.http_jetty;
+
+import org.eclipse.jetty.http.BadMessageException;
+import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.HttpConfiguration;
+
+class NoUpgradeHTTP2CServerConnectionFactory extends
HTTP2CServerConnectionFactory {
+ NoUpgradeHTTP2CServerConnectionFactory(HttpConfiguration
httpConfiguration) {
+ super(httpConfiguration);
+ }
+ @Override
+ public Connection upgradeConnection(Connector c, EndPoint endPoint,
+
org.eclipse.jetty.http.MetaData.Request request,
+
org.eclipse.jetty.http.HttpFields.Mutable response101)
+ throws BadMessageException {
+ if (request.getContentLength() > 0
+ || request.getFields().contains("Transfer-Encoding")) {
+ // if there is a body, we cannot upgrade
+ return null;
+ }
+ return super.upgradeConnection(c, endPoint, request, response101);
+ }
+}
\ No newline at end of file
diff --git
a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java
b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java
index 670b656d94..dab7139483 100644
---
a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java
+++
b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestinationTest.java
@@ -24,6 +24,7 @@ import java.io.OutputStream;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -70,7 +71,6 @@ import org.apache.cxf.ws.addressing.AddressingProperties;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.apache.cxf.ws.addressing.EndpointReferenceUtils;
import org.apache.cxf.ws.addressing.JAXWSAConstants;
-import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
@@ -676,17 +676,17 @@ public class JettyHTTPDestinationTest {
EasyMock.expect(request.getAttribute("org.eclipse.jetty.ajax.Continuation")).andReturn(null);
EasyMock.expect(request.getAttribute("http.service.redirection")).andReturn(null).anyTimes();
- HttpFields.Mutable httpFields = HttpFields.build();
- httpFields.add("content-type", "text/xml");
- httpFields.add("content-type", "charset=utf8");
- httpFields.put(JettyHTTPDestinationTest.AUTH_HEADER,
JettyHTTPDestinationTest.BASIC_AUTH);
-
-
EasyMock.expect(request.getHeaderNames()).andReturn(httpFields.getFieldNames());
+ List<String> headers = Arrays.asList(new String[]
{"content-type",
+
JettyHTTPDestinationTest.AUTH_HEADER});
+ List<String> ct = Arrays.asList(new String[] {"text/xml",
"charset=utf8"});
+
EasyMock.expect(request.getHeaderNames()).andReturn(Collections.enumeration(headers));
request.getHeaders("content-type");
-
EasyMock.expectLastCall().andReturn(httpFields.getValues("content-type"));
+
EasyMock.expectLastCall().andReturn(Collections.enumeration(ct));
request.getHeaders(JettyHTTPDestinationTest.AUTH_HEADER);
- EasyMock.expectLastCall().andReturn(
-
httpFields.getValues(JettyHTTPDestinationTest.AUTH_HEADER));
+ EasyMock.expectLastCall()
+ .andReturn(Collections
+ .enumeration(Collections
+
.singletonList(JettyHTTPDestinationTest.BASIC_AUTH)));
EasyMock.expect(request.getInputStream()).andReturn(is);
request.setHandled(true);