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

Failed WebSocket upgrade does not consume initial request .end part #2632

Open
adam-fowler opened this issue Jan 26, 2024 · 3 comments
Open

Comments

@adam-fowler
Copy link
Contributor

Expected behavior

When a HTTP channel is configured with a NIOTypedWebSocketServerUpgrader WebSocket upgrade and a connection fails because shouldUpgrade returned nil the upgrade process should consume all parts of the initial request.

Actual behavior

The .end part is passed onto the HTTP channel pipeline, confusing HTTP request processing as the first part it receives is not a .head.

Steps to reproduce

This can be easily reproduced using the WebSocket samples that come with SwiftNIO

  1. Edit the shouldUpgrade closure of NIOTypedWebSocketServerUpgrader in NIOWebSocketServer/Server.swift:82 to be
channel.eventLoop.makeSucceededFuture(nil)`.
  1. Run NIOWebSocketServer sample
  2. Add break point on line NIOWebSocketServer/Server.swift:214 to catch HTTP part.
for try await requestPart in inbound {
  1. Run NIOWebSocketClient sample
  2. When you hit the breakpoint, check contents of requestPart.

SwiftNIO version/commit hash

Swift version 5.10-dev (LLVM e8e5be8d5b39f46, Swift 99e9db868aefd99)
Target: x86_64-unknown-linux-gnu

@adam-fowler
Copy link
Contributor Author

Should the server be closing the channel at this point?

@FranzBusch
Copy link
Contributor

I will take a look. Thanks for filing this!

@adam-fowler
Copy link
Contributor Author

adam-fowler commented Mar 19, 2024

Additional information. If your shouldUpgrade function doesn't complete immediately then the .end is consumed prior to the NIOAsyncChannel is added to the pipeline. And your example websocket server channel will hang waiting for a HTTP part that never appears.

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

No branches or pull requests

2 participants