/** * Client-side handshake. * * @param webSocketRequest request representation to be modified for use as WebSocket handshake request. * @return handshake instance. */ public static Handshake createClientHandshake(RequestContext webSocketRequest) { final Handshake handshake = new Handshake(); handshake.request = webSocketRequest; handshake.secKey = new SecKey(); return handshake; }
public SecKey() { secKey = create(); }
/** * Validate provided server key. * * @param serverKey server key to be validated. * @throws HandshakeException when the server key is invalid. */ public void validateServerKey(String serverKey) throws HandshakeException { final SecKey key = generateServerKey(this); if (!key.getSecKey().equals(serverKey)) { throw new HandshakeException(LocalizationMessages.SEC_KEY_INVALID_SERVER()); } } }
/** * Generate server-side security key, which gets passed to the client during * the handshake phase as part of message payload. * * @param clientKey client's Sec-WebSocket-Key * @return server key. */ public static SecKey generateServerKey(SecKey clientKey) throws HandshakeException { String key = clientKey.getSecKey() + UpgradeRequest.SERVER_KEY_HASH; final MessageDigest instance; try { instance = MessageDigest.getInstance("SHA-1"); instance.update(key.getBytes("UTF-8")); final byte[] digest = instance.digest(); if (digest.length != 20) { throw new HandshakeException(LocalizationMessages.SEC_KEY_INVALID_LENGTH(digest.length)); } return new SecKey(Base64.getEncoder().encodeToString(digest)); } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { throw new HandshakeException(e.getMessage()); } }
handshake.extensions = TyrusExtension.fromHeaders(value); handshake.secKey = SecKey.generateServerKey(new SecKey(request.getHeader(HandshakeRequest.SEC_WEBSOCKET_KEY)));
/** * Client side only - validate server response. * * @param response response to be validated. * @throws HandshakeException when HTTP Status of received response is not 101 - Switching protocols. */ public void validateServerResponse(UpgradeResponse response) throws HandshakeException { if (RESPONSE_CODE_VALUE != response.getStatus()) { throw new HandshakeException(response.getStatus(), LocalizationMessages .INVALID_RESPONSE_CODE(RESPONSE_CODE_VALUE, response.getStatus())); } checkForHeader(response.getFirstHeaderValue(UpgradeRequest.UPGRADE), UpgradeRequest.UPGRADE, UpgradeRequest.WEBSOCKET); checkForHeader(response.getFirstHeaderValue(UpgradeRequest.CONNECTION), UpgradeRequest.CONNECTION, UpgradeRequest.UPGRADE); // if (!getSubProtocols().isEmpty()) { // checkForHeader(response.getHeaders(), WebSocketEngine.SEC_WS_PROTOCOL_HEADER, // WebSocketEngine.SEC_WS_PROTOCOL_HEADER); // } secKey.validateServerKey(response.getFirstHeaderValue(HandshakeResponse.SEC_WEBSOCKET_ACCEPT)); }
/** * Client side only - compose the {@link UpgradeRequest} and store it for further use. * * @return composed {@link UpgradeRequest}. */ public UpgradeRequest prepareRequest() { Map<String, List<String>> requestHeaders = request.getHeaders(); updateHostAndOrigin(request); requestHeaders.put(UpgradeRequest.CONNECTION, Collections.singletonList(UpgradeRequest.UPGRADE)); requestHeaders.put(UpgradeRequest.UPGRADE, Collections.singletonList(UpgradeRequest.WEBSOCKET)); requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_KEY, Collections.singletonList(secKey.toString())); requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_VERSION, Collections.singletonList(VERSION)); if (!subProtocols.isEmpty()) { requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_PROTOCOL, Collections.singletonList(Utils.getHeaderFromList(subProtocols, null))); } if (!extensions.isEmpty()) { requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_EXTENSIONS, Collections.singletonList( Utils.getHeaderFromList(extensions, new Utils.Stringifier<Extension>() { @Override String toString(Extension extension) { return TyrusExtension.toString(extension); } })) ); } return request; }
response.getHeaders().put(UpgradeRequest.CONNECTION, Arrays.asList(UpgradeRequest.UPGRADE)); response.setReasonPhrase(UpgradeRequest.RESPONSE_CODE_MESSAGE); response.getHeaders().put(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, Arrays.asList(secKey.getSecKey()));
/** * Generate server-side security key, which gets passed to the client during * the handshake phase as part of message payload. * * @param clientKey client's Sec-WebSocket-Key * @return server key. */ public static SecKey generateServerKey(SecKey clientKey) throws HandshakeException { String key = clientKey.getSecKey() + UpgradeRequest.SERVER_KEY_HASH; final MessageDigest instance; try { instance = MessageDigest.getInstance("SHA-1"); instance.update(key.getBytes("UTF-8")); final byte[] digest = instance.digest(); if (digest.length != 20) { throw new HandshakeException(LocalizationMessages.SEC_KEY_INVALID_LENGTH(digest.length)); } return new SecKey(Base64.getEncoder().encodeToString(digest)); } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { throw new HandshakeException(e.getMessage()); } }
handshake.extensions = TyrusExtension.fromHeaders(value); handshake.secKey = SecKey.generateServerKey(new SecKey(request.getHeader(HandshakeRequest.SEC_WEBSOCKET_KEY)));
/** * Client side only - validate server response. * * @param response response to be validated. * @throws HandshakeException when HTTP Status of received response is not 101 - Switching protocols. */ public void validateServerResponse(UpgradeResponse response) throws HandshakeException { if (RESPONSE_CODE_VALUE != response.getStatus()) { throw new HandshakeException(response.getStatus(), LocalizationMessages .INVALID_RESPONSE_CODE(RESPONSE_CODE_VALUE, response.getStatus())); } checkForHeader(response.getFirstHeaderValue(UpgradeRequest.UPGRADE), UpgradeRequest.UPGRADE, UpgradeRequest.WEBSOCKET); checkForHeader(response.getFirstHeaderValue(UpgradeRequest.CONNECTION), UpgradeRequest.CONNECTION, UpgradeRequest.UPGRADE); // if (!getSubProtocols().isEmpty()) { // checkForHeader(response.getHeaders(), WebSocketEngine.SEC_WS_PROTOCOL_HEADER, // WebSocketEngine.SEC_WS_PROTOCOL_HEADER); // } secKey.validateServerKey(response.getFirstHeaderValue(HandshakeResponse.SEC_WEBSOCKET_ACCEPT)); }
/** * Client side only - compose the {@link UpgradeRequest} and store it for further use. * * @return composed {@link UpgradeRequest}. */ public UpgradeRequest prepareRequest() { Map<String, List<String>> requestHeaders = request.getHeaders(); updateHostAndOrigin(request); requestHeaders.put(UpgradeRequest.CONNECTION, Collections.singletonList(UpgradeRequest.UPGRADE)); requestHeaders.put(UpgradeRequest.UPGRADE, Collections.singletonList(UpgradeRequest.WEBSOCKET)); requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_KEY, Collections.singletonList(secKey.toString())); requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_VERSION, Collections.singletonList(VERSION)); if (!subProtocols.isEmpty()) { requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_PROTOCOL, Collections.singletonList(Utils.getHeaderFromList(subProtocols, null))); } if (!extensions.isEmpty()) { requestHeaders.put(HandshakeRequest.SEC_WEBSOCKET_EXTENSIONS, Collections.singletonList( Utils.getHeaderFromList(extensions, new Utils.Stringifier<Extension>() { @Override String toString(Extension extension) { return TyrusExtension.toString(extension); } })) ); } return request; }
response.getHeaders().put(UpgradeRequest.CONNECTION, Arrays.asList(UpgradeRequest.UPGRADE)); response.setReasonPhrase(UpgradeRequest.RESPONSE_CODE_MESSAGE); response.getHeaders().put(HandshakeResponse.SEC_WEBSOCKET_ACCEPT, Arrays.asList(secKey.getSecKey()));
/** * Validate provided server key. * * @param serverKey server key to be validated. * @throws HandshakeException when the server key is invalid. */ public void validateServerKey(String serverKey) throws HandshakeException { final SecKey key = generateServerKey(this); if (!key.getSecKey().equals(serverKey)) { throw new HandshakeException(LocalizationMessages.SEC_KEY_INVALID_SERVER()); } } }
/** * Client-side handshake. * * @param webSocketRequest request representation to be modified for use as WebSocket handshake request. * @return handshake instance. */ public static Handshake createClientHandshake(RequestContext webSocketRequest) { final Handshake handshake = new Handshake(); handshake.request = webSocketRequest; handshake.secKey = new SecKey(); return handshake; }
public SecKey() { secKey = create(); }