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

Fix issue #1418: WebSocketServer sometimes misses GET request after SSL handshake #1419

Conversation

robert-s-ubi
Copy link
Contributor

@robert-s-ubi robert-s-ubi commented Jun 8, 2024

Description

On Ubuntu 22.04 with Linux 6.5, it was observed that when the server gets the SSL records containing the client handshake finished message and the first HTTP GET request in ONE read operation, the latter SSL record is never processed.

Commit 89eaf41 should have fixed this, but it turned out that when SSLSocketChannel2#processHandshake() is called from SSLSocketChannel2#write(), the second SSL record containing the HTTP GET request is stashed away, but never retrieved, since the calling code in WebSocketServer#doWrite() has no provisions for this, only WebSocketServer#doRead() does.

Change SSLSocketChannel2#processHandshake() to only read from the socket when called from SSLSocketChannel#read(), to ensure that when two SSL records are read, the second one is processed as well.

Related Issue

Fixes #1418

Motivation and Context

Our integration tests which locally connect a WebSocketClient to a WebSocketServer were sporadically failing when run on Ubuntu 22.04 with Linux 6.5 (this never occurred in Ubuntu 20.04 with Linux 5.14).

With this change, the tests run reliably. We have verified from detailed java.net debug logs that when two SSL records are retrieved in one read, they are now both processed.

How Has This Been Tested?

Tested with our internal integration tests.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing tests passed. (Issue256Test#runReconnectSocketClose[0] fails before and after this change)

On Ubuntu 22.04 with Linux 6.5, it was observed that when the server
gets the SSL records containing the client handshake finished message
and the first HTTP GET request in ONE read operation, the latter SSL
record is never processed.

Commit 89eaf41 should have fixed this,
but it turned out that when SSLSocketChannel2#processHandshake() is
called from SSLSocketChannel2#write(), the second SSL record containing
the HTTP GET request is stashed away, but never retrieved, since the
calling code in WebSocketServer#doWrite() has no provisions for this,
only WebSocketServer#doRead() does.

Change SSLSocketChannel2#processHandshake() to only read from the socket
when called from SSLSocketChannel#read(), to ensure that when two SSL
records are read, the second one is processed as well.

This fixes issue TooTallNate#1418.
@marci4 marci4 added this to the Release 1.5.7 milestone Jun 8, 2024
@PhilipRoman PhilipRoman self-requested a review June 10, 2024 09:13
@PhilipRoman PhilipRoman merged commit cd08f83 into TooTallNate:master Jun 10, 2024
1 check passed
@marci4 marci4 added the Bug label Jul 8, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

WebSocketServer may miss the first GET request if transmitted back-to-back with the SSL handshake finish
3 participants