Hi Chris, src/java.net.http/share/classes/java/net/http/HttpClient.java
+ * <p> In the case where a new connection needs to be established, if + * the connection cannot be established within the given {@code + * duration}, then an {@link HttpConnectTimeoutException} is thrown + * from {@link HttpClient#send(java.net.http.HttpRequest, + * java.net.http.HttpResponse.BodyHandler) HttpClient::send}, or + * {@link HttpClient#sendAsync(java.net.http.HttpRequest, + * java.net.http.HttpResponse.BodyHandler) HttpClient::sendAsync} + * completes exceptionally with an {@code HttpConnectTimeoutException}. Do you think this can be reworded a bit? Although I understand what's being said here, the wording doesn't seem right. Maybe something like: * <p> In the case where a new connection needs to be established, if * the connection cannot be established within the given {@code * duration}, then {@link HttpClient#send(java.net.http.HttpRequest, * java.net.http.HttpResponse.BodyHandler) HttpClient::send} throws a * {@link HttpConnectTimeoutException}, or * {@link HttpClient#sendAsync(java.net.http.HttpRequest, * java.net.http.HttpResponse.BodyHandler) HttpClient::sendAsync} * completes exceptionally with an {@code HttpConnectTimeoutException}. src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestImpl.java - this.timeout = null; + this.timeout = Duration.ofSeconds(30); Is this an intentional change of default value for the timeout? Is that something that needs to be documented? One other thing - maybe not directly related to this single patch, but as you are aware, recently as part of [1], a new system property (and a security property) was introduced to optionally include host info in the exception messages thrown for socket exceptions. Does the HttpClient honour that system property in the exceptions it throws? I don't see it being used in this patch for the timeout exceptions. I haven't checked the code, outside of this patch, to see if it's dealt with in other parts of this API. [1] https://bugs.openjdk.java.net/browse/JDK-8204233 -Jaikiran On 04/08/18 5:15 PM, Chris Hegarty wrote: > Hi, This is a code review to add connection specific timeout support > to the new HTTP Client, as discussed recently over on another thread > [1]. The connection timeout duration is proposed to be added at the > level of the client, and if specified applies to all requests sent by > that client. The connect timeout mechanism is orthogonal to the > HttpRequest `timeout`, but can be used to complement it. For example, > HttpClient client = HttpClient.newBuilder() > .connectTimeout(Duration.ofSeconds(20)) .build(); HttpRequest request > = HttpRequest.newBuilder() .uri(URI.create("https://foo.com/")) > .timeout(Duration.ofMinutes(2)) .header("Content-Type", > "application/json") > .POST(BodyPublishers.ofFile(Paths.get("file.json"))) .build(); > client.sendAsync(request, BodyHandlers.ofString()) sends the request > with a 20 second connect timeout and a response timeout of 2 minutes. > The connect timeout, as implemented in the webrev below, covers the > DNS lookup, the TCP SYN handshake, and the TLS handshake. The proposed > spec wording deliberately avoids adding such low-level details. > Outline of the specification changes: To HttpClient.Builder add: /** * > Sets the connect timeout duration for this client. * * <p> In the case > where a new connection needs to be established, if * the connection > cannot be established within the given {@code * duration}, then an > {@link HttpConnectTimeoutException} is thrown * from {@link > HttpClient#send(java.net.http.HttpRequest, * > java.net.http.HttpResponse.BodyHandler) HttpClient::send}, or * {@link > HttpClient#sendAsync(java.net.http.HttpRequest, * > java.net.http.HttpResponse.BodyHandler) HttpClient::sendAsync} * > completes exceptionally with an {@code HttpConnectTimeoutException}. * > If a new connection does not need to be established, for example * if > a connection can be reused from a previous request, then this * > timeout duration has no effect. * * @param duration the duration to > allow the underlying connection to be * established * @return this > builder * @throws IllegalArgumentException if the duration is > non-positive */ public Builder connectTimeout(Duration duration); To > HttpClient add an accessor: /** * Returns an {@code Optional} > containing the <i>connect timeout duration</i> * for this client. If > the {@linkplain Builder#connectTimeout(Duration) * connect timeout > duration} was not set in the client's builder, then the * {@code > Optional} is empty. * * @return an {@code Optional} containing this > client's connect timeout * duration */ public abstract > Optional<Duration> connectTimeout(); Add new Exception type: /** * > Thrown when a connection, over which an {@code HttpRequest} is > intended to be * sent, is not successfully established within a > specified time period. */ public class HttpConnectTimeoutException > extends HttpTimeoutException { ... } Webrev: > http://cr.openjdk.java.net/~chegar/8208391/webrev.00/ -Chris [1] > http://mail.openjdk.java.net/pipermail/net-dev/2018-August/011683.html