/* * JBoss, Home of Professional Open Source. * Copyright 2014 Red Hat, Inc., and individual contributors * as indicated by the @author tags. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.undertow.websockets.jsr.handshake; import java.security.Principal; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import javax.websocket.Extension; import javax.websocket.server.ServerEndpointConfig; import io.undertow.util.AttachmentKey; import io.undertow.util.Headers; import io.undertow.websockets.core.WebSocketChannel; import io.undertow.websockets.jsr.ConfiguredServerEndpoint; import io.undertow.websockets.spi.WebSocketHttpExchange; /** * Internal util class for handshaking * * @author <a href="mailto:nmaurer@redhat.com">Norman Maurer</a> */ public final class HandshakeUtil { private static final String CONFIG_KEY = "ServerEndpointConfiguration"; public static final AttachmentKey<Map<String, String>> PATH_PARAMS = AttachmentKey.create(Map.class); public static final AttachmentKey<Principal> PRINCIPAL = AttachmentKey.create(Principal.class); private HandshakeUtil() { } /** * Checks the orgin against the */ public static boolean checkOrigin(ServerEndpointConfig config, WebSocketHttpExchange exchange) { ServerEndpointConfig.Configurator c = config.getConfigurator(); return c.checkOrigin(exchange.getRequestHeader(Headers.ORIGIN_STRING)); } /** * Prepare for upgrade */ public static void prepareUpgrade(final ServerEndpointConfig config, final WebSocketHttpExchange exchange) { ExchangeHandshakeRequest request = new ExchangeHandshakeRequest(exchange); ExchangeHandshakeResponse response = new ExchangeHandshakeResponse(exchange); ServerEndpointConfig.Configurator c = config.getConfigurator(); c.modifyHandshake(config, request, response); response.update(); } /** * Set the {@link ConfiguredServerEndpoint} which is used to create the {@link WebSocketChannel}. */ public static void setConfig(WebSocketChannel channel, ConfiguredServerEndpoint config) { channel.setAttribute(CONFIG_KEY, config); } /** * Returns the {@link ConfiguredServerEndpoint} which was used while create the {@link WebSocketChannel}. */ public static ConfiguredServerEndpoint getConfig(WebSocketChannel channel) { return (ConfiguredServerEndpoint) channel.getAttribute(CONFIG_KEY); } static String selectSubProtocol(final ConfiguredServerEndpoint config, final String[] requestedSubprotocolArray) { if (config.getEndpointConfiguration().getConfigurator() != null) { return config.getEndpointConfiguration().getConfigurator().getNegotiatedSubprotocol(config.getEndpointConfiguration().getSubprotocols(), Arrays.asList(requestedSubprotocolArray)); } else { for (final String protocol : config.getEndpointConfiguration().getSubprotocols()) { for (String clientsupported : requestedSubprotocolArray) { if (protocol.equals(clientsupported)) { return protocol; } } } return null; } } static List<Extension> selectExtensions(final ConfiguredServerEndpoint config, final List<Extension> requestedExtensions) { if (config.getEndpointConfiguration().getConfigurator() != null) { return config.getEndpointConfiguration().getConfigurator().getNegotiatedExtensions(config.getExtensions(), requestedExtensions); } else { return Collections.emptyList(); } } }