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 ConscryptFileDescriptorSocket 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 Java8FileDescriptorSocket extends ConscryptFileDescriptorSocket { 17 private BiFunction<SSLSocket, List<String>, String> selector; 18 19 Java8FileDescriptorSocket(SSLParametersImpl sslParameters) throws IOException { 20 super(sslParameters); 21 } 22 23 Java8FileDescriptorSocket(String hostname, int port, SSLParametersImpl sslParameters) 24 throws IOException { 25 super(hostname, port, sslParameters); 26 } 27 28 Java8FileDescriptorSocket(InetAddress address, int port, SSLParametersImpl sslParameters) 29 throws IOException { 30 super(address, port, sslParameters); 31 } 32 33 Java8FileDescriptorSocket(String hostname, int port, InetAddress clientAddress, int clientPort, 34 SSLParametersImpl sslParameters) throws IOException { 35 super(hostname, port, clientAddress, clientPort, sslParameters); 36 } 37 38 Java8FileDescriptorSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort, 39 SSLParametersImpl sslParameters) throws IOException { 40 super(address, port, clientAddress, clientPort, sslParameters); 41 } 42 43 Java8FileDescriptorSocket(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