wsFactory = WebSocketServletFactory.Loader.load(config.getServletContext(), wsPolicy); wsFactory.setCreator((req, resp) -> { ProxyWsClient proxyClient = (ProxyWsClient) req.getHttpServletRequest().getAttribute("teavm.ws.client"); if (proxyClient == null) { return new CodeWsEndpoint(this);
@Override public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) { try { for (String subprotocol : req.getSubProtocols()) { if ("xmpp".equals(subprotocol)) { resp.setAcceptedSubProtocol(subprotocol); return new XmppWebSocket(); } } } catch (Exception e) { Log.warn(MessageFormat.format("Unable to load websocket factory: {0} ({1})", e.getClass().getName(), e.getMessage())); } Log.warn("Failed to create websocket for {}:{} make a request at {}", req.getRemoteAddress(), req.getRemotePort(), req.getRequestPath() ); return null; } });
@Override public Object createWebSocket(ServletUpgradeRequest servletUpgradeRequest, ServletUpgradeResponse servletUpgradeResponse) { final URI requestURI = servletUpgradeRequest.getRequestURI(); final int port = servletUpgradeRequest.getLocalPort(); final JettyWebSocketServer service = portToControllerService.get(port); if (service == null) { throw new RuntimeException("No controller service is bound with port: " + port); } final String path = requestURI.getPath(); final WebSocketMessageRouter router; try { router = service.routers.getRouterOrFail(path); } catch (WebSocketConfigurationException e) { throw new IllegalStateException("Failed to get router due to: " + e, e); } final RoutingWebSocketListener listener = new RoutingWebSocketListener(router) { @Override public void onWebSocketConnect(Session session) { final WebSocketPolicy currentPolicy = session.getPolicy(); currentPolicy.setInputBufferSize(service.configuredPolicy.getInputBufferSize()); currentPolicy.setMaxTextMessageSize(service.configuredPolicy.getMaxTextMessageSize()); currentPolicy.setMaxBinaryMessageSize(service.configuredPolicy.getMaxBinaryMessageSize()); super.onWebSocketConnect(session); } }; return listener; } }
if (!req.getSubProtocols().isEmpty()) { for (String subProtocol : req.getSubProtocols()) { if (subProtocol.startsWith("mqtt")) { requestedProtocol = Protocol.MQTT; socket = new MQTTSocket(HttpTransportUtils.generateWsRemoteAddress(req.getHttpServletRequest())); ((MQTTSocket) socket).setTransportOptions(new HashMap<>(transportOptions)); ((MQTTSocket) socket).setPeerCertificates(req.getCertificates()); resp.setAcceptedSubProtocol(getAcceptedSubProtocol(mqttProtocols, req.getSubProtocols(), "mqtt")); break; case UNKNOWN: socket = new StompSocket(HttpTransportUtils.generateWsRemoteAddress(req.getHttpServletRequest())); ((StompSocket) socket).setPeerCertificates(req.getCertificates()); resp.setAcceptedSubProtocol(getAcceptedSubProtocol(stompProtocols, req.getSubProtocols(), "stomp")); break; default:
@Override public Object createWebSocket(ServletUpgradeRequest servletUpgradeRequest, ServletUpgradeResponse servletUpgradeResponse) { String protocol = null; for (String p : servletUpgradeRequest.getSubProtocols()) { if (p.startsWith("org.granite.gravity")) { protocol = p; HttpSession session = servletUpgradeRequest.getSession(); if (session != null) { ServletGraniteContext.createThreadInstance(gravity.getGraniteConfig(), gravity.getServicesConfig(), else if (servletUpgradeRequest.getCookies() != null) { for (int i = 0; i < servletUpgradeRequest.getCookies().size(); i++) { if ("JSESSIONID".equals(servletUpgradeRequest.getCookies().get(i).getName())) { sessionId = servletUpgradeRequest.getCookies().get(i).getValue(); break; gravity.getGraniteConfig().getSecurityService().prelogin(session, servletUpgradeRequest.getHttpServletRequest(), null); String ctype = servletUpgradeRequest.getHeader("Content-Type"); ContentType contentType = WebSocketUtil.getContentType(ctype, protocol); channel.setContentType(contentType);
if (!"websocket".equalsIgnoreCase(request.getHeader("Upgrade"))) if (!"HTTP/1.1".equals(request.getHttpVersion())) int version = request.getHeaderInt("Sec-WebSocket-Version"); if (version < 0) version = request.getHeaderInt("Sec-WebSocket-Draft"); warn.append("Client ").append(request.getRemoteAddress()); warn.append(" (:").append(request.getRemotePort()); warn.append(") User Agent: "); String ua = request.getHeader("User-Agent"); if (ua == null) extensionStack.negotiate(request.getExtensions()); WebSocketSession session = createSession(request.getRequestURI(), driver, wsConnection); session.setUpgradeRequest(request); request.setServletAttribute(HttpConnection.UPGRADE_CONNECTION_ATTRIBUTE, wsConnection); LOG.debug("Websocket upgrade {} {} {} {}", request.getRequestURI(), version, response.getAcceptedSubProtocol(), wsConnection);
userProperties.put(PROP_LOCAL_ADDRESS,req.getLocalSocketAddress()); userProperties.put(PROP_REMOTE_ADDRESS,req.getRemoteSocketAddress()); userProperties.put(PROP_LOCALES,Collections.list(req.getLocales())); if (!configurator.checkOrigin(req.getOrigin())) List<String> requested = req.getSubProtocols(); String subprotocol = configurator.getNegotiatedSubprotocol(supported,requested); if (StringUtil.isNotBlank(subprotocol)) for (ExtensionConfig reqCfg : req.getExtensions()) String requestPath = req.getRequestPath();
@Override public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) { // Borrow WebSocket sub-protocols as input for channels and filters, // which are at position 0 and 1 in the sub-protocols array MetricWebSocket socket = new MetricWebSocket(req.getSubProtocols().get(0), req.getSubProtocols().get(1), wsConnectionManager); resp.setAcceptedSubProtocol(req.getSubProtocols().get(0)); return socket; }
private static String getHeaderOrParameter(ServletUpgradeRequest servletUpgradeRequest, String key) { String value = servletUpgradeRequest.getHeader(key); if (value == null) value = servletUpgradeRequest.getHttpServletRequest().getParameter(key); return value; } }
String path = request.getRequestURI().getPath(); if (path == null || !path.startsWith(ColibriWebSocketService.COLIBRI_WS_PATH)) String pwd = getPwd(request.getRequestURI().getQuery()); if (!endpoint.acceptWebSocket(pwd))
@Override public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) { return new ConsoleLogSocket(handler, getJobIdentifier(req.getRequestPath()), socketHealthService, consoleLogCharset); }
@Override public String getOrigin() { return getHeader("Origin"); }
@Override public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) { if (req.getSession() != null) { long userId = (Long) req.getSession().getAttribute(SessionResource.USER_ID_KEY); return new AsyncSocket(userId); } else { return null; } } });
@Override public Map<String, List<String>> getHeaders() { return request.getHeaders(); }
@Override public void doHandshakeResponse(ServletUpgradeRequest request, ServletUpgradeResponse response) throws IOException { String key = request.getHeader("Sec-WebSocket-Key"); if (key == null) { throw new IllegalStateException("Missing request header 'Sec-WebSocket-Key'"); } // build response response.setHeader("Upgrade","WebSocket"); response.addHeader("Connection","Upgrade"); response.addHeader("Sec-WebSocket-Accept",AcceptHash.hashKey(key)); request.complete(); response.setStatusCode(HttpServletResponse.SC_SWITCHING_PROTOCOLS); response.complete(); } }
@OnWebSocketConnect @SuppressWarnings("unused") public void onWebSocketConnect(final Session session) { SocketAddress localAddress = session.getLocalAddress(); SocketAddress remoteAddress = session.getRemoteAddress(); _protocolEngine = _factory.newProtocolEngine(remoteAddress); // Let AMQP do timeout handling session.setIdleTimeout(0); _connectionWrapper = new ConnectionWrapper(session, localAddress, remoteAddress, _protocolEngine, _server.getThreadPool()); if (session.getUpgradeRequest() instanceof ServletUpgradeRequest) { ServletUpgradeRequest upgradeRequest = (ServletUpgradeRequest) session.getUpgradeRequest(); if (upgradeRequest.getCertificates() != null && upgradeRequest.getCertificates().length > 0) { _connectionWrapper.setPeerCertificate(upgradeRequest.getCertificates()[0]); } } _protocolEngine.setNetworkConnection(_connectionWrapper); _protocolEngine.setWorkListener(object -> _server.getThreadPool().execute(() -> _connectionWrapper.doWork())); _activeConnections.add(_connectionWrapper); _idleTimeoutChecker.wakeup(); }
if (!req.getSubProtocols().isEmpty()) { for (String subProtocol : req.getSubProtocols()) { if (subProtocol.startsWith("mqtt")) { requestedProtocol = Protocol.MQTT; socket = new MQTTSocket(HttpTransportUtils.generateWsRemoteAddress(req.getHttpServletRequest())); ((MQTTSocket) socket).setTransportOptions(new HashMap<>(transportOptions)); ((MQTTSocket) socket).setPeerCertificates(req.getCertificates()); resp.setAcceptedSubProtocol(getAcceptedSubProtocol(mqttProtocols, req.getSubProtocols(), "mqtt")); break; case UNKNOWN: socket = new StompSocket(HttpTransportUtils.generateWsRemoteAddress(req.getHttpServletRequest())); ((StompSocket) socket).setPeerCertificates(req.getCertificates()); resp.setAcceptedSubProtocol(getAcceptedSubProtocol(stompProtocols, req.getSubProtocols(), "stomp")); break; default:
@Override public boolean hasSubProtocol(String test) { for (String protocol : getSubProtocols()) { if (protocol.equalsIgnoreCase(test)) { return true; } } return false; }
@Override public URI getRequestURI() { return request.getRequestURI(); }
protected JettyWebSocketAdapter createWebSocketAdapter(ServletUpgradeRequest request) { WebSocketRouter.WebSocketMatch match = findWebSocketRoute(request.getRequestPath()); return new JettyWebSocketAdapter(match.getHandler(), match.getPathParameters()); }