@Override public Mono<Void> handle(WebSocketSession session) { String protocol = session.getHandshakeInfo().getSubProtocol(); WebSocketMessage message = session.textMessage(protocol != null ? protocol : "none"); return session.send(Mono.just(message)); } }
private HandshakeInfo createHandshakeInfo(URI url, DefaultNegotiation negotiation) { HttpHeaders responseHeaders = negotiation.getResponseHeaders(); String protocol = responseHeaders.getFirst("Sec-WebSocket-Protocol"); return new HandshakeInfo(url, responseHeaders, Mono.empty(), protocol); }
/** * Create a new WebSocket session. */ protected AbstractWebSocketSession(T delegate, String id, HandshakeInfo info, DataBufferFactory bufferFactory) { Assert.notNull(delegate, "Native session is required."); Assert.notNull(id, "Session id is required."); Assert.notNull(info, "HandshakeInfo is required."); Assert.notNull(bufferFactory, "DataBuffer factory is required."); this.delegate = delegate; this.id = id; this.handshakeInfo = info; this.bufferFactory = bufferFactory; this.attributes.putAll(info.getAttributes()); this.logPrefix = initLogPrefix(info, id); if (logger.isDebugEnabled()) { logger.debug(getLogPrefix() + "Session id \"" + getId() + "\" for " + getHandshakeInfo().getUri()); } }
@Override public Mono<Void> handle(WebSocketSession session) { String protocol = session.getHandshakeInfo().getSubProtocol(); if (!StringUtils.hasText(protocol)) { return Mono.error(new IllegalStateException("Missing protocol")); } List<String> protocols = session.getHandshakeInfo().getHeaders().get(SEC_WEBSOCKET_PROTOCOL); assertThat(protocols).contains("echo-v1,echo-v2"); WebSocketMessage message = session.textMessage(protocol); return doSend(session, Mono.just(message)); } }
ByteBuffer byteBuffer = inMsg.getPayload().asByteBuffer(); String acceptedProtocol = session.getHandshakeInfo().getSubProtocol(); if (acceptedProtocol != null) { if (acceptedProtocol.equals(WampWebSocketHandler.MSGPACK_PROTOCOL)) { session.getId()); wampMessage.setHeader(WampMessageHeader.PRINCIPAL, session.getHandshakeInfo().getPrincipal().block()); wampMessage.setHeader(WampMessageHeader.WAMP_SESSION_ID, this.webSocketId2WampSessionId.get(session.getId()));
@Override public Mono<Void> handle(WebSocketSession session) { HttpHeaders headers = session.getHandshakeInfo().getHeaders(); String payload = "my-header:" + headers.getFirst("my-header"); WebSocketMessage message = session.textMessage(payload); return session.send(Mono.just(message)); } }
@Override public String toString() { return getClass().getSimpleName() + "[id=" + getId() + ", uri=" + getHandshakeInfo().getUri() + "]"; }
@Test public void sessionAttributePredicate() { MockWebSession session = new MockWebSession(); session.getAttributes().put("a1", "v1"); session.getAttributes().put("a2", "v2"); session.getAttributes().put("a3", "v3"); session.getAttributes().put("a4", "v4"); session.getAttributes().put("a5", "v5"); MockServerHttpRequest request = initHandshakeRequest(); MockServerWebExchange exchange = MockServerWebExchange.builder(request).session(session).build(); TestRequestUpgradeStrategy upgradeStrategy = new TestRequestUpgradeStrategy(); HandshakeWebSocketService service = new HandshakeWebSocketService(upgradeStrategy); service.setSessionAttributePredicate(name -> Arrays.asList("a1", "a3", "a5").contains(name)); service.handleRequest(exchange, mock(WebSocketHandler.class)).block(); HandshakeInfo info = upgradeStrategy.handshakeInfo; assertNotNull(info); Map<String, Object> attributes = info.getAttributes(); assertEquals(3, attributes.size()); assertThat(attributes, Matchers.hasEntry("a1", "v1")); assertThat(attributes, Matchers.hasEntry("a3", "v3")); assertThat(attributes, Matchers.hasEntry("a5", "v5")); }
private static String initLogPrefix(HandshakeInfo info, String id) { return info.getLogPrefix() != null ? info.getLogPrefix() : "[" + id + "] "; }
@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))); }
@Test public void subProtocol() throws Exception { String protocol = "echo-v1"; AtomicReference<HandshakeInfo> infoRef = new AtomicReference<>(); MonoProcessor<Object> output = MonoProcessor.create(); this.client.execute(getUrl("/sub-protocol"), new WebSocketHandler() { @Override public List<String> getSubProtocols() { return Collections.singletonList(protocol); } @Override public Mono<Void> handle(WebSocketSession session) { infoRef.set(session.getHandshakeInfo()); return session.receive() .map(WebSocketMessage::getPayloadAsText) .subscribeWith(output) .then(); } }) .block(TIMEOUT); HandshakeInfo info = infoRef.get(); assertThat(info.getHeaders().getFirst("Upgrade"), Matchers.equalToIgnoringCase("websocket")); assertEquals(protocol, info.getHeaders().getFirst("Sec-WebSocket-Protocol")); assertEquals("Wrong protocol accepted", protocol, info.getSubProtocol()); assertEquals("Wrong protocol detected on the server side", protocol, output.block(TIMEOUT)); }
@Override public Mono<Void> handle(WebSocketSession session) { HttpHeaders headers = session.getHandshakeInfo().getHeaders(); if (!headers.containsKey("my-header")) { return Mono.error(new IllegalStateException("Missing my-header")); } String payload = "my-header:" + headers.getFirst("my-header"); WebSocketMessage message = session.textMessage(payload); return doSend(session, Mono.just(message)); } }
@Override public String toString() { return getClass().getSimpleName() + "[id=" + getId() + ", uri=" + getHandshakeInfo().getUri() + "]"; }
assertThat(info.getHeaders().getFirst("Upgrade")) .isEqualToIgnoringCase("websocket"); assertThat(info.getHeaders().getFirst("Sec-WebSocket-Protocol")) .isEqualTo(protocol); assertThat(info.getSubProtocol()) .as("Wrong protocol accepted") .isEqualTo(protocol);
@Override public Mono<Void> handle(WebSocketSession session) { String protocol = session.getHandshakeInfo().getSubProtocol(); WebSocketMessage message = session.textMessage(this.posts.findAll().takeLast(0).toString()); return doSend(session, Mono.just(message)); }
private HandshakeInfo createHandshakeInfo(URI url, DefaultConfigurator configurator) { HttpHeaders responseHeaders = configurator.getResponseHeaders(); String protocol = responseHeaders.getFirst("Sec-WebSocket-Protocol"); return new HandshakeInfo(url, responseHeaders, Mono.empty(), protocol); }
String acceptedProtocol = session.getHandshakeInfo().getSubProtocol(); if (acceptedProtocol != null) { if (acceptedProtocol.equals(WampWebSocketHandler.MSGPACK_PROTOCOL)) {
private HandshakeInfo createHandshakeInfo(URI url, Session jettySession) { HttpHeaders headers = new HttpHeaders(); jettySession.getUpgradeResponse().getHeaders().forEach(headers::put); String protocol = headers.getFirst("Sec-WebSocket-Protocol"); return new HandshakeInfo(url, headers, Mono.empty(), protocol); }
private HandshakeInfo createHandshakeInfo(ServerWebExchange exchange, ServerHttpRequest request, @Nullable String protocol, Map<String, Object> attributes) { URI uri = request.getURI(); // Copy request headers, as they might be pooled and recycled by // the server implementation once the handshake HTTP exchange is done. HttpHeaders headers = new HttpHeaders(); headers.addAll(request.getHeaders()); Mono<Principal> principal = exchange.getPrincipal(); String logPrefix = exchange.getLogPrefix(); InetSocketAddress remoteAddress = request.getRemoteAddress(); return new HandshakeInfo(uri, headers, principal, protocol, remoteAddress, attributes, logPrefix); }
@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(); }