src/java.net.http/share/classes/jdk/internal/net/http/HttpClientImpl.java
branchhttp-client-branch
changeset 56677 f57700f449bd
parent 56621 a85c163fc41c
child 56695 d219df0c7d24
equal deleted inserted replaced
56676:7b616fbd7d5b 56677:f57700f449bd
    26 package jdk.internal.net.http;
    26 package jdk.internal.net.http;
    27 
    27 
    28 import javax.net.ssl.SSLContext;
    28 import javax.net.ssl.SSLContext;
    29 import javax.net.ssl.SSLParameters;
    29 import javax.net.ssl.SSLParameters;
    30 import java.io.IOException;
    30 import java.io.IOException;
       
    31 import java.io.UncheckedIOException;
    31 import java.lang.ref.Reference;
    32 import java.lang.ref.Reference;
    32 import java.lang.ref.WeakReference;
    33 import java.lang.ref.WeakReference;
    33 import java.net.Authenticator;
    34 import java.net.Authenticator;
    34 import java.net.CookieHandler;
    35 import java.net.CookieHandler;
    35 import java.net.ProxySelector;
    36 import java.net.ProxySelector;
    54 import java.util.Objects;
    55 import java.util.Objects;
    55 import java.util.Optional;
    56 import java.util.Optional;
    56 import java.util.Set;
    57 import java.util.Set;
    57 import java.util.TreeSet;
    58 import java.util.TreeSet;
    58 import java.util.concurrent.CompletableFuture;
    59 import java.util.concurrent.CompletableFuture;
       
    60 import java.util.concurrent.CompletionException;
    59 import java.util.concurrent.ExecutionException;
    61 import java.util.concurrent.ExecutionException;
    60 import java.util.concurrent.Executor;
    62 import java.util.concurrent.Executor;
    61 import java.util.concurrent.Executors;
    63 import java.util.concurrent.Executors;
    62 import java.util.concurrent.ThreadFactory;
    64 import java.util.concurrent.ThreadFactory;
    63 import java.util.concurrent.atomic.AtomicInteger;
    65 import java.util.concurrent.atomic.AtomicInteger;
   529             else
   531             else
   530                 throw new InternalError("Unexpected exception", t);
   532                 throw new InternalError("Unexpected exception", t);
   531         }
   533         }
   532     }
   534     }
   533 
   535 
       
   536     private static final Executor ASYNC_POOL = new CompletableFuture<Void>().defaultExecutor();
       
   537 
   534     @Override
   538     @Override
   535     public <T> CompletableFuture<HttpResponse<T>>
   539     public <T> CompletableFuture<HttpResponse<T>>
   536     sendAsync(HttpRequest userRequest, BodyHandler<T> responseHandler)
   540     sendAsync(HttpRequest userRequest, BodyHandler<T> responseHandler)
   537     {
   541     {
   538         return sendAsync(userRequest, responseHandler, null);
   542         return sendAsync(userRequest, responseHandler, null);
   539     }
   543     }
   540 
       
   541 
   544 
   542     @Override
   545     @Override
   543     public <T> CompletableFuture<HttpResponse<T>>
   546     public <T> CompletableFuture<HttpResponse<T>>
   544     sendAsync(HttpRequest userRequest,
   547     sendAsync(HttpRequest userRequest,
   545               BodyHandler<T> responseHandler,
   548               BodyHandler<T> responseHandler,
   594             if (DEBUGELAPSED) {
   597             if (DEBUGELAPSED) {
   595                 res = res.whenComplete(
   598                 res = res.whenComplete(
   596                         (b,t) -> debugCompleted("ClientImpl (async)", start, userRequest));
   599                         (b,t) -> debugCompleted("ClientImpl (async)", start, userRequest));
   597             }
   600             }
   598 
   601 
   599             // makes sure that any dependent actions happen in the executor.
   602             // makes sure that any dependent actions happen in the CF default
   600             // we only need to do that for sendAsync(...), when exchangeExecutor
   603             // executor. This is only needed for sendAsync(...), when
   601             // is non null.
   604             // exchangeExecutor is non-null.
   602             if (exchangeExecutor != null) {
   605             if (exchangeExecutor != null) {
   603                 executor = acc == null ? executor
   606                 res = res.whenCompleteAsync((r, t) -> { /* do nothing */}, ASYNC_POOL);
   604                         : new PrivilegedExecutor(executor, acc);
       
   605                 res = res.whenCompleteAsync((r, t) -> { /* do nothing */}, executor);
       
   606             }
   607             }
   607             return res;
   608             return res;
   608         } catch(Throwable t) {
   609         } catch(Throwable t) {
   609             unreference();
   610             unreference();
   610             debugCompleted("ClientImpl (async)", start, userRequest);
   611             debugCompleted("ClientImpl (async)", start, userRequest);