| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.websocket.server; |
| |
| import java.io.BufferedReader; |
| import java.io.InputStreamReader; |
| import java.io.OutputStream; |
| import java.net.Socket; |
| import java.nio.charset.StandardCharsets; |
| |
| import org.eclipse.jetty.http.HttpFields; |
| import org.eclipse.jetty.util.B64Code; |
| import org.eclipse.jetty.websocket.server.browser.BrowserDebugTool; |
| import org.junit.After; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| public class WebSocketProtocolTest |
| { |
| private BrowserDebugTool server; |
| |
| @Before |
| public void startServer() throws Exception |
| { |
| server = new BrowserDebugTool(); |
| server.prepare(0); |
| server.start(); |
| } |
| |
| @After |
| public void stopServer() throws Exception |
| { |
| server.stop(); |
| } |
| |
| @Test |
| public void testWebSocketProtocolResponse() throws Exception |
| { |
| try (Socket client = new Socket("localhost", server.getPort())) |
| { |
| byte[] key = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; |
| StringBuilder request = new StringBuilder(); |
| request.append("GET / HTTP/1.1\r\n") |
| .append("Host: localhost\r\n") |
| .append("Connection: Upgrade\r\n") |
| .append("Upgrade: websocket\r\n") |
| .append("Sec-WebSocket-version: 13\r\n") |
| .append("Sec-WebSocket-Key:").append(B64Code.encode(key)).append("\r\n") |
| .append("Sec-WebSocket-Protocol: echo\r\n") |
| .append("\r\n"); |
| |
| OutputStream output = client.getOutputStream(); |
| output.write(request.toString().getBytes(StandardCharsets.UTF_8)); |
| output.flush(); |
| |
| BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream())); |
| String line = input.readLine(); |
| Assert.assertTrue(line.contains(" 101 ")); |
| HttpFields fields = new HttpFields(); |
| while ((line = input.readLine()) != null) |
| { |
| if (line.isEmpty()) |
| break; |
| int colon = line.indexOf(':'); |
| Assert.assertTrue(colon > 0); |
| String name = line.substring(0, colon).trim(); |
| String value = line.substring(colon + 1).trim(); |
| fields.add(name, value); |
| } |
| |
| Assert.assertEquals(1, fields.getValuesList("Sec-WebSocket-Protocol").size()); |
| } |
| } |
| } |