001package org.apache.commons.ssl;
002
003import javax.net.SocketFactory;
004import java.io.IOException;
005import java.io.InputStream;
006import java.io.OutputStream;
007import java.net.Socket;
008import java.security.GeneralSecurityException;
009
010public class CRLSocket extends SSLClient {
011    private final static CRLSocket secureInstance;
012    private final static CRLSocket plainInstance;    
013
014    static {
015        CRLSocket sf1 = null, sf2 = null;
016        try {
017            sf1 = new CRLSocket();
018            sf2 = new CRLSocket();
019            sf2.setIsSecure(false);
020        }
021        catch (Exception e) {
022            System.out.println("could not create CRLSocket: " + e);
023            e.printStackTrace();
024        }
025        finally {
026            secureInstance = sf1;
027            plainInstance = sf2;            
028        }
029    }
030
031    private CRLSocket() throws GeneralSecurityException, IOException {
032        super();
033
034        // For now we setup the usual trust infrastructure, but consumers
035        // are encouraged to call getInstance().addTrustMaterial() or
036        // getInstance().setTrustMaterial() to customize the trust.
037        if (TrustMaterial.JSSE_CACERTS != null) {
038            setTrustMaterial(TrustMaterial.JSSE_CACERTS);
039        } else {
040            setTrustMaterial(TrustMaterial.CACERTS);
041        }
042        setConnectTimeout(5000);
043        setSoTimeout(5000);
044        setCheckCRL(false);
045    }
046
047    public static SocketFactory getDefault() {
048        return getSecureInstance();
049    }
050
051    public static CRLSocket getSecureInstance() {
052        return secureInstance;
053    }
054
055    public static CRLSocket getPlainInstance() {
056        return plainInstance;
057    }
058
059    public static void main(String[] args) throws Exception {
060        String host = args[0];
061        String port = args[1];
062        String hello
063                = "HEAD / HTTP/1.1\r\n"
064                + "Host:" + host + ":" + port + "\r\n\r\n";
065        byte[] helloBytes = hello.getBytes("UTF-8");
066
067        System.out.println("About to getInstance() ");
068        CRLSocket sf = getPlainInstance();
069        long now = System.currentTimeMillis();
070        System.out.println("About to create socket: [" + host + ":" + port + "]");
071        Socket s = sf.createSocket(host, Integer.parseInt(port));
072        long delay = System.currentTimeMillis() - now;
073        System.out.println("Created socket! took " + delay + "ms ");
074        OutputStream out = s.getOutputStream();
075        out.write(helloBytes);
076        out.flush();
077
078        System.out.println("\n" + new String(helloBytes, "UTF-8"));
079
080        InputStream in = s.getInputStream();
081        int c = in.read();
082        StringBuffer buf = new StringBuffer();
083        System.out.println("Reading: ");
084        System.out.println("================================================================================");
085        while (c >= 0) {
086            byte b = (byte) c;
087            buf.append((char) b);
088            System.out.print((char) b);
089            if (-1 == buf.toString().indexOf("\r\n\r\n")) {
090                c = in.read();
091            } else {
092                break;
093            }
094        }
095        in.close();
096        out.close();
097        s.close();
098    }
099
100}