1
18
19 package io.undertow.websockets.jsr;
20
21 import io.undertow.protocols.ssl.UndertowXnioSsl;
22 import org.xnio.OptionMap;
23 import org.xnio.XnioWorker;
24 import org.xnio.ssl.XnioSsl;
25
26 import javax.net.ssl.SSLContext;
27 import javax.websocket.ClientEndpointConfig;
28 import javax.websocket.Endpoint;
29 import java.net.URI;
30
31
42 public class DefaultWebSocketClientSslProvider implements WebsocketClientSslProvider {
43
44 public static final String SSL_CONTEXT = "io.undertow.websocket.SSL_CONTEXT";
45
46 private static final ThreadLocal<SSLContext> LOCAL_SSL_CONTEXT = new ThreadLocal<>();
47
48 @Override
49 public XnioSsl getSsl(XnioWorker worker, Class<?> annotatedEndpoint, URI uri) {
50 return getThreadLocalSsl(worker);
51 }
52
53 @Override
54 public XnioSsl getSsl(XnioWorker worker, Object annotatedEndpointInstance, URI uri) {
55 return getThreadLocalSsl(worker);
56 }
57
58 @Override
59 public XnioSsl getSsl(XnioWorker worker, Endpoint endpoint, ClientEndpointConfig cec, URI uri) {
60 XnioSsl ssl = getThreadLocalSsl(worker);
61 if(ssl != null) {
62 return ssl;
63 }
64
65 SSLContext sslContext = (SSLContext) cec.getUserProperties().get(SSL_CONTEXT);
66
67 if (sslContext != null) {
68 return new UndertowXnioSsl(worker.getXnio(), OptionMap.EMPTY, sslContext);
69 }
70 return null;
71 }
72
73 public static void setSslContext(final SSLContext context) {
74 LOCAL_SSL_CONTEXT.set(context);
75 }
76 private XnioSsl getThreadLocalSsl(XnioWorker worker) {
77 SSLContext val = LOCAL_SSL_CONTEXT.get();
78 if (val != null) {
79 LOCAL_SSL_CONTEXT.remove();
80 return new UndertowXnioSsl(worker.getXnio(), OptionMap.EMPTY, val);
81 }
82 return null;
83 }
84
85 }
86