equal
deleted
inserted
replaced
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); |