You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/03/13 19:04:06 UTC

svn commit: r1300261 - in /cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport: http_jetty/JettyHTTPDestination.java https_jetty/CXFJettySslSocketConnector.java https_jetty/JettySslConnectorFactory.java

Author: dkulp
Date: Tue Mar 13 18:04:05 2012
New Revision: 1300261

URL: http://svn.apache.org/viewvc?rev=1300261&view=rev
Log:
Use some reflection magic to allow code compiled with Jetty 7.5 to work
with Jetty 7.6

Modified:
    cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java
    cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/CXFJettySslSocketConnector.java
    cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/JettySslConnectorFactory.java

Modified: cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java?rev=1300261&r1=1300260&r2=1300261&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java (original)
+++ cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPDestination.java Tue Mar 13 18:04:05 2012
@@ -34,6 +34,7 @@ import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.classloader.ClassLoaderUtils.ClassLoaderHolder;
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.ReflectionUtil;
 import org.apache.cxf.configuration.jsse.TLSServerParameters;
 import org.apache.cxf.configuration.security.CertificateConstraintsType;
 import org.apache.cxf.continuations.ContinuationProvider;
@@ -52,7 +53,9 @@ import org.apache.cxf.transport.https.Ce
 import org.apache.cxf.transports.http.QueryHandler;
 import org.apache.cxf.transports.http.QueryHandlerRegistry;
 import org.apache.cxf.transports.http.StemMatchingQueryHandler;
-import org.eclipse.jetty.server.HttpConnection;
+import org.eclipse.jetty.io.AbstractConnection;
+import org.eclipse.jetty.server.AsyncHttpConnection;
+import org.eclipse.jetty.server.BlockingHttpConnection;
 import org.eclipse.jetty.server.Request;
 
 public class JettyHTTPDestination extends AbstractHTTPDestination {
@@ -211,6 +214,15 @@ public class JettyHTTPDestination extend
                              HttpServletResponse resp) throws IOException {
         doService(servletContext, req, resp);
     }
+    
+    static AbstractConnection getConnectionForRequest(Request r) {
+        try {
+            return (AbstractConnection)r.getClass().getMethod("getConnection").invoke(r);
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+    
     protected void doService(ServletContext context,
                              HttpServletRequest req,
                              HttpServletResponse resp) throws IOException {
@@ -218,14 +230,18 @@ public class JettyHTTPDestination extend
             context = servletContext;
         }
         Request baseRequest = (req instanceof Request) 
-            ? (Request)req : HttpConnection.getCurrentConnection().getRequest();
+            ? (Request)req : getCurrentRequest();
             
         if (!"HEAD".equals(req.getMethod())) {
             //bug in Jetty with persistent connections that if a HEAD is
             //sent, a _head flag is never reset
-            HttpConnection c = baseRequest.getConnection();
+            AbstractConnection c = getConnectionForRequest(baseRequest);
             if (c != null) {
-                c.getGenerator().setHead(false);
+                if (c instanceof AsyncHttpConnection) {
+                    ((AsyncHttpConnection)c).getGenerator().setHead(false);
+                } else if (c instanceof BlockingHttpConnection) {
+                    ((BlockingHttpConnection)c).getGenerator().setHead(false);
+                }
             }
         }
         if (getServer().isSetRedirectURL()) {
@@ -300,7 +316,7 @@ public class JettyHTTPDestination extend
                                   final HttpServletResponse resp)
         throws IOException {
         Request baseRequest = (req instanceof Request) 
-            ? (Request)req : HttpConnection.getCurrentConnection().getRequest();
+            ? (Request)req : getCurrentRequest();
         
         if (LOG.isLoggable(Level.FINE)) {
             LOG.fine("Service http request on thread: " + Thread.currentThread());
@@ -363,4 +379,25 @@ public class JettyHTTPDestination extend
                       new JettyContinuationProvider(req, resp, inMessage));
         }
     }
+    
+    private AbstractConnection getCurrentConnection() {
+        Class<?> cls = AsyncHttpConnection.class.getSuperclass();
+        // AbstractHttpConnection on Jetty 7.6, HttpConnection on Jetty <=7.5
+        try {
+            return (AbstractConnection)ReflectionUtil
+                .setAccessible(cls.getMethod("getCurrentConnection")).invoke(null);
+        } catch (Exception e) {
+            //ignore
+        }
+        return null;
+    }
+    private Request getCurrentRequest() {
+        AbstractConnection con = getCurrentConnection();
+        if (con instanceof AsyncHttpConnection) {
+            return ((AsyncHttpConnection)con).getRequest();
+        } else if (con instanceof BlockingHttpConnection) {
+            return ((BlockingHttpConnection)con).getRequest();
+        }
+        return null;
+    }
 }

Modified: cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/CXFJettySslSocketConnector.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/CXFJettySslSocketConnector.java?rev=1300261&r1=1300260&r2=1300261&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/CXFJettySslSocketConnector.java (original)
+++ cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/CXFJettySslSocketConnector.java Tue Mar 13 18:04:05 2012
@@ -28,6 +28,7 @@ import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
 
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.ReflectionInvokationHandler;
 import org.apache.cxf.configuration.security.ClientAuthentication;
 import org.apache.cxf.configuration.security.FiltersType;
 import org.apache.cxf.transport.https.SSLUtils;
@@ -87,31 +88,31 @@ public class CXFJettySslSocketConnector 
      * configures an HTTP Destination.
      */
     protected void setClientAuthentication(ClientAuthentication clientAuth) {
-        getSslContextFactory().setWantClientAuth(true);
+        getCxfSslContextFactory().setWantClientAuth(true);
         if (clientAuth != null) {
             if (clientAuth.isSetWant()) {
-                getSslContextFactory().setWantClientAuth(clientAuth.isWant());
+                getCxfSslContextFactory().setWantClientAuth(clientAuth.isWant());
             }
             if (clientAuth.isSetRequired()) {
-                getSslContextFactory().setNeedClientAuth(clientAuth.isRequired());
+                getCxfSslContextFactory().setNeedClientAuth(clientAuth.isRequired());
             }
         }
     }
     
     protected void doStart() throws Exception {
         // setup the create SSLContext on the SSLContextFactory
-        getSslContextFactory().setSslContext(createSSLContext());
+        getCxfSslContextFactory().setSslContext(createSSLContext());
         super.doStart();
     }
     
     protected SSLContext createSSLContext() throws Exception  {
-        String proto = getSslContextFactory().getProtocol() == null
+        String proto = getCxfSslContextFactory().getProtocol() == null
             ? "TLS"
-                : getSslContextFactory().getProtocol();
+                : getCxfSslContextFactory().getProtocol();
  
-        SSLContext context = getSslContextFactory().getProvider() == null
+        SSLContext context = getCxfSslContextFactory().getProvider() == null
             ? SSLContext.getInstance(proto)
-                : SSLContext.getInstance(proto, getSslContextFactory().getProvider());
+                : SSLContext.getInstance(proto, getCxfSslContextFactory().getProvider());
             
         context.init(keyManagers, trustManagers, secureRandom);
 
@@ -122,8 +123,38 @@ public class CXFJettySslSocketConnector 
                     cipherSuitesFilter,
                     LOG, true);
         
-        getSslContextFactory().setExcludeCipherSuites(cs);
+        getCxfSslContextFactory().setExcludeCipherSuites(cs);
         
         return context;
     }
+    
+    public CxfSslContextFactory getCxfSslContextFactory() {
+        try {
+            Object o = getClass().getMethod("getSslContextFactory").invoke(this);
+            return ReflectionInvokationHandler.createProxyWrapper(o, CxfSslContextFactory.class);
+        } catch (Exception e) {
+            //ignore, the NPE is fine
+        }
+        
+        return null;
+    }
+    
+    interface CxfSslContextFactory {
+        void setExcludeCipherSuites(String ... cs);
+
+        String getProtocol();
+        
+        String getProvider();
+        
+        void setSslContext(SSLContext createSSLContext);
+
+        void setNeedClientAuth(boolean required);
+
+        void setWantClientAuth(boolean want);
+
+        void setProtocol(String secureSocketProtocol);
+
+        void setProvider(String jsseProvider);
+    }
+    
 }

Modified: cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/JettySslConnectorFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/JettySslConnectorFactory.java?rev=1300261&r1=1300260&r2=1300261&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/JettySslConnectorFactory.java (original)
+++ cxf/trunk/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/https_jetty/JettySslConnectorFactory.java Tue Mar 13 18:04:05 2012
@@ -83,10 +83,11 @@ public final class JettySslConnectorFact
         con.setSecureRandom(tlsServerParameters.getSecureRandom());
         con.setClientAuthentication(
                 tlsServerParameters.getClientAuthentication());
-        con.getSslContextFactory().setProtocol(tlsServerParameters.getSecureSocketProtocol());
-        con.getSslContextFactory().setProvider(tlsServerParameters.getJsseProvider());
+        con.getCxfSslContextFactory().setProtocol(tlsServerParameters.getSecureSocketProtocol());
+        con.getCxfSslContextFactory().setProvider(tlsServerParameters.getJsseProvider());
         con.setCipherSuites(tlsServerParameters.getCipherSuites());
         con.setCipherSuitesFilter(tlsServerParameters.getCipherSuitesFilter());
     }
-    
+
+
 }