< prev index next >

src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/AsyncSSLTunnelConnection.java

Print this page

        

*** 24,150 **** */ package jdk.incubator.http; import java.io.IOException; import java.net.InetSocketAddress; - import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.util.concurrent.CompletableFuture; ! import java.util.function.Consumer; ! import java.util.function.Supplier; ! import javax.net.ssl.SSLEngine; ! import javax.net.ssl.SSLParameters; ! import jdk.incubator.http.internal.common.ByteBufferReference; import jdk.incubator.http.internal.common.Utils; /** * An SSL tunnel built on a Plain (CONNECT) TCP tunnel. */ class AsyncSSLTunnelConnection extends AbstractAsyncSSLConnection { final PlainTunnelingConnection plainConnection; ! final AsyncSSLDelegate sslDelegate; ! final String serverName; ! ! @Override ! public void connect() throws IOException, InterruptedException { ! plainConnection.connect(); ! configureMode(Mode.ASYNC); ! startReading(); ! sslDelegate.connect(); ! } ! ! @Override ! boolean connected() { ! return plainConnection.connected() && sslDelegate.connected(); ! } ! ! @Override ! public CompletableFuture<Void> connectAsync() { ! throw new InternalError(); ! } AsyncSSLTunnelConnection(InetSocketAddress addr, HttpClientImpl client, String[] alpn, InetSocketAddress proxy) { ! super(addr, client); ! this.serverName = Utils.getServerName(addr); this.plainConnection = new PlainTunnelingConnection(addr, proxy, client); ! this.sslDelegate = new AsyncSSLDelegate(plainConnection, client, alpn, serverName); } @Override ! synchronized void configureMode(Mode mode) throws IOException { ! super.configureMode(mode); ! plainConnection.configureMode(mode); } @Override ! SSLParameters sslParameters() { ! return sslDelegate.getSSLParameters(); } @Override public String toString() { return "AsyncSSLTunnelConnection: " + super.toString(); } @Override PlainTunnelingConnection plainConnection() { return plainConnection; } @Override - AsyncSSLDelegate sslDelegate() { - return sslDelegate; - } - - @Override ConnectionPool.CacheKey cacheKey() { return ConnectionPool.cacheKey(address, plainConnection.proxyAddr); } @Override - long write(ByteBuffer[] buffers, int start, int number) throws IOException { - //debugPrint("Send", buffers, start, number); - ByteBuffer[] bufs = Utils.reduce(buffers, start, number); - long n = Utils.remaining(bufs); - sslDelegate.writeAsync(ByteBufferReference.toReferences(bufs)); - sslDelegate.flushAsync(); - return n; - } - - @Override - long write(ByteBuffer buffer) throws IOException { - //debugPrint("Send", buffer); - long n = buffer.remaining(); - sslDelegate.writeAsync(ByteBufferReference.toReferences(buffer)); - sslDelegate.flushAsync(); - return n; - } - - @Override - public void writeAsync(ByteBufferReference[] buffers) throws IOException { - sslDelegate.writeAsync(buffers); - } - - @Override - public void writeAsyncUnordered(ByteBufferReference[] buffers) throws IOException { - sslDelegate.writeAsyncUnordered(buffers); - } - - @Override - public void flushAsync() throws IOException { - sslDelegate.flushAsync(); - } - - @Override public void close() { ! Utils.close(sslDelegate, plainConnection.channel()); } @Override void shutdownInput() throws IOException { plainConnection.channel().shutdownInput(); --- 24,102 ---- */ package jdk.incubator.http; import java.io.IOException; + import java.lang.System.Logger.Level; import java.net.InetSocketAddress; import java.nio.channels.SocketChannel; import java.util.concurrent.CompletableFuture; ! import jdk.incubator.http.internal.common.SSLTube; import jdk.incubator.http.internal.common.Utils; /** * An SSL tunnel built on a Plain (CONNECT) TCP tunnel. */ class AsyncSSLTunnelConnection extends AbstractAsyncSSLConnection { final PlainTunnelingConnection plainConnection; ! final PlainHttpPublisher writePublisher; ! volatile SSLTube flow; AsyncSSLTunnelConnection(InetSocketAddress addr, HttpClientImpl client, String[] alpn, InetSocketAddress proxy) { ! super(addr, client, Utils.getServerName(addr), alpn); this.plainConnection = new PlainTunnelingConnection(addr, proxy, client); ! this.writePublisher = new PlainHttpPublisher(); } @Override ! public CompletableFuture<Void> connectAsync() { ! debug.log(Level.DEBUG, "Connecting plain tunnel connection"); ! // This will connect the PlainHttpConnection flow, so that ! // its HttpSubscriber and HttpPublisher are subscribed to the ! // SocketTube ! return plainConnection ! .connectAsync() ! .thenApply( unused -> { ! debug.log(Level.DEBUG, "creating SSLTube"); ! // create the SSLTube wrapping the SocketTube, with the given engine ! flow = new SSLTube(engine, ! client().theExecutor(), ! plainConnection.getConnectionFlow()); ! return null;} ); } @Override ! boolean connected() { ! return plainConnection.connected(); // && sslDelegate.connected(); } @Override + HttpPublisher publisher() { return writePublisher; } + + @Override public String toString() { return "AsyncSSLTunnelConnection: " + super.toString(); } @Override PlainTunnelingConnection plainConnection() { return plainConnection; } @Override ConnectionPool.CacheKey cacheKey() { return ConnectionPool.cacheKey(address, plainConnection.proxyAddr); } @Override public void close() { ! plainConnection.close(); } @Override void shutdownInput() throws IOException { plainConnection.channel().shutdownInput();
*** 164,206 **** boolean isProxied() { return true; } @Override ! public void setAsyncCallbacks(Consumer<ByteBufferReference> asyncReceiver, ! Consumer<Throwable> errorReceiver, ! Supplier<ByteBufferReference> readBufferSupplier) { ! sslDelegate.setAsyncCallbacks(asyncReceiver, errorReceiver, readBufferSupplier); ! plainConnection.setAsyncCallbacks(sslDelegate::asyncReceive, errorReceiver, sslDelegate::getNetBuffer); ! } ! ! @Override ! public void startReading() { ! plainConnection.startReading(); ! sslDelegate.startReading(); ! } ! ! @Override ! public void stopAsyncReading() { ! plainConnection.stopAsyncReading(); ! } ! ! @Override ! public void enableCallback() { ! sslDelegate.enableCallback(); ! } ! ! @Override ! public void closeExceptionally(Throwable cause) throws IOException { ! Utils.close(cause, sslDelegate, plainConnection.channel()); ! } ! ! @Override ! SSLEngine getEngine() { ! return sslDelegate.getEngine(); ! } ! ! @Override ! SSLTunnelConnection downgrade() { ! return new SSLTunnelConnection(this); } } --- 116,124 ---- boolean isProxied() { return true; } @Override ! SSLTube getConnectionFlow() { ! return flow; } }
< prev index next >