Hi,

I committed the attached patch that was discussed (a bit) two weeks ago.
The makes sure that SSLSocketFactory.getDefault() and
SSLServerSocketFactory.getDefault() always return a factory instance
(instead of throwing an error if there is a configuration problem). The
factory will now throw the exception (this is specified in the spec, but
the exception type isn't, so we may still be incompatible there.)

Regards,
Jeroen

2006-12-28  Jeroen Frijters  <[EMAIL PROTECTED]>

        * javax/net/ssl/SSLServerSocketFactory.java:
        (getDefault): Return inoperative factory instead of throwing
error
        (as per spec).
        (ErrorServerSocketFactory): New class.
        * javax/net/ssl/SSLSocketFactory.java:
        (getDefault): Return inoperative factory instead of throwing
error
        (as per spec).
        (ErrorSocketFactory): New class.

Index: javax/net/ssl/SSLServerSocketFactory.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/javax/net/ssl/SSLServerSocketFactory.java,v
retrieving revision 1.3
diff -u -r1.3 SSLServerSocketFactory.java
--- javax/net/ssl/SSLServerSocketFactory.java   2 Jul 2005 20:32:45 -0000       
1.3
+++ javax/net/ssl/SSLServerSocketFactory.java   11 Dec 2006 15:16:13 -0000
@@ -38,6 +38,9 @@
 
 package javax.net.ssl;
 
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.ServerSocket;
 import java.security.KeyStore;
 import java.security.Security;
 
@@ -138,8 +141,9 @@
           }
         catch (Exception ex)
           {
-            throw new RuntimeException("error instantiating default server 
socket factory: "
-                                       + ex.toString());
+            return new ErrorServerSocketFactory(new RuntimeException(
+                "error instantiating default server socket factory: "
+                                       + ex.toString(), ex));
           }
       }
     try
@@ -149,7 +153,52 @@
     catch (Exception e)
       {
       }
-    throw new RuntimeException("no SSLSocketFactory implementation available");
+    return new ErrorServerSocketFactory(new RuntimeException(
+        "no SSLSocketFactory implementation available"));
+  }
+
+  private static final class ErrorServerSocketFactory
+    extends SSLServerSocketFactory
+  {
+    private RuntimeException x;
+
+    ErrorServerSocketFactory(RuntimeException x)
+    {
+      this.x = x;
+    }
+
+    public ServerSocket createServerSocket() throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public ServerSocket createServerSocket(int port) throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public ServerSocket createServerSocket(int port, int backlog)
+      throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public ServerSocket createServerSocket(int port, int backlog,
+                                           InetAddress ifAddress)
+      throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public String[] getDefaultCipherSuites()
+    {
+      throw new RuntimeException(x);
+    }
+
+    public String[] getSupportedCipherSuites()
+    {
+      throw new RuntimeException(x);
+    }
   }
 
   // Abstract methods.
Index: javax/net/ssl/SSLSocketFactory.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/net/ssl/SSLSocketFactory.java,v
retrieving revision 1.5
diff -u -r1.5 SSLSocketFactory.java
--- javax/net/ssl/SSLSocketFactory.java 11 Dec 2006 13:45:55 -0000      1.5
+++ javax/net/ssl/SSLSocketFactory.java 11 Dec 2006 15:15:27 -0000
@@ -39,6 +39,7 @@
 package javax.net.ssl;
 
 import java.io.IOException;
+import java.net.InetAddress;
 import java.net.Socket;
 import java.security.KeyStore;
 import java.security.Security;
@@ -141,8 +142,9 @@
           }
         catch (Exception ex)
           {
-            throw new RuntimeException("error instantiating default socket 
factory: "
-                                       + ex.toString(), ex);
+            return new ErrorSocketFactory(new RuntimeException(
+                "error instantiating default socket factory: " + ex.toString(),
+                ex));
           }
       }
     try
@@ -152,7 +154,65 @@
     catch (Exception e)
       {
       }
-    throw new RuntimeException("no SSLSocketFactory implementation available");
+    return new ErrorSocketFactory(new RuntimeException(
+        "no SSLSocketFactory implementation available"));
+  }
+
+  private static final class ErrorSocketFactory extends SSLSocketFactory
+  {
+    private RuntimeException x;
+
+    ErrorSocketFactory(RuntimeException x)
+    {
+      this.x = x;
+    }
+
+    public Socket createSocket() throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public Socket createSocket(String host, int port)
+      throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public Socket createSocket(String host, int port, InetAddress localHost,
+                               int localPort)
+      throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public Socket createSocket(InetAddress host, int port) throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public Socket createSocket(InetAddress hast, int port, InetAddress 
localHost,
+                               int localPort)
+      throws IOException
+    {
+      throw (IOException) new IOException().initCause(x);
+    }
+
+    public String[] getDefaultCipherSuites()
+    {
+      throw new RuntimeException(x);
+    }
+
+    public String[] getSupportedCipherSuites()
+    {
+      throw new RuntimeException(x);
+    }
+
+    public Socket createSocket(Socket s, String host, int port,
+                               boolean autoClose)
+      throws IOException
+    {
+      throw new RuntimeException(x);
+    }
   }
 
   // Abstract methods.

Reply via email to