Home | History | Annotate | Download | only in conscrypt
      1 package org.conscrypt;
      2 
      3 import java.io.IOException;
      4 import java.net.InetAddress;
      5 import java.net.Socket;
      6 import java.util.List;
      7 import java.util.function.BiFunction;
      8 import javax.net.ssl.SSLEngine;
      9 import javax.net.ssl.SSLSocket;
     10 
     11 /**
     12  * A version of ConscryptEngineSocket that includes the new Java 9 (and potentially later
     13  * patches of 8) {@code setHandshakeApplicationProtocolSelector} API (which requires Java 8 for
     14  * compilation, due to the use of {@link BiFunction}).
     15  */
     16 final class Java8EngineSocket extends ConscryptEngineSocket {
     17     private BiFunction<SSLSocket, List<String>, String> selector;
     18 
     19     Java8EngineSocket(SSLParametersImpl sslParameters) throws IOException {
     20         super(sslParameters);
     21     }
     22 
     23     Java8EngineSocket(String hostname, int port, SSLParametersImpl sslParameters)
     24             throws IOException {
     25         super(hostname, port, sslParameters);
     26     }
     27 
     28     Java8EngineSocket(InetAddress address, int port, SSLParametersImpl sslParameters)
     29             throws IOException {
     30         super(address, port, sslParameters);
     31     }
     32 
     33     Java8EngineSocket(String hostname, int port, InetAddress clientAddress, int clientPort,
     34             SSLParametersImpl sslParameters) throws IOException {
     35         super(hostname, port, clientAddress, clientPort, sslParameters);
     36     }
     37 
     38     Java8EngineSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort,
     39             SSLParametersImpl sslParameters) throws IOException {
     40         super(address, port, clientAddress, clientPort, sslParameters);
     41     }
     42 
     43     Java8EngineSocket(Socket socket, String hostname, int port, boolean autoClose,
     44             SSLParametersImpl sslParameters) throws IOException {
     45         super(socket, hostname, port, autoClose, sslParameters);
     46     }
     47 
     48     /* @Override */
     49     @SuppressWarnings("MissingOverride") // For compilation with Java < 9.
     50     public void setHandshakeApplicationProtocolSelector(
     51             final BiFunction<SSLSocket, List<String>, String> selector) {
     52         this.selector = selector;
     53         setApplicationProtocolSelector(toApplicationProtocolSelector(selector));
     54     }
     55 
     56     /* @Override */
     57     @SuppressWarnings("MissingOverride") // For compilation with Java < 9.
     58     public BiFunction<SSLSocket, List<String>, String> getHandshakeApplicationProtocolSelector() {
     59         return selector;
     60     }
     61 
     62     private static ApplicationProtocolSelector toApplicationProtocolSelector(
     63         final BiFunction<SSLSocket, List<String>, String> selector) {
     64         return selector == null ? null : new ApplicationProtocolSelector() {
     65             @Override
     66             public String selectApplicationProtocol(SSLEngine socket, List<String> protocols) {
     67                 throw new UnsupportedOperationException();
     68             }
     69 
     70             @Override
     71             public String selectApplicationProtocol(SSLSocket socket, List<String> protocols) {
     72                 return selector.apply(socket, protocols);
     73             }
     74         };
     75     }
     76 }
     77