Author: markt
Date: Fri Feb 15 17:10:48 2013
New Revision: 1446694
URL: http://svn.apache.org/r1446694
Log:
Expose negotiated subProtocol to the Session
Add some plumbing for exposing path parameters
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java?rev=1446694&r1=1446693&r2=1446694&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/Constants.java Fri Feb 15
17:10:48 2013
@@ -48,6 +48,8 @@ public class Constants {
public static final String WS_VERSION_HEADER_NAME =
"Sec-WebSocket-Version";
public static final String WS_VERSION_HEADER_VALUE = "13";
public static final String WS_KEY_HEADER_NAME = "Sec-WebSocket-Key";
+ public static final String WS_PROTOCOL_HEADER_NAME =
+ "Sec-WebSocket-Protocol";
private Constants() {
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1446694&r1=1446693&r2=1446694&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Fri
Feb 15 17:10:48 2013
@@ -49,7 +49,9 @@ wsSession.invalidHandlerTypePong=A pong
wsSession.removeHandlerFailed=Unable to remove the handler [{0}] as it was not
registered with this session
wsSession.unknownHandler=Unable to add the message handler [{0}] as it was for
the unrecognised type [{1}]
+wsWebSocketContainer.httpRequestFailed=The HTTP request to initiate the
WebSocket conenction failed
wsWebSocketContainer.invalidStatus=The HTTP response from the server [{0}] did
not permit the HTTP upgrade to WebSocket
+wsWebSocketContainer.invalidSubProtocol=The WebSocket server returned multiple
values for the Sec-WebSocket-Protocol header
wsWebSocketContainer.maxBuffer=This implementation limits the maximum size of
a buffer to Integer.MAX_VALUE
wsWebSocketContainer.pathNoHost=No host was specified in URI
wsWebSocketContainer.pathWrongScheme=The scheme [{0}] is not supported
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1446694&r1=1446693&r2=1446694&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Fri Feb 15
17:10:48 2013
@@ -54,6 +54,8 @@ public class WsSession implements Sessio
private final ClassLoader applicationClassLoader;
private final WsWebSocketContainer webSocketContainer;
private final WsRequest request;
+ private final String subProtocol;
+ private final Map<String,String> pathParameters;
private MessageHandler textMessageHandler = null;
private MessageHandler binaryMessageHandler = null;
@@ -81,7 +83,8 @@ public class WsSession implements Sessio
public WsSession(Endpoint localEndpoint,
WsRemoteEndpointBase wsRemoteEndpoint,
WsWebSocketContainer wsWebSocketContainer,
- WsRequest request) {
+ WsRequest request, String subProtocol,
+ Map<String,String> pathParameters) {
this.localEndpoint = localEndpoint;
this.wsRemoteEndpoint = wsRemoteEndpoint;
this.wsRemoteEndpoint.setSession(this);
@@ -96,6 +99,8 @@ public class WsSession implements Sessio
this.sessionIdleTimeout =
webSocketContainer.getMaxSessionIdleTimeout();
this.request = request;
+ this.subProtocol = subProtocol;
+ this.pathParameters = pathParameters;
}
@@ -185,8 +190,7 @@ public class WsSession implements Sessio
@Override
public String getNegotiatedSubprotocol() {
- // TODO Auto-generated method stub
- return null;
+ return subProtocol;
}
@@ -343,8 +347,7 @@ public class WsSession implements Sessio
@Override
public Map<String,String> getPathParameters() {
- // TODO Auto-generated method stub
- return null;
+ return pathParameters;
}
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java?rev=1446694&r1=1446693&r2=1446694&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsWebSocketContainer.java Fri
Feb 15 17:10:48 2013
@@ -121,6 +121,7 @@ public class WsWebSocketContainer
Future<Void> fConnect = channel.connect(sa);
ByteBuffer response;
+ String subProtocol;
try {
fConnect.get();
@@ -141,8 +142,21 @@ public class WsWebSocketContainer
HandshakeResponse handshakeResponse =
processResponse(response, channel);
clientEndpointConfiguration.afterResponse(handshakeResponse);
+
+ // Sub-protocol
+ List<String> values = handshakeResponse.getHeaders().get(
+ Constants.WS_PROTOCOL_HEADER_NAME);
+ if (values == null || values.size() == 0) {
+ subProtocol = null;
+ } else if (values.size() == 1) {
+ subProtocol = values.get(0);
+ } else {
+ throw new DeploymentException(
+ sm.getString("Sec-WebSocket-Protocol"));
+ }
} catch (ExecutionException | InterruptedException e) {
- throw new DeploymentException("", e);
+ throw new DeploymentException(
+ sm.getString("wsWebSocketContainer.httpRequestFailed"), e);
}
// Switch to WebSocket
@@ -157,8 +171,9 @@ public class WsWebSocketContainer
"wsWebSocketContainer.endpointCreateFail",
clazz.getName()),
e);
}
- WsSession wsSession =
- new WsSession(endpoint, wsRemoteEndpointClient, this, null);
+
+ WsSession wsSession = new WsSession(endpoint, wsRemoteEndpointClient,
+ this, null, subProtocol, Collections.EMPTY_MAP);
endpoint.onOpen(wsSession, clientEndpointConfiguration);
registerSession(clazz, wsSession);
Modified:
tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java?rev=1446694&r1=1446693&r2=1446694&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsProtocolHandler.java
Fri Feb 15 17:10:48 2013
@@ -52,16 +52,18 @@ public class WsProtocolHandler implement
private final ClassLoader applicationClassLoader;
private final ServerContainerImpl webSocketContainer;
private final WsRequest request;
+ private final String subProtocol;
private WsSession wsSession;
public WsProtocolHandler(Endpoint ep, EndpointConfiguration endpointConfig,
- ServerContainerImpl wsc, WsRequest request) {
+ ServerContainerImpl wsc, WsRequest request, String subProtocol) {
this.ep = ep;
this.endpointConfig = endpointConfig;
this.webSocketContainer = wsc;
this.request = request;
+ this.subProtocol = subProtocol;
applicationClassLoader =
Thread.currentThread().getContextClassLoader();
}
@@ -86,8 +88,9 @@ public class WsProtocolHandler implement
try {
WsRemoteEndpointServer wsRemoteEndpointServer =
new WsRemoteEndpointServer(sos, webSocketContainer);
+ // TODO Replace null with path parameter map
wsSession = new WsSession(ep, wsRemoteEndpointServer,
- webSocketContainer, request);
+ webSocketContainer, request, subProtocol, null);
WsFrameServer wsFrame = new WsFrameServer(
sis,
wsSession);
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java?rev=1446694&r1=1446693&r2=1446694&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsServlet.java Fri Feb
15 17:10:48 2013
@@ -137,7 +137,7 @@ public class WsServlet extends HttpServl
}
WsRequest wsRequest = createWsRequest(req);
HttpUpgradeHandler wsHandler =
- new WsProtocolHandler(ep, sec, sc, wsRequest);
+ new WsProtocolHandler(ep, sec, sc, wsRequest, subProtocol);
req.upgrade(wsHandler);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]