1
18 package io.undertow.websockets.jsr;
19
20 import io.undertow.servlet.api.InstanceFactory;
21 import io.undertow.servlet.api.InstanceHandle;
22 import io.undertow.servlet.handlers.ServletRequestContext;
23 import io.undertow.servlet.util.ImmediateInstanceHandle;
24 import io.undertow.websockets.WebSocketConnectionCallback;
25 import io.undertow.websockets.core.WebSocketChannel;
26 import io.undertow.websockets.jsr.annotated.AnnotatedEndpoint;
27 import io.undertow.websockets.jsr.handshake.HandshakeUtil;
28 import io.undertow.websockets.spi.WebSocketHttpExchange;
29 import org.xnio.IoUtils;
30
31 import javax.servlet.http.HttpServletRequest;
32 import javax.websocket.Endpoint;
33 import javax.websocket.Extension;
34 import javax.websocket.server.ServerEndpointConfig;
35 import java.net.URI;
36 import java.security.Principal;
37 import java.util.Collections;
38
39
45 public final class EndpointSessionHandler implements WebSocketConnectionCallback {
46 private final ServerWebSocketContainer container;
47
48 public EndpointSessionHandler(ServerWebSocketContainer container) {
49 this.container = container;
50 }
51
52
55 ServerWebSocketContainer getContainer() {
56 return container;
57 }
58
59 @Override
60 public void onConnect(WebSocketHttpExchange exchange, WebSocketChannel channel) {
61 ConfiguredServerEndpoint config = HandshakeUtil.getConfig(channel);
62 try {
63 if(container.isClosed()) {
64
65 channel.sendClose();
66 channel.resumeReceives();
67 return;
68 }
69 InstanceFactory<?> endpointFactory = config.getEndpointFactory();
70 ServerEndpointConfig.Configurator configurator = config.getEndpointConfiguration().getConfigurator();
71 final InstanceHandle<?> instance;
72 DefaultContainerConfigurator.setCurrentInstanceFactory(endpointFactory);
73 final Object instanceFromConfigurator = configurator.getEndpointInstance(config.getEndpointConfiguration().getEndpointClass());
74 final InstanceHandle<?> factoryInstance = DefaultContainerConfigurator.clearCurrentInstanceFactory();
75 if (factoryInstance == null) {
76 instance = new ImmediateInstanceHandle<>(instanceFromConfigurator);
77 } else if (factoryInstance.getInstance() == instanceFromConfigurator) {
78 instance = factoryInstance;
79 } else {
80
81 instance = new InstanceHandle<Object>() {
82 @Override
83 public Object getInstance() {
84 return instanceFromConfigurator;
85 }
86
87 @Override
88 public void release() {
89 factoryInstance.release();
90 }
91 };
92 }
93
94 ServletRequestContext src = exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY);
95 Principal principal = exchange.getAttachment(HandshakeUtil.PRINCIPAL);
96 if(principal == null) {
97 if(src.getServletRequest() instanceof HttpServletRequest) {
98 principal = ((HttpServletRequest)src.getServletRequest()).getUserPrincipal();
99 } else {
100 principal = src.getOriginalRequest().getUserPrincipal();
101 }
102 }
103 final InstanceHandle<Endpoint> endpointInstance;
104 if(config.getAnnotatedEndpointFactory() != null) {
105 final AnnotatedEndpoint annotated = config.getAnnotatedEndpointFactory().createInstance(instance);
106 endpointInstance = new InstanceHandle<Endpoint>() {
107 @Override
108 public Endpoint getInstance() {
109 return annotated;
110 }
111
112 @Override
113 public void release() {
114 instance.release();
115 }
116 };
117 } else {
118 endpointInstance = (InstanceHandle<Endpoint>) instance;
119 }
120
121 UndertowSession session = new UndertowSession(channel, URI.create(exchange.getRequestURI()), exchange.getAttachment(HandshakeUtil.PATH_PARAMS), exchange.getRequestParameters(), this, principal, endpointInstance, config.getEndpointConfiguration(), exchange.getQueryString(), config.getEncodingFactory().createEncoding(config.getEndpointConfiguration()), config, channel.getSubProtocol(), Collections.<Extension>emptyList(), null);
122 config.addOpenSession(session);
123
124 session.setMaxBinaryMessageBufferSize(getContainer().getDefaultMaxBinaryMessageBufferSize());
125 session.setMaxTextMessageBufferSize(getContainer().getDefaultMaxTextMessageBufferSize());
126 session.setMaxIdleTimeout(getContainer().getDefaultMaxSessionIdleTimeout());
127 session.getAsyncRemote().setSendTimeout(getContainer().getDefaultAsyncSendTimeout());
128 try {
129 endpointInstance.getInstance().onOpen(session, config.getEndpointConfiguration());
130 } catch (Exception e) {
131 endpointInstance.getInstance().onError(session, e);
132 IoUtils.safeClose(session);
133 }
134 channel.resumeReceives();
135 } catch (Exception e) {
136 JsrWebSocketLogger.REQUEST_LOGGER.endpointCreationFailed(e);
137 IoUtils.safeClose(channel);
138 }
139 }
140 }
141