import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.net.ssl.SSLServerSocketFactory;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Hashtable;

public class Jdk8313369 {
    static boolean ssl = false;

    public static void main(String[] args) throws Exception {

        boolean passed = false;

        if (args.length > 0 && args[0].equalsIgnoreCase("SSL")) {
            System.out.println("SSL on");
            ssl = true;
        } else {
            System.out.println("SSL off");
            ssl = false;
        }

        // Set up the environment for creating the initial context
        Hashtable env = new Hashtable(11);
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        env.put("com.sun.jndi.ldap.connect.timeout", "2000");
        if (ssl) {
            env.put(Context.PROVIDER_URL, "ldaps://localhost:2001");
        } else {
            env.put(Context.PROVIDER_URL, "ldap://localhost:2001");
        }

        Server s = new Server();

        try {
            // start the server
            s.start();

            // Create initial context
            DirContext ctx = new InitialDirContext(env);
            System.out.println("LDAP Client: Connected to the Server");

            // Close the context when we're done
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
        } finally {
            s.interrupt();
        }
    }

    static class Server extends Thread {

        static int serverPort = 2001;

        Server() {
        }

        public void run() {
            try {
                ServerSocket serverSock;

                if (ssl) {
                    SSLServerSocketFactory ssocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
                    serverSock = ssocketFactory.createServerSocket(serverPort);
                } else {
                    serverSock = new ServerSocket(serverPort);
                }
                Socket socket = serverSock.accept();
                System.out.println("Server: Connection accepted");

                BufferedInputStream bin = new BufferedInputStream(socket.
                        getInputStream());
                while (true) {
                    //bin.read();   // If uncommented, bug does not appear.
                }
            } catch (IOException e) {
                e.printStackTrace();
                // ignore
            }
        }
    }
}
