Summary
Add connection specific timeout support to the HTTP Client.
Problem
The Java 11 HTTP Client API supports setting an overall request timeout
through HttpRequest.Builder::timeout. A connect specific timeout is
also desirable, so that the connection phase can be timed with a much
smaller timeout than the overall response ( which is typically done to
mitigate against potentially long connection delays when the network
does not response to TCP SYN requests for some domains).
Solution
Add a new method to the HttpClient.Builder that allows setting of a
connect timeout duration for all new connections established by clients
built from that builder. Add a new accessor to HttpClient to retrieve
said connect timeout duration.
Add a new public exception type, HttpConnectTimeoutException that is
thrown when a connection times out. This exception type is a subtype of
the existing HttpTimeoutException, thus allowing for more fine grained
exception handling to discern connection timeouts from response
timeouts, where desired. The use of a subtype reduces the exception
handling overhead for those that do not wish to take that burden, a
timeout is just a timeout.
Specification
Specification changes to the java.net.http package:
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 {@link HttpClient#send(HttpRequest,BodyHandler)
 * HttpClient::send} throws an {@link HttpConnectTimeoutException}, or
 * {@link HttpClient#sendAsync(HttpRequest,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.
 *
 * @since 11
 */
public class HttpConnectTimeoutException extends HttpTimeoutException {
    private static final long serialVersionUID = 321L + 11L;
    /**
     * Constructs an {@code HttpConnectTimeoutException} with the given detail
     * message.
     *
     * @param message
     *        The detail message; can be {@code null}
     */
    public HttpConnectTimeoutException(String message) { ... }
}- csr of
- 
                    JDK-8208391 Differentiate response and connect timeouts in HTTP Client API -           
- Resolved
 
-