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 <d...@kulp.com>
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);

Reply via email to