Skip to content
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

8299018: java/net/httpclient/HttpsTunnelAuthTest.java fails with java.io.IOException: HTTP/1.1 header parser received no bytes #11717

Closed
wants to merge 4 commits into from

Conversation

dfuch
Copy link
Member

@dfuch dfuch commented Dec 19, 2022

Please find here a trivial fix for a test issue in the HttpClient test's ProxyServer.

The ProxyServer has a bad printf that throws an IllegalFormatConversionException, which causes the proxy to close the connection after sending a 407 request. Depending on timing, the client might attempt to reuse the closed (or soon to be closed) connection for sending authentication, which then gets the next POST request to fail.

This failure is rare and intermittent (the client usually gets the close notification before it reuses the connection), but sometimes it doesn't.


Progress

  • Change must be properly reviewed (1 review required, with at least 1 Reviewer)
  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue

Issue

  • JDK-8299018: java/net/httpclient/HttpsTunnelAuthTest.java fails with java.io.IOException: HTTP/1.1 header parser received no bytes

Reviewers

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk pull/11717/head:pull/11717
$ git checkout pull/11717

Update a local copy of the PR:
$ git checkout pull/11717
$ git pull https://git.openjdk.org/jdk pull/11717/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 11717

View PR using the GUI difftool:
$ git pr show -t 11717

Using diff file

Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/11717.diff

@bridgekeeper
Copy link

bridgekeeper bot commented Dec 19, 2022

👋 Welcome back dfuchs! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@openjdk openjdk bot changed the title 8299018 8299018: java/net/httpclient/HttpsTunnelAuthTest.java fails with java.io.IOException: HTTP/1.1 header parser received no bytes Dec 19, 2022
@openjdk openjdk bot added the rfr Pull request is ready for review label Dec 19, 2022
@openjdk
Copy link

openjdk bot commented Dec 19, 2022

@dfuch The following label will be automatically applied to this pull request:

  • net

When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command.

@openjdk openjdk bot added the net net-dev@openjdk.org label Dec 19, 2022
@mlbridge
Copy link

mlbridge bot commented Dec 19, 2022

Webrevs

Co-authored-by: Daniel Jelinski <djelinski1@gmail.com>
@dfuch
Copy link
Member Author

dfuch commented Dec 19, 2022

Good catch. Thanks @djelinski

@@ -458,11 +458,14 @@ private boolean shouldCloseAfter407(List<String> headers) throws IOException {
try {
n = Integer.parseInt(cl);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello Daniel, is it expected that the content-length header will always be present and if it isn't then the ProxyServer is expected to close the connection?
In its current form (even without the changes in this PR), if the content-length header is missing, this block will run into a NumberFormatException leading to the connection closure. Is that OK?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The idea is that the connection can be reused only if the ProxyServer knows how many bytes it should read from the connection to get to the next request. Otherwise the connection will be closed. So if using chunked encoding or if no content-length is given the ProxyServer will simply close the connection. Maybe a smarter implementation could deal with chunked encoding and also look at the request method and accept that no content length means 0 in case of HEAD or GET - but that's not part of this fix.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually - maybe I should go on and make the changes wrt GET and HEAD. The ProxyServer seems to have some code for this but it looks buggy.

@djelinski
Copy link
Member

Could you also modify the ProxyServer to send a Connection: close header when shouldCloseAfter407 returns true?

@dfuch
Copy link
Member Author

dfuch commented Dec 19, 2022

Could you also modify the ProxyServer to send a Connection: close header when shouldCloseAfter407 returns true?

Good idea.

Copy link
Member

@djelinski djelinski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

}
return true; // should close
}
if (n > 0 || n < -1) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this part can be removed; we don't need any special handling for content-length: -1

var cmdline = headers.get(0);
int m = cmdline.indexOf(' ');
var method = (m > 0) ? cmdline.substring(0, m) : null;
var nobody = List.of("GET", "HEAD");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can include CONNECT in this list

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we leave a failed CONNECT connection open? I'm not sure. CONNECT are handled separately on the client side too.

Copy link
Member

@jaikiran jaikiran left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks fine to me.

@openjdk
Copy link

openjdk bot commented Dec 20, 2022

@dfuch 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:

8299018: java/net/httpclient/HttpsTunnelAuthTest.java fails with java.io.IOException: HTTP/1.1 header parser received no bytes

Reviewed-by: djelinski, jpai

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 10 new commits pushed to the master branch:

  • dd15d30: 8299043: test/jdk/javax/swing/AbstractButton/5049549/bug5049549.java fails with java.lang.NullPointerException
  • 05f9e76: 8298974: Add ftcolor.c to imported freetype sources
  • abc1297: 8299044: test/jdk/javax/swing/JComboBox/JComboBoxBorderTest.java fails on non mac
  • 5d330f5: 8299045: tools/doclint/BadPackageCommentTest.java fails after JDK-8298943
  • 40cb431: 8298943: Missing escapes for single quote marks in compiler.properties
  • 9194e91: 8298701: Cleanup SA entries in ProblemList-zgc.txt.
  • 4c927df: 8298470: Short cut java.lang.Object super class loading
  • 756a06d: 8299022: Linux ppc64le and s390x build issues after JDK-8160404
  • de0ce79: 8297801: printnm crashes with invalid address due to null pointer dereference
  • da38d43: 8296412: Special case infinite loops with unmerged backedges in IdealLoopTree::check_safepts

Please see this link for an up-to-date comparison between the source branch of this pull request and the master branch.
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 master branch, type /integrate in a new comment.

@openjdk openjdk bot added the ready Pull request is ready to be integrated label Dec 20, 2022
@dfuch
Copy link
Member Author

dfuch commented Dec 20, 2022

/integrate

@openjdk
Copy link

openjdk bot commented Dec 20, 2022

Going to push as commit e5edb10.
Since your change was applied there have been 12 commits pushed to the master branch:

  • 5df00d3: 8298931: java/net/httpclient/CancelStreamedBodyTest.java fails with AssertionError due to Pending TCP connections: 1
  • 36de61c: 8298865: Excessive memory allocation in CipherOutputStream AEAD decryption
  • dd15d30: 8299043: test/jdk/javax/swing/AbstractButton/5049549/bug5049549.java fails with java.lang.NullPointerException
  • 05f9e76: 8298974: Add ftcolor.c to imported freetype sources
  • abc1297: 8299044: test/jdk/javax/swing/JComboBox/JComboBoxBorderTest.java fails on non mac
  • 5d330f5: 8299045: tools/doclint/BadPackageCommentTest.java fails after JDK-8298943
  • 40cb431: 8298943: Missing escapes for single quote marks in compiler.properties
  • 9194e91: 8298701: Cleanup SA entries in ProblemList-zgc.txt.
  • 4c927df: 8298470: Short cut java.lang.Object super class loading
  • 756a06d: 8299022: Linux ppc64le and s390x build issues after JDK-8160404
  • ... and 2 more: https://git.openjdk.org/jdk/compare/8e49fcdde4fef5a8db36823b35d409ba2c9ec47b...master

Your commit was automatically rebased without conflicts.

@openjdk openjdk bot added the integrated Pull request has been integrated label Dec 20, 2022
@openjdk openjdk bot closed this Dec 20, 2022
@openjdk openjdk bot removed ready Pull request is ready to be integrated rfr Pull request is ready for review labels Dec 20, 2022
@openjdk
Copy link

openjdk bot commented Dec 20, 2022

@dfuch Pushed as commit e5edb10.

💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
integrated Pull request has been integrated net net-dev@openjdk.org
Development

Successfully merging this pull request may close these issues.

3 participants