-
Notifications
You must be signed in to change notification settings - Fork 5.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
8310645: CancelledResponse.java does not use HTTP/2 when testing the HttpClient #14625
Conversation
👋 Welcome back ccleary! A progress list of the required criteria for merging this PR into |
cf.get(); | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
assertTrue(e.getCause() instanceof IOException, "HTTP/2 should cancel with an IOException when the Subscription is cancelled."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe we want to check that the exception we get as the cause is the expected CancelException, or at least that it can be found somewhere while following the cause chain. Otherwise looks good!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So for HTTP/2, the cancelImpl()
method in Stream
looks like this.
@Override
void cancel() {
if ((streamid == 0)) {
cancel(new IOException("Stream cancelled before streamid assigned"));
} else {
cancel(new IOException("Stream " + streamid + " cancelled"));
}
}
When the new IOException is passed to cancel, it sets the errorRef
field to the IOException which then gets returned to us as the cause of the CompletableFuture's cause for cancelling. I think this behaviour is acceptable as the IOException returned will say "Stream x cancelled" which is accurate. Possible that I dont need to have this "CancelException" here
May be more difficult to verify the cause of cancellation beyond that which I'll think about.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is a check that the cancelling BodyHandler sets the cancelled field which may be sufficient
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could also just check that the returned a call to getMessage()
returns a string that contains cancelled but its not a very nice solution
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Update: can verify the subscription is properly cancelled by adding a reference to the BodySubscriber used to the CancellingHandler (client) in the test. When the test is done, all thats needed is a call to SubscriptionWrapper.cancelled()
to verify that the connection ended correctly.
out.println("Cancelling subscription after reading " + index.get()); | ||
cancelled.set(true); | ||
subscription.cancel(); | ||
result.completeExceptionally(new CancelException()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe that's the exception we expect to find in the HttpResponse
. IIRC the original test was checking for that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, but calling subscription.cancel()
causes Stream.cancelImpl()
to be called. That in turn causes the HttpResponse
(or the variable result in your snippet above) to complete exceptionally with an IOException which has the message "Stream x cancelled". I think that means that the call to completeExceptionally(new CancelException())
has no effect because subscription.cancel()
triggers a call to cancelImpl()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK. LGTM then.
@c-cleary This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be:
You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 147 new commits pushed to the
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details. ➡️ To integrate this PR with the above commit message to the |
/integrate |
Going to push as commit 00ac46c.
Your commit was automatically rebased without conflicts. |
Issue
In CancelledResponse.java the test only checks the HttpClient against HTTP/1.1 when cancelling a BodySubscriber while receiving data.
Solution
In the interest of more coverage, a new test has been created which performs the same checks against HTTP/2 to cover the client in the case of a HTTP/2 connection. A new test was created as it makes use of HttpTestServerAdapters to create the test servers. This is different to how this is performed in the original "CancelledResponse" test. There are some minor changes to how the testing is conducted with an element of randomness added to the new test.
As an open question to reviewers, the old test "CancelledResponse" and the new test "CancelledResponse2" could be merged into a single file and the HTTP/1.1 case could be updated to use more canonical testing methods as with "CancelledResponse2". Though there isn't a very pressing need for this and so it has not been included in this PR as of now.
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/14625/head:pull/14625
$ git checkout pull/14625
Update a local copy of the PR:
$ git checkout pull/14625
$ git pull https://git.openjdk.org/jdk.git pull/14625/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 14625
View PR using the GUI difftool:
$ git pr show -t 14625
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/14625.diff
Webrev
Link to Webrev Comment