[
https://issues.apache.org/jira/browse/WICKET-6493?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Grigorov updated WICKET-6493:
------------------------------------
Fix Version/s: (was: 7.10.0)
(was: 8.0.0)
8.0.0-M9
> WebSocket SessionIds are wrong (HttpSession one used instead of Websocket
> one) + NPE if no HttpSession is found during Handshake Request
> ----------------------------------------------------------------------------------------------------------------------------------------
>
> Key: WICKET-6493
> URL: https://issues.apache.org/jira/browse/WICKET-6493
> Project: Wicket
> Issue Type: Bug
> Components: wicket-native-websocket
> Affects Versions: 7.7.0
> Environment: Linux, JDK 8, Jetty 9
> Reporter: Torsten Krah
> Assignee: Martin Grigorov
> Priority: Major
> Fix For: 8.0.0-M9
>
>
> Reading the *HandshakeRequest* javadoc this is written:
> {code}
> /**
> * Return a reference to the HttpSession that the web socket handshake
> that
> * started this conversation was part of, if the implementation
> * is part of a Java EE web container.
> *
> * @return the http session or {@code null} if either the websocket
> * implementation is not part of a Java EE web container, or there is
> * no HttpSession associated with the opening handshake request.
> */
> Object getHttpSession();
> {code}
> So its valid to have *NO* *HttpSession* assigned to a JSR356 request.
> But Wicket seems to "expect" this because in *JavaxUpgradeHttpRequest* the
> HttpSession is extracted from the *userProperties* which is not there, if it
> was "null" in the HandshakeRequest.
> In the processing the chain will reach the *AbstractWebSocketProcessor*
> constructor which calls
> {code}
> this.sessionId = request.getSession(true).getId();
> {code}
> which is going to fail here because there is no HttpSession on the crafted
> request used here.
> I wonder why the *sessionId* is taken from the HttpSession at all - shouldn't
> it be the JSR356 session id which you can get with *session.getId()*.
> If you look e.g. at the *IWebSocketConnectionRegistry* javadocs most methods
> have their *sessionId* argument documented with:
> {code}
> * @param sessionId
> * the web socket client session id
> {code}
> but actually the HttpSession id is used instead of the WebSocket sessionId -
> which is a totally different one.
> So i am proposing to use the "real" websocket session id here taken from the
> constructor call:
> {code}
> public JavaxWebSocketProcessor(JavaxUpgradeHttpRequest request, final Session
> session, final WebApplication application, EndpointConfig endpointConfig)
> {code}
> where there is the *session* argument where *session.getId()* actually
> returns the websocket session id which can last longer and is 100% there -
> the HttpSession must not be there at all as written.
> Unfortunately the javadoc on *IWebSocketConnectionRegistry* for
> {code}
> /**
> * @param application
> * the web application to look in
> * @param sessionId
> * @return collection of web socket connection used by a client with
> the given session id
> */
> Collection<IWebSocketConnection> getConnections(Application
> application, String sessionId);
> {code}
> does not state which "sessionId" is meant here - i guess its the
> *HttpSession* - in that case please clarify the JavaDocs here.
> The code maybe need to "track"the HttpSession id to handle that usecase - but
> in an optional way because it may not be there.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)