Beispiel #1
0
  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;
  }