--- old/test/jdk/java/net/httpclient/http2/server/Http2TestExchange.java 2017-11-30 04:05:21.789290877 -0800 +++ new/test/jdk/java/net/httpclient/http2/server/Http2TestExchange.java 2017-11-30 04:05:21.609275144 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,148 +21,52 @@ * questions. */ +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.IOException; import java.net.URI; import java.net.InetSocketAddress; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; import javax.net.ssl.SSLSession; import jdk.incubator.http.internal.common.HttpHeadersImpl; -import jdk.incubator.http.internal.frame.HeaderFrame; -import jdk.incubator.http.internal.frame.HeadersFrame; -public class Http2TestExchange { +public interface Http2TestExchange { + + HttpHeadersImpl getRequestHeaders(); + + HttpHeadersImpl getResponseHeaders(); + + URI getRequestURI(); + + String getRequestMethod(); + + SSLSession getSSLSession(); + + void close(); + + InputStream getRequestBody(); + + OutputStream getResponseBody(); + + void sendResponseHeaders(int rCode, long responseLength) throws IOException; + + InetSocketAddress getRemoteAddress(); + + int getResponseCode(); + + InetSocketAddress getLocalAddress(); + + String getProtocol(); + + boolean serverPushAllowed(); + + void serverPush(URI uri, HttpHeadersImpl headers, InputStream content); - final HttpHeadersImpl reqheaders; - final HttpHeadersImpl rspheaders; - final URI uri; - final String method; - final InputStream is; - final BodyOutputStream os; - final SSLSession sslSession; - final int streamid; - final boolean pushAllowed; - final Http2TestServerConnection conn; - final Http2TestServer server; - - int responseCode = -1; - long responseLength; - - Http2TestExchange(int streamid, - String method, - HttpHeadersImpl reqheaders, - HttpHeadersImpl rspheaders, - URI uri, - InputStream is, - SSLSession sslSession, - BodyOutputStream os, - Http2TestServerConnection conn, - boolean pushAllowed) { - this.reqheaders = reqheaders; - this.rspheaders = rspheaders; - this.uri = uri; - this.method = method; - this.is = is; - this.streamid = streamid; - this.os = os; - this.sslSession = sslSession; - this.pushAllowed = pushAllowed; - this.conn = conn; - this.server = conn.server; - } - - public HttpHeadersImpl getRequestHeaders() { - return reqheaders; - } - - public HttpHeadersImpl getResponseHeaders() { - return rspheaders; - } - - public URI getRequestURI() { - return uri; - } - - public String getRequestMethod() { - return method; - } - - public SSLSession getSSLSession() { - return sslSession; - } - - public void close() { - try { - is.close(); - os.close(); - } catch (IOException e) { - System.err.println("TestServer: HttpExchange.close exception: " + e); - e.printStackTrace(); - } - } - - public InputStream getRequestBody() { - return is; - } - - public OutputStream getResponseBody() { - return os; - } - - public void sendResponseHeaders(int rCode, long responseLength) throws IOException { - this.responseLength = responseLength; - if (responseLength > 0 || responseLength < 0) { - long clen = responseLength > 0 ? responseLength : 0; - rspheaders.setHeader("Content-length", Long.toString(clen)); - } - - rspheaders.setHeader(":status", Integer.toString(rCode)); - - Http2TestServerConnection.ResponseHeaders response - = new Http2TestServerConnection.ResponseHeaders(rspheaders); - response.streamid(streamid); - response.setFlag(HeaderFrame.END_HEADERS); - if (responseLength < 0) { - response.setFlag(HeadersFrame.END_STREAM); - os.closeInternal(); - } - conn.outputQ.put(response); - os.goodToGo(); - System.err.println("Sent response headers " + rCode); - } - - public InetSocketAddress getRemoteAddress() { - return (InetSocketAddress) conn.socket.getRemoteSocketAddress(); - } - - public int getResponseCode() { - return responseCode; - } - - public InetSocketAddress getLocalAddress() { - return server.getAddress(); - } - - public String getProtocol() { - return "HTTP/2"; - } - - public boolean serverPushAllowed() { - return pushAllowed; - } - - public void serverPush(URI uri, HttpHeadersImpl headers, InputStream content) { - OutgoingPushPromise pp = new OutgoingPushPromise( - streamid, uri, headers, content); - headers.setHeader(":method", "GET"); - headers.setHeader(":scheme", uri.getScheme()); - headers.setHeader(":authority", uri.getAuthority()); - headers.setHeader(":path", uri.getPath()); - try { - conn.outputQ.put(pp); - // writeLoop will spin up thread to read the InputStream - } catch (IOException ex) { - System.err.println("TestServer: pushPromise exception: " + ex); - } - } + /** + * Send a PING on this exchanges connection, and completes the returned CF + * with the number of milliseconds it took to get a valid response. + * It may also complete exceptionally + */ + CompletableFuture sendPing(); }