From 032e984674ed0293ff627f2fae6d38e0c071b113 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Tue, 15 Mar 2016 07:44:46 -0700 Subject: [PATCH] Issue #424 - Jetty impl. of Websocket ServerEndpointConfig.Configurator lifecycle out of spec --- .../websocket/jsr356/server/JsrCreator.java | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java index 7bd8ca20728..1193c07936e 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java +++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/JsrCreator.java @@ -59,8 +59,8 @@ public class JsrCreator implements WebSocketCreator @Override public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) { - JsrHandshakeRequest hsreq = new JsrHandshakeRequest(req); - JsrHandshakeResponse hsresp = new JsrHandshakeResponse(resp); + JsrHandshakeRequest jsrHandshakeRequest = new JsrHandshakeRequest(req); + JsrHandshakeResponse jsrHandshakeResponse = new JsrHandshakeResponse(resp); // Get raw config, as defined when the endpoint was added to the container ServerEndpointConfig config = metadata.getConfig(); @@ -81,10 +81,7 @@ public class JsrCreator implements WebSocketCreator // Get Configurator from config object (not guaranteed to be unique per endpoint upgrade) ServerEndpointConfig.Configurator configurator = config.getConfigurator(); - // modify handshake - configurator.modifyHandshake(config,hsreq,hsresp); - - // check origin + // [JSR] Step 1: check origin if (!configurator.checkOrigin(req.getOrigin())) { try @@ -99,7 +96,7 @@ public class JsrCreator implements WebSocketCreator return null; } - // deal with sub protocols + // [JSR] Step 2: deal with sub protocols List supported = config.getSubprotocols(); List requested = req.getSubProtocols(); String subprotocol = configurator.getNegotiatedSubprotocol(supported,requested); @@ -108,22 +105,22 @@ public class JsrCreator implements WebSocketCreator resp.setAcceptedSubProtocol(subprotocol); } - // deal with extensions - List installedExts = new ArrayList<>(); + // [JSR] Step 3: deal with extensions + List installedExtensions = new ArrayList<>(); for (String extName : extensionFactory.getAvailableExtensions().keySet()) { - installedExts.add(new JsrExtension(extName)); + installedExtensions.add(new JsrExtension(extName)); } List requestedExts = new ArrayList<>(); for (ExtensionConfig reqCfg : req.getExtensions()) { requestedExts.add(new JsrExtension(reqCfg)); } - List usedExts = configurator.getNegotiatedExtensions(installedExts,requestedExts); + List usedExtensions = configurator.getNegotiatedExtensions(installedExtensions,requestedExts); List configs = new ArrayList<>(); - if (usedExts != null) + if (usedExtensions != null) { - for (Extension used : usedExts) + for (Extension used : usedExtensions) { ExtensionConfig ecfg = new ExtensionConfig(used.getName()); for (Parameter param : used.getParameters()) @@ -135,20 +132,25 @@ public class JsrCreator implements WebSocketCreator } resp.setExtensions(configs); - // create endpoint class + // [JSR] Step 4: build out new ServerEndpointConfig + PathSpec pathSpec = jsrHandshakeRequest.getRequestPathSpec(); + if (pathSpec instanceof WebSocketPathSpec) + { + // We have a PathParam path spec + WebSocketPathSpec wspathSpec = (WebSocketPathSpec)pathSpec; + String requestPath = req.getRequestPath(); + // Wrap the config with the path spec information + config = new PathParamServerEndpointConfig(config,wspathSpec,requestPath); + } + + // [JSR] Step 5: Call modifyHandshake + configurator.modifyHandshake(config,jsrHandshakeRequest,jsrHandshakeResponse); + try { + // [JSR] Step 6: create endpoint class Class endpointClass = config.getEndpointClass(); Object endpoint = config.getConfigurator().getEndpointInstance(endpointClass); - PathSpec pathSpec = hsreq.getRequestPathSpec(); - if (pathSpec instanceof WebSocketPathSpec) - { - // We have a PathParam path spec - WebSocketPathSpec wspathSpec = (WebSocketPathSpec)pathSpec; - String requestPath = req.getRequestPath(); - // Wrap the config with the path spec information - config = new PathParamServerEndpointConfig(config,wspathSpec,requestPath); - } return new EndpointInstance(endpoint,config,metadata); } catch (InstantiationException e)