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