public static HandshakeBuilder translateHandshakeHttp(ByteBuffer buf, Role role) throws InvalidHandshakeException, IncompleteHandshakeException { HandshakeBuilder handshake; String line = readStringLine(buf); if (line == null) throw new IncompleteHandshakeException(buf.capacity() + 128); String[] firstLineTokens = line.split(" ", 3); // eg. HTTP/1.1 101 Switching the Protocols if (firstLineTokens.length != 3) { throw new InvalidHandshakeException(); } if (role == Role.CLIENT) { // translating/parsing the response from the SERVER handshake = new HandshakeImpl1Server(); ServerHandshakeBuilder serverhandshake = (ServerHandshakeBuilder) handshake; serverhandshake.setHttpStatus(Short.parseShort(firstLineTokens[1])); serverhandshake.setHttpStatusMessage(firstLineTokens[2]); } else { // translating/parsing the request from the CLIENT ClientHandshakeBuilder clienthandshake = new HandshakeImpl1Client(); clienthandshake.setResourceDescriptor(firstLineTokens[1]); handshake = clienthandshake; } line = readStringLine(buf); while (line != null && line.length() > 0) { String[] pair = line.split(":", 2); if (pair.length != 2) throw new InvalidHandshakeException("not an http header"); handshake.put(pair[0], pair[1].replaceFirst("^ +", "")); line = readStringLine(buf); } if (line == null) throw new IncompleteHandshakeException(); return handshake; }
@Override public ClientHandshakeBuilder postProcessHandshakeRequestAsClient( ClientHandshakeBuilder request) { request.put("Upgrade", "websocket"); request.put("Connection", "Upgrade"); // to respond to a Connection keep alives request.put("Sec-WebSocket-Version", "8"); byte[] random = new byte[16]; reuseableRandom.nextBytes(random); request.put("Sec-WebSocket-Key", Base64.encodeBytes(random)); return request; }