1b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin/* 2b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * Copyright (C) 2014 The Android Open Source Project 3b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * 4b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * Licensed under the Apache License, Version 2.0 (the "License"); 5b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * you may not use this file except in compliance with the License. 6b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * You may obtain a copy of the License at 7b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * 8b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * http://www.apache.org/licenses/LICENSE-2.0 9b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * 10b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * Unless required by applicable law or agreed to in writing, software 11b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * distributed under the License is distributed on an "AS IS" BASIS, 12b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * See the License for the specific language governing permissions and 14b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * limitations under the License. 15b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin */ 16b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 1726f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fullerpackage tests.net; 18b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 19b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubinimport java.io.IOException; 20b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubinimport java.net.InetAddress; 21b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubinimport java.net.Socket; 22b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubinimport java.net.UnknownHostException; 23b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 24b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubinimport javax.net.ssl.SSLSocket; 25b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubinimport javax.net.ssl.SSLSocketFactory; 26b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 27b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin/** 28b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * {@link SSLSocketFactory} which delegates all invocations to the provided delegate 29b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * {@code SSLSocketFactory}. 30b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin */ 31b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubinpublic class DelegatingSSLSocketFactory extends SSLSocketFactory { 32b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 33b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin private final SSLSocketFactory mDelegate; 34b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 35b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public DelegatingSSLSocketFactory(SSLSocketFactory delegate) { 36b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin this.mDelegate = delegate; 37b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 38b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 39b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin /** 40b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * Invoked after obtaining a socket from the delegate and before returning it to the caller. 41b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * 42b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin * <p>The default implementation does nothing. 43b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin */ 4426f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller protected SSLSocket configureSocket(SSLSocket socket) throws IOException { 4526f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller return socket; 4626f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller } 47b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 48b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 49b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public String[] getDefaultCipherSuites() { 50b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin return mDelegate.getDefaultCipherSuites(); 51b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 52b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 53b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 54b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public String[] getSupportedCipherSuites() { 55b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin return mDelegate.getSupportedCipherSuites(); 56b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 57b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 58b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 59b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public Socket createSocket() throws IOException { 60b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin SSLSocket socket = (SSLSocket) mDelegate.createSocket(); 6126f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller return configureSocket(socket); 62b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 63b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 64b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 65b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public Socket createSocket(Socket s, String host, int port, boolean autoClose) 66b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin throws IOException { 67b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin SSLSocket socket = (SSLSocket) mDelegate.createSocket(s, host, port, autoClose); 6826f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller return configureSocket(socket); 69b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 70b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 71b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 72b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public Socket createSocket(String host, int port) throws IOException, UnknownHostException { 7326f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller SSLSocket socket = (SSLSocket) mDelegate.createSocket(host, port); 7426f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller return configureSocket(socket); 75b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 76b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 77b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 78b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public Socket createSocket(String host, int port, InetAddress localHost, int localPort) 79b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin throws IOException, UnknownHostException { 80b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin SSLSocket socket = (SSLSocket) mDelegate.createSocket(host, port, localHost, localPort); 8126f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller return configureSocket(socket); 82b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 83b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 84b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 85b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public Socket createSocket(InetAddress host, int port) throws IOException { 86b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin SSLSocket socket = (SSLSocket) mDelegate.createSocket(host, port); 8726f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller return configureSocket(socket); 88b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 89b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin 90b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin @Override 91b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin public Socket createSocket(InetAddress address, int port, InetAddress localAddress, 9226f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller int localPort) throws IOException { 9326f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller SSLSocket socket = (SSLSocket) mDelegate.createSocket(address, port, localAddress, localPort); 9426f2557b26ea23326178f029e07a8adbfc27d0bfNeil Fuller return configureSocket(socket); 95b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin } 96b1fe85cc976c676eb50ff886596c93e04fd71d82Alex Klyubin} 97