001    /*
002     * $HeadURL: http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.9/src/java/org/apache/commons/ssl/SSLEchoServer.java $
003     * $Revision: 121 $
004     * $Date: 2007-11-13 21:26:57 -0800 (Tue, 13 Nov 2007) $
005     *
006     * ====================================================================
007     * Licensed to the Apache Software Foundation (ASF) under one
008     * or more contributor license agreements.  See the NOTICE file
009     * distributed with this work for additional information
010     * regarding copyright ownership.  The ASF licenses this file
011     * to you under the Apache License, Version 2.0 (the
012     * "License"); you may not use this file except in compliance
013     * with the License.  You may obtain a copy of the License at
014     *
015     *   http://www.apache.org/licenses/LICENSE-2.0
016     *
017     * Unless required by applicable law or agreed to in writing,
018     * software distributed under the License is distributed on an
019     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
020     * KIND, either express or implied.  See the License for the
021     * specific language governing permissions and limitations
022     * under the License.
023     * ====================================================================
024     *
025     * This software consists of voluntary contributions made by many
026     * individuals on behalf of the Apache Software Foundation.  For more
027     * information on the Apache Software Foundation, please see
028     * <http://www.apache.org/>.
029     *
030     */
031    
032    package org.apache.commons.ssl;
033    
034    import javax.net.ssl.SSLPeerUnverifiedException;
035    import javax.net.ssl.SSLServerSocket;
036    import javax.net.ssl.SSLSession;
037    import javax.net.ssl.SSLSocket;
038    import java.io.IOException;
039    import java.io.InputStream;
040    import java.io.InterruptedIOException;
041    import java.io.OutputStream;
042    import java.security.cert.Certificate;
043    import java.security.cert.X509Certificate;
044    
045    /**
046     * @author Credit Union Central of British Columbia
047     * @author <a href="http://www.cucbc.com/">www.cucbc.com</a>
048     * @author <a href="mailto:juliusdavies@cucbc.com">juliusdavies@cucbc.com</a>
049     * @since 2-May-2006
050     */
051    public class SSLEchoServer {
052    
053        public static void main(String[] args) throws Exception {
054            int port = 7443;
055            if (args.length >= 1) {
056                port = Integer.parseInt(args[0]);
057            }
058    
059            SSLServer ssl = new SSLServer();
060            // ssl.setCheckExpiry( false );
061            // ssl.setNeedClientAuth( true );
062            ssl.addTrustMaterial(TrustMaterial.TRUST_ALL);
063            SSLServerSocket ss = (SSLServerSocket) ssl.createServerSocket(port, 3);
064            System.out.println("SSL Echo server listening on port: " + port);
065            while (true) {
066                SSLSocket s = (SSLSocket) ss.accept();
067                s.setSoTimeout(30000);
068                EchoRunnable r = new EchoRunnable(s);
069                new Thread(r).start();
070            }
071    
072        }
073    
074        public static class EchoRunnable implements Runnable {
075            private SSLSocket s;
076    
077            public EchoRunnable(SSLSocket s) {
078                this.s = s;
079            }
080    
081            public void run() {
082                InputStream in = null;
083                OutputStream out = null;
084                System.out.println("Socket accepted!");
085                try {
086                    SSLSession session = s.getSession();
087    
088                    try {
089                        Certificate[] certs = JavaImpl.getPeerCertificates(session);
090                        if (certs != null) {
091                            for (int i = 0; i < certs.length; i++) {
092                                // log client cert info
093                                X509Certificate cert = (X509Certificate) certs[i];
094                                String s = "client cert " + i + ":";
095                                s += JavaImpl.getSubjectX500(cert);
096                                System.out.println(s);
097                                System.out.println(Certificates.toString(cert));
098                            }
099                        }
100                    }
101                    catch (SSLPeerUnverifiedException sslpue) {
102                        // oh well, no client cert for us
103                    }
104    
105                    in = s.getInputStream();
106                    out = s.getOutputStream();
107                    String line = Util.readLine(in);
108                    if (line != null && line.indexOf("HTTP") > 0) {
109                        out.write("HTTP/1.1 200 OK\r\n\r\n".getBytes());
110                        out.flush();
111                    }
112                    while (line != null) {
113                        String echo = "ECHO:>" + line + "\n";
114                        out.write(echo.getBytes());
115                        out.flush();
116                        line = Util.readLine(in);
117                    }
118                }
119                catch (IOException ioe) {
120                    try {
121                        if (out != null) {
122                            out.close();
123                        }
124                        if (in != null) {
125                            in.close();
126                        }
127                        s.close();
128                    }
129                    catch (Exception e) {
130                    }
131    
132                    if (ioe instanceof InterruptedIOException) {
133                        System.out.println("Socket closed after 30 second timeout.");
134                    } else {
135                        ioe.printStackTrace();
136                    }
137    
138                }
139            }
140        }
141    
142    }