Skip to content

[NET-735] Apply read timeout before implicit IMAPS TLS handshake - #415

Open
hutiefang76 wants to merge 1 commit into
apache:masterfrom
hutiefang76:NET-735-implicit-timeout
Open

hutiefang76 wants to merge 1 commit into
apache:masterfrom
hutiefang76:NET-735-implicit-timeout

Conversation

@hutiefang76

Copy link
Copy Markdown

IMAPSClient(true) starts the TLS handshake before SocketClient._connectAction_() applies the configured read timeout. A peer that accepts TCP but does not answer TLS can therefore leave connect() waiting despite a nonzero setDefaultTimeout(...).

Apply the existing applySocketAttributes() helper before the implicit handshake, matching FTPSClient. A zero read timeout keeps its existing unlimited-wait behavior, and explicit STARTTLS retains a timeout set after connecting. TLS protocols, certificate verification and hostname verification are unchanged.

The loopback regressions cover the implicit timeout, an unlimited-wait control, explicit STARTTLS with a runtime timeout different from the default, and layered-socket timeout inheritance. Without the production line, the implicit-timeout test fails while the controls pass.

Thanks to John van der Kamp for the original diagnosis and workaround in NET-735.

Validation:

  • JDK 17: the final tests fail on unmodified production code (1 failure, 3 controls pass) and all 4 pass with the fix.
  • JDK 8: all 4 focused regressions pass.
  • Linux/JDK 17 default mvn: complete build passed, including RAT, Javadoc, Checkstyle, API compatibility and PMD; 636 tests (634 passed, 2 existing skips), no failures or errors.

The macOS default build hit two unchanged FTP network-dependent tests. Both failures also reproduce with the unmodified production code. The Linux run uses the same source files and leaves those tests enabled.

AI assistance: DeepSeek implemented the patch and regression tests and performed the first review; Codex coordinated the work, reviewed the diff and ran validation. This PR description is AI-generated.

Thanks for your contribution to Apache Commons! Your help is appreciated!

Before you push a pull request, review this list:

  • Read the contribution guidelines for this project.
  • Read the ASF Generative Tooling Guidance if you use Artificial Intelligence (AI).
  • I used AI to create any part of, or all of, this pull request. Which AI tool was used to create this pull request, and to what extent did it contribute?
  • Run a successful build using the default Maven goal with mvn; that's mvn on the command line by itself.
  • Write unit tests that match behavioral changes, where the tests fail if the changes to the runtime are not applied. This may not always be possible, but it is a best practice.
  • Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
  • Each commit in the pull request should have a meaningful subject line and body. Note that a maintainer may squash commits during the merge process.

The implicit handshake starts before the superclass applies socket
attributes, so a configured default read timeout does not bound the
handshake. Apply the existing helper first, matching FTPSClient.

Add loopback regressions for the configured and unlimited timeouts,
explicit STARTTLS runtime timeout, and layered socket inheritance.
Credit John van der Kamp for the original diagnosis and workaround.

Generated-by: DeepSeek (deepseek-v4-flash)
Generated-by: Codex
@hutiefang76

Copy link
Copy Markdown
Author

Could a maintainer approve the workflow runs for this PR? Java CI, Dependency Review and CodeQL are waiting for approval, with no jobs started. The default Linux/JDK 17 mvn result is included in the description.

AI-generated follow-up.

@garydgregory

Copy link
Copy Markdown
Member

Dear AI: Do not ask to run CI builds. CI resources are limited. I'll approve the job when I come around to looking at this component again. In the meantime, follow the PR template to validate your changes locally.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants