# HG changeset patch # User chegar # Date 1516209695 0 # Node ID ae3a51bc5b9f549693794862ea1a8cc942e6720c # Parent 2cb33775fc6f1db6f6c47d7b6769eaf9bdf901eb http-client-branch: fix acc in PushGroup diff -r 2cb33775fc6f -r ae3a51bc5b9f src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PushGroup.java --- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PushGroup.java Wed Jan 17 12:19:06 2018 +0000 +++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PushGroup.java Wed Jan 17 17:21:35 2018 +0000 @@ -26,9 +26,10 @@ package jdk.incubator.http; import java.security.AccessControlContext; +import java.security.AccessController; import java.util.Objects; -import java.util.Optional; import java.util.concurrent.CompletableFuture; +import jdk.incubator.http.HttpResponse.BodyHandler; import jdk.incubator.http.HttpResponse.PushPromiseHandler; import jdk.incubator.http.HttpResponse.UntrustedBodyHandler; import jdk.incubator.http.internal.common.MinimalFuture; @@ -74,44 +75,41 @@ this.acc = acc; } - static class Acceptor { - final HttpRequest initiator, push; - volatile HttpResponse.BodyHandler bodyHandler = null; - volatile CompletableFuture> cf; + interface Acceptor { + BodyHandler bodyHandler(); + CompletableFuture> cf(); + boolean accepted(); + } - Acceptor(HttpRequest initiator, HttpRequest push) { - this.initiator = initiator; - this.push = push; - } + private static class AcceptorImpl implements Acceptor { + private volatile HttpResponse.BodyHandler bodyHandler; + private volatile CompletableFuture> cf; - CompletableFuture> accept(HttpResponse.BodyHandler bodyHandler) { + CompletableFuture> accept(BodyHandler bodyHandler) { Objects.requireNonNull(bodyHandler); + if (this.bodyHandler != null) + throw new IllegalStateException("non-null bodyHandler"); + this.bodyHandler = bodyHandler; cf = new MinimalFuture<>(); - if (this.bodyHandler != null) - throw new IllegalStateException(); - this.bodyHandler = bodyHandler; return cf; } - HttpResponse.BodyHandler bodyHandler() { - return bodyHandler; - } + @Override public BodyHandler bodyHandler() { return bodyHandler; } - CompletableFuture> cf() { - return cf; - } + @Override public CompletableFuture> cf() { return cf; } - boolean accepted() { - return cf != null; - } + @Override public boolean accepted() { return cf != null; } } Acceptor acceptPushRequest(HttpRequest pushRequest) { - Acceptor acceptor = new Acceptor<>(initiatingRequest, pushRequest); + AcceptorImpl acceptor = new AcceptorImpl<>(); pushPromiseHandler.applyPushPromise(initiatingRequest, pushRequest, acceptor::accept); if (acceptor.accepted()) { + if (acceptor.bodyHandler instanceof UntrustedBodyHandler) { + ((UntrustedBodyHandler)acceptor.bodyHandler).setAccessControlContext(acc); + } numberOfPushes++; remainingPushes++; } diff -r 2cb33775fc6f -r ae3a51bc5b9f src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java --- a/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java Wed Jan 17 12:19:06 2018 +0000 +++ b/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java Wed Jan 17 17:21:35 2018 +0000 @@ -436,7 +436,6 @@ } PushGroup.Acceptor acceptor = pushGroup.acceptPushRequest(pushRequest); - CompletableFuture> pushResponseCF = acceptor.cf(); if (!acceptor.accepted()) { // cancel / reject @@ -449,13 +448,15 @@ return; } - CompletableFuture> cf = pushStream.responseCF(); + CompletableFuture> pushResponseCF = acceptor.cf(); HttpResponse.BodyHandler pushHandler = acceptor.bodyHandler(); + assert pushHandler != null; pushStream.requestSent(); pushStream.setPushHandler(pushHandler); // TODO: could wrap the handler to throw on acceptPushPromise ? // setup housekeeping for when the push is received // TODO: deal with ignoring of CF anti-pattern + CompletableFuture> cf = pushStream.responseCF(); cf.whenComplete((HttpResponse resp, Throwable t) -> { t = Utils.getCompletionCause(t); if (Log.trace()) {