[
https://issues.apache.org/jira/browse/CAMEL-25917?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-25917 started by Federico Mariani.
------------------------------------------------
> camel-undertow - close WebSocket connections opened before the consumer starts
> ------------------------------------------------------------------------------
>
> Key: CAMEL-25917
> URL: https://issues.apache.org/jira/browse/CAMEL-25917
> Project: Camel
> Issue Type: Improvement
> Components: camel-undertow
> Reporter: Federico Mariani
> Assignee: Federico Mariani
> Priority: Major
> Fix For: 4.22.3, 4.24.0
>
>
> Follow-up to CAMEL-25375.
> h3. Behaviour today
> When a WebSocket producer and a WebSocket consumer share the same Undertow
> endpoint URI and the consumer is started for the first time after the server
> is already serving that path (for example a route with {{autoStartup(false)}}
> started later, or a route added at runtime), connections opened while only
> the producer served the path stay open after the consumer starts. The
> consumer's {{handlers}} option was never applied to those connections,
> because producer-only paths do not run {{handlers}} during the handshake
> (CAMEL-25375). The per-channel handshake result in {{CamelWebSocketHandler}}
> records only the endpoint URIs whose checks passed, not whether the
> {{handlers}} chain ran, so {{isAuthenticated(channel, endpoint,
> consumer=true)}} accepts those channels for the consumer and their messages
> reach the consumer route without having gone through its {{handlers}}.
> h3. Behaviour after the change
> A connection is accepted by a consumer that configures {{handlers}} only if
> the consumer's {{handlers}} chain ran during its handshake. Connections
> opened on the path before the consumer started are closed with {{1008}}
> (policy violation) when the consumer is registered, and clients reconnect so
> the handshake runs the consumer's {{handlers}}. Producer-only paths keep
> their current behaviour (no {{handlers}} at handshake). This mirrors what
> already happens for OAuth-protected endpoints (see
> {{UndertowWsOAuthProfileConsumerWindowTest}}).
> h3. Classes involved
> * {{org.apache.camel.component.undertow.handlers.CamelWebSocketHandler}}
> ({{HandshakeResult}}, {{upgrade()}}, {{isAuthenticated(...)}},
> {{setConsumer(...)}})
> * possibly {{org.apache.camel.component.undertow.UndertowConsumer}}, if the
> close of existing connections is triggered from there
> h3. Code change
> # Record in {{HandshakeResult}} which checks were applied: keep the endpoint
> URIs that passed with the consumer checks ({{handlers}} included) separately
> from those that passed with the producer checks, or capture {{path.consumer}}
> at handshake time.
> # In {{isAuthenticated(channel, endpoint, consumer=true)}}, when
> {{endpoint.getHandlers() != null}}, require the consumer-check record for
> that URI; a producer-check record is no longer enough.
> # In {{setConsumer(consumer, handler)}}, after installing the consumer, close
> ({{CloseMessage.MSG_VIOLATES_POLICY}}) the existing peers that no longer pass
> {{isAuthenticated(peer, pathSecurity())}}. {{send()}} already filters peers
> with {{isAuthenticated}}.
> # Leave producer-only behaviour unchanged.
> h3. Tests
> New test class in
> {{components/camel-undertow/src/test/java/org/apache/camel/component/undertow/spi/}}
> (or new methods in {{SecurityProviderWebSocketTest}}), reusing
> {{AbstractSecurityProviderTest}}:
> * {{connectionOpenedBeforeConsumerStartsIsClosedWhenConsumerHasHandlers}}:
> producer and consumer on the same URI with {{allowedRoles}} and {{handlers}},
> consumer with {{autoStartup(false)}}; connect, start the consumer, send; the
> consumer mock receives nothing and the connection is closed.
> * {{connectionOpenedAfterConsumerStartsRunsConsumerHandlers}}: the normal
> path keeps working.
> * {{producerOnlyPathStillAcceptsConnectionsWithoutHandlers}}: producer-only
> paths keep working.
> h3. Upgrade guide
> Add a note to the 4.24 and 4.22 upgrade guides: WebSocket connections opened
> on an Undertow path before its consumer was started for the first time are
> closed when that consumer configures {{handlers}}; clients must reconnect.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)