FileDocCategorySizeDatePackage
SSLWebServerFrame.javaAPI DocExample4349Thu Nov 08 00:23:28 GMT 2001com.ora.rmibook.chapter2.ssl

SSLWebServerFrame.java

package com.ora.rmibook.chapter2.ssl;


import com.ora.rmibook.gui.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
import java.net.*;
import javax.net.ssl.*;


/*
 This isn't quite good enough because web browsers insist on
 authenticating servers.
 */

public class SSLWebServerFrame extends ExitingFrame {
    private static String ANON_CIPHER_1 = "SSL_DH_anon_WITH_DES_CBC_SHA";
    private static String ANON_CIPHER_2 = "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA";
    private static String ANON_CIPHER_3 = "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA";
    private static String ANON_CIPHER_4 = "SSL_DH_anon_WITH_RC4_128_MD5";
    private static String ANON_CIPHER_5 = "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5";
    private static String[] CIPHERS = {ANON_CIPHER_1, ANON_CIPHER_2, ANON_CIPHER_3,
            ANON_CIPHER_4, ANON_CIPHER_5};
    static {
        java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    }
    private JTextArea _displayArea;

    public void startListening() {
        ServerSocket serverSocket;

        try {
            serverSocket = getSSLServerSocket(443);
        } catch (IOException e) {
            return;
        }
        while (true) {
            try {
                Socket client = serverSocket.accept(); // wait here

                processClientRequest(client);
                //bad design-- should  handle requests in separate threads
                // and immediately resume listening for connections            	client.close();
            } catch (IOException e) {
            }
        }
    }

    private void processClientRequest(Socket client) throws IOException {
        _displayArea.append("Client connected from port " +
            client.getPort() + " on machine " + client.getInetAddress() + "\n");
        _displayArea.append("Request is: \n");
        readRequest(client);
        sendResponse(client);
        client.close();
    }

    private void readRequest(Socket client) throws IOException {
        BufferedReader request = null;

        request = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String nextLine;

        while (null != (nextLine = request.readLine())) {
            // Ideally, we'd do something. But this is a very
            // simple web server.
            if (nextLine.equals("")) {
                break;
            } else {
                _displayArea.append("\t" + nextLine + "\n");
            }
        }
        _displayArea.append("---------------------------------------\n");
        return;
    }

    private void sendResponse(Socket client) throws IOException {
        BufferedWriter response;

        response = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        response.write(_mainPage);
        response.flush();
    }

    protected void buildGUI() {
        JPanel newContentPane = new JPanel(new BorderLayout());

        newContentPane.add(buildMainPanel(), BorderLayout.CENTER);
        setContentPane(newContentPane);
        setSize(250, 300);
    }

    private JComponent buildMainPanel() {
        _displayArea = new JTextArea();
        _displayArea.setLineWrap(true);
        JScrollPane scrollPane = new JScrollPane(_displayArea);

        scrollPane.setBorder(new EtchedBorder());
        return scrollPane;
    }

    private ServerSocket getSSLServerSocket(int port) throws IOException {
        SSLServerSocketFactory socketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        SSLServerSocket returnValue = (SSLServerSocket) socketFactory.createServerSocket(port);

        returnValue.setEnabledCipherSuites(CIPHERS);
        returnValue.setNeedClientAuth(false);
        returnValue.setEnableSessionCreation(true);
        return returnValue;
    }

    private static final String _mainPage =
        "HTTP/1.0 200 OK\n" +
        "Content-type: text/html\n" +
        "Connection: close\n" +
        "\n<HTML>\n" +
        "<HEAD>\n" +
        "<TITLE>Hello World</TITLE>\n" +
        "</HEAD>\n" +
        "<BODY> <a href = \"localhost\"> Hello World </a></BODY>\n" +
        "</HTML> \n\n";
}