/** * Process server response: * * <pre> * HTTP/1.1 101 WebSocket Protocol Handshake * Upgrade: WebSocket * Connection: Upgrade * Sec-WebSocket-Origin: http://example.com * Sec-WebSocket-Location: ws://example.com/demo * Sec-WebSocket-Protocol: sample * * 8jKS'y:G*Co,Wxa- * </pre> * * @param ctx Channel context * @param response HTTP response returned from the server for the request sent by * beginOpeningHandshake00(). * @throws WebSocketHandshakeException */ @Override public void performClosingHandshake(ChannelHandlerContext ctx, HttpResponse response) throws WebSocketHandshakeException { final HttpResponseStatus status = new HttpResponseStatus(101, "WebSocket Protocol Handshake"); if (!response.getStatus().equals(status)) { throw new WebSocketHandshakeException( "Invalid handshake response status: " + response.getStatus()); } String upgrade = response.getHeader(Names.UPGRADE); if (upgrade == null || !upgrade.equals(Values.WEBSOCKET)) { throw new WebSocketHandshakeException( "Invalid handshake response upgrade: " + response.getHeader(Names.UPGRADE)); } String connection = response.getHeader(Names.CONNECTION); if (connection == null || !connection.equals(Values.UPGRADE)) { throw new WebSocketHandshakeException( "Invalid handshake response connection: " + response.getHeader(Names.CONNECTION)); } byte[] challenge = response.getContent().array(); if (!Arrays.equals(challenge, expectedChallengeResponseBytes)) { throw new WebSocketHandshakeException("Invalid challenge"); } String protocol = response.getHeader(Names.SEC_WEBSOCKET_PROTOCOL); this.setSubProtocolResponse(protocol); ctx.getPipeline().replace("decoder", "ws-decoder", new WebSocket00FrameDecoder()); this.setOpenningHandshakeCompleted(true); }
public static String extractCookie(HttpResponse response) { if (response.containsHeader(HttpHeaders.Names.SET_COOKIE)) { return response.getHeader(HttpHeaders.Names.SET_COOKIE); } return null; }