< prev index next >

src/java.httpclient/share/classes/java/net/http/HttpConnection.java

Print this page

        

*** 21,33 **** * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any */ package java.net.http; ! import java.io.FileOutputStream; import java.io.IOException; - import java.io.PrintStream; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.util.concurrent.CompletableFuture; import javax.net.ssl.SSLParameters; --- 21,32 ---- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any */ package java.net.http; ! import java.io.Closeable; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.util.concurrent.CompletableFuture; import javax.net.ssl.SSLParameters;
*** 40,59 **** * PlainProxyConnection: plain text proxy connection * PlainTunnelingConnection: opens plain text (CONNECT) tunnel to server * SSLConnection: TLS channel direct to server * SSLTunnelConnection: TLS channel via (CONNECT) proxy tunnel */ ! abstract class HttpConnection implements BufferHandler { // address we are connected to. Could be a server or a proxy final InetSocketAddress address; final HttpClientImpl client; protected volatile ByteBuffer buffer; HttpConnection(InetSocketAddress address, HttpClientImpl client) { this.address = address; this.client = client; } /** * Public API to this class. addr is the ultimate destination. Any proxies * etc are figured out from the request. Returns an instance of one of the --- 39,69 ---- * PlainProxyConnection: plain text proxy connection * PlainTunnelingConnection: opens plain text (CONNECT) tunnel to server * SSLConnection: TLS channel direct to server * SSLTunnelConnection: TLS channel via (CONNECT) proxy tunnel */ ! abstract class HttpConnection implements BufferHandler, Closeable { ! ! protected final static ByteBuffer emptyBuf = Utils.EMPTY_BYTEBUFFER; ! ! enum Mode { ! BLOCKING, ! NON_BLOCKING, ! ASYNC ! } ! ! protected Mode mode; // address we are connected to. Could be a server or a proxy final InetSocketAddress address; final HttpClientImpl client; protected volatile ByteBuffer buffer; HttpConnection(InetSocketAddress address, HttpClientImpl client) { this.address = address; this.client = client; + this.buffer = emptyBuf; } /** * Public API to this class. addr is the ultimate destination. Any proxies * etc are figured out from the request. Returns an instance of one of the
*** 66,76 **** * When object returned, connect() or connectAsync() must be called, which * when it returns/completes, the connection is usable for requests. */ public static HttpConnection getConnection(InetSocketAddress addr, HttpRequestImpl request) { ! return getConnectionImpl(addr, request); } public abstract void connect() throws IOException, InterruptedException; public abstract CompletableFuture<Void> connectAsync(); --- 76,100 ---- * When object returned, connect() or connectAsync() must be called, which * when it returns/completes, the connection is usable for requests. */ public static HttpConnection getConnection(InetSocketAddress addr, HttpRequestImpl request) { ! return getConnectionImpl(addr, request, null); ! } ! ! /** ! * Called specifically to get an async connection for HTTP/2 over SSL. ! * ! * @param addr ! * @param request ! * @param http2 ! * @return ! */ ! public static HttpConnection getConnection(InetSocketAddress addr, ! HttpRequestImpl request, Http2Connection http2) { ! ! return getConnectionImpl(addr, request, http2); } public abstract void connect() throws IOException, InterruptedException; public abstract CompletableFuture<Void> connectAsync();
*** 91,101 **** // must be called before reading any data off connection // at beginning of response. ByteBuffer getRemaining() { ByteBuffer b = buffer; ! buffer = null; return b; } final boolean isOpen() { return channel().isOpen(); --- 115,125 ---- // must be called before reading any data off connection // at beginning of response. ByteBuffer getRemaining() { ByteBuffer b = buffer; ! buffer = emptyBuf; return b; } final boolean isOpen() { return channel().isOpen();
*** 121,150 **** } } } private static HttpConnection getSSLConnection(InetSocketAddress addr, ! InetSocketAddress proxy, ! HttpRequestImpl request, ! String[] alpn) { HttpClientImpl client = request.client(); if (proxy != null) { return new SSLTunnelConnection(addr, client, proxy, request.getAccessControlContext()); ! } else { return new SSLConnection(addr, client, alpn); } } /** * Main factory method. Gets a HttpConnection, either cached or new if * none available. */ private static HttpConnection getConnectionImpl(InetSocketAddress addr, ! HttpRequestImpl request) { HttpConnection c; HttpClientImpl client = request.client(); InetSocketAddress proxy = request.proxy(); boolean secure = request.secure(); ConnectionPool pool = client.connectionPool(); --- 145,176 ---- } } } private static HttpConnection getSSLConnection(InetSocketAddress addr, ! InetSocketAddress proxy, HttpRequestImpl request, ! String[] alpn, Http2Connection http2) { HttpClientImpl client = request.client(); if (proxy != null) { return new SSLTunnelConnection(addr, client, proxy, request.getAccessControlContext()); ! } else if (http2 == null) { return new SSLConnection(addr, client, alpn); + } else { + return new AsyncSSLConnection(addr, client, alpn); } } /** * Main factory method. Gets a HttpConnection, either cached or new if * none available. */ private static HttpConnection getConnectionImpl(InetSocketAddress addr, ! HttpRequestImpl request, Http2Connection http2) { ! HttpConnection c; HttpClientImpl client = request.client(); InetSocketAddress proxy = request.proxy(); boolean secure = request.secure(); ConnectionPool pool = client.connectionPool();
*** 165,175 **** } else { c = pool.getConnection(true, addr, proxy); if (c != null) { return c; } else { ! return getSSLConnection(addr, proxy, request, alpn); } } } void returnToCache(HttpHeaders hdrs) { --- 191,201 ---- } else { c = pool.getConnection(true, addr, proxy); if (c != null) { return c; } else { ! return getSSLConnection(addr, proxy, request, alpn, http2); } } } void returnToCache(HttpHeaders hdrs) {
*** 221,288 **** final InetSocketAddress address() { return address; } ! void configureBlocking(boolean mode) throws IOException { ! channel().configureBlocking(mode); } abstract ConnectionPool.CacheKey cacheKey(); - /* - static PrintStream ps; - - static { - try { - String propval = Utils.getNetProperty("java.net.httpclient.showData"); - if (propval != null && propval.equalsIgnoreCase("true")) { - ps = new PrintStream(new FileOutputStream("/tmp/httplog.txt"), false); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - synchronized final void debugPrint(String s, ByteBuffer b) { - ByteBuffer[] bufs = new ByteBuffer[1]; - bufs[0] = b; - debugPrint(s, bufs, 0, 1); - } - - synchronized final void debugPrint(String s, - ByteBuffer[] bufs, - int start, - int number) { - if (ps == null) { - return; - } - - ps.printf("\n%s:\n", s); - - for (int i=start; i<start+number; i++) { - ByteBuffer b = bufs[i].duplicate(); - while (b.hasRemaining()) { - int c = b.get(); - if (c == 10) { - ps.printf("LF \n"); - } else if (c == 13) { - ps.printf(" CR "); - } else if (c == 0x20) { - ps.printf("_"); - } else if (c > 0x20 && c <= 0x7F) { - ps.printf("%c", (char)c); - } else { - ps.printf("0x%02x ", c); - } - } - } - ps.printf("\n---------------------\n"); - } - - */ - // overridden in SSL only SSLParameters sslParameters() { return null; } --- 247,266 ---- final InetSocketAddress address() { return address; } ! synchronized void configureMode(Mode mode) throws IOException { ! this.mode = mode; ! if (mode == Mode.BLOCKING) ! channel().configureBlocking(true); ! else ! channel().configureBlocking(false); } abstract ConnectionPool.CacheKey cacheKey(); // overridden in SSL only SSLParameters sslParameters() { return null; }
*** 294,304 **** abstract long write(ByteBuffer buffer) throws IOException; /** * Closes this connection, by returning the socket to its connection pool. */ ! abstract void close(); /** * Returns a ByteBuffer with data, or null if EOF. */ final ByteBuffer read() throws IOException { --- 272,283 ---- abstract long write(ByteBuffer buffer) throws IOException; /** * Closes this connection, by returning the socket to its connection pool. */ ! @Override ! public abstract void close(); /** * Returns a ByteBuffer with data, or null if EOF. */ final ByteBuffer read() throws IOException {
*** 354,367 **** public String toString() { return "HttpConnection: " + channel().toString(); } @Override ! public final ByteBuffer getBuffer() { ! return client.getBuffer(); } @Override public final void returnBuffer(ByteBuffer buffer) { client.returnBuffer(buffer); } } --- 333,351 ---- public String toString() { return "HttpConnection: " + channel().toString(); } @Override ! public final ByteBuffer getBuffer(int n) { ! return client.getBuffer(n); } @Override public final void returnBuffer(ByteBuffer buffer) { client.returnBuffer(buffer); } + + @Override + public final void setMinBufferSize(int n) { + client.setMinBufferSize(n); + } }
< prev index next >