@Override public Mono<Void> execute(URI url, HttpHeaders requestHeaders, WebSocketHandler handler) { return getHttpClient() .headers(nettyHeaders -> setNettyHeaders(requestHeaders, nettyHeaders)) .websocket(StringUtils.collectionToCommaDelimitedString(handler.getSubProtocols())) .uri(url.toString()) .handle((inbound, outbound) -> { HttpHeaders responseHeaders = toHttpHeaders(inbound); String protocol = responseHeaders.getFirst("Sec-WebSocket-Protocol"); HandshakeInfo info = new HandshakeInfo(url, responseHeaders, Mono.empty(), protocol); NettyDataBufferFactory factory = new NettyDataBufferFactory(outbound.alloc()); WebSocketSession session = new ReactorNettyWebSocketSession(inbound, outbound, info, factory); if (logger.isDebugEnabled()) { logger.debug("Started session '" + session.getId() + "' for " + url); } return handler.handle(session); }) .doOnRequest(n -> { if (logger.isDebugEnabled()) { logger.debug("Connecting to " + url); } }) .next(); }
@Override public Mono<Void> handle(WebSocketSession session) { session.receive().doFinally(sig -> { Long wampSessionId = this.webSocketId2WampSessionId.get(session.getId()); if (wampSessionId != null) { this.applicationEventPublisher.publishEvent( new WampDisconnectEvent(wampSessionId, session.getId(), session.getHandshakeInfo().getPrincipal().block())); this.webSocketId2WampSessionId.remove(session.getId()); } session.close(); // ? }).subscribe(inMsg -> { handleIncomingMessage(inMsg, session); }); Publisher<Message<Object>> publisher = MessageChannelReactiveUtils .toPublisher(this.clientOutboundChannel); return session.send(Flux.from(publisher) .filter(msg -> resolveSessionId(msg).equals(session.getId())) .map(msg -> handleOutgoingMessage(msg, session))); }
logger.error( "Deserialization failed because no accepted protocol " + inMsg + " in session " + session.getId()); if (logger.isErrorEnabled()) { logger.error("Deserialization failed for message " + inMsg + " in session " + session.getId()); session.getId()); wampMessage.setHeader(WampMessageHeader.PRINCIPAL, session.getHandshakeInfo().getPrincipal().block()); wampMessage.setHeader(WampMessageHeader.WAMP_SESSION_ID, this.webSocketId2WampSessionId.get(session.getId())); this.webSocketId2WampSessionId.put(session.getId(), newWampSessionId); WampError.GOODBYE_AND_OUT); goodbyeMessage.setHeader(WampMessageHeader.WEBSOCKET_SESSION_ID, session.getId()); this.clientOutboundChannel.send(goodbyeMessage); if (logger.isErrorEnabled()) { logger.error( "Failed to parse " + inMsg + " in session " + session.getId(), e);