Search in sources :

Example 1 with ServerHandshakeBuilder

use of org.java_websocket.handshake.ServerHandshakeBuilder in project quorrabot by GloriousEggroll.

the class WebSocketImpl method decodeHandshake.

/**
     * Returns whether the handshake phase has is completed. In case of a broken
     * handshake this will be never the case.
	 *
     */
private boolean decodeHandshake(ByteBuffer socketBufferNew) {
    ByteBuffer socketBuffer;
    if (tmpHandshakeBytes.capacity() == 0) {
        socketBuffer = socketBufferNew;
    } else {
        if (tmpHandshakeBytes.remaining() < socketBufferNew.remaining()) {
            ByteBuffer buf = ByteBuffer.allocate(tmpHandshakeBytes.capacity() + socketBufferNew.remaining());
            tmpHandshakeBytes.flip();
            buf.put(tmpHandshakeBytes);
            tmpHandshakeBytes = buf;
        }
        tmpHandshakeBytes.put(socketBufferNew);
        tmpHandshakeBytes.flip();
        socketBuffer = tmpHandshakeBytes;
    }
    socketBuffer.mark();
    try {
        if (draft == null) {
            HandshakeState isflashedgecase = isFlashEdgeCase(socketBuffer);
            if (isflashedgecase == HandshakeState.MATCHED) {
                try {
                    write(ByteBuffer.wrap(Charsetfunctions.utf8Bytes(wsl.getFlashPolicy(this))));
                    close(CloseFrame.FLASHPOLICY, "");
                } catch (InvalidDataException e) {
                    close(CloseFrame.ABNORMAL_CLOSE, "remote peer closed connection before flashpolicy could be transmitted", true);
                }
                return false;
            }
        }
        HandshakeState handshakestate = null;
        try {
            if (role == Role.SERVER) {
                if (draft == null) {
                    for (Draft d : knownDrafts) {
                        d = d.copyInstance();
                        try {
                            d.setParseMode(role);
                            socketBuffer.reset();
                            Handshakedata tmphandshake = d.translateHandshake(socketBuffer);
                            if (tmphandshake instanceof ClientHandshake == false) {
                                flushAndClose(CloseFrame.PROTOCOL_ERROR, "wrong http function", false);
                                return false;
                            }
                            ClientHandshake handshake = (ClientHandshake) tmphandshake;
                            handshakestate = d.acceptHandshakeAsServer(handshake);
                            if (handshakestate == HandshakeState.MATCHED) {
                                resourceDescriptor = handshake.getResourceDescriptor();
                                ServerHandshakeBuilder response;
                                try {
                                    response = wsl.onWebsocketHandshakeReceivedAsServer(this, d, handshake);
                                } catch (InvalidDataException e) {
                                    flushAndClose(e.getCloseCode(), e.getMessage(), false);
                                    return false;
                                } catch (RuntimeException e) {
                                    wsl.onWebsocketError(this, e);
                                    flushAndClose(CloseFrame.NEVER_CONNECTED, e.getMessage(), false);
                                    return false;
                                }
                                write(d.createHandshake(d.postProcessHandshakeResponseAsServer(handshake, response), role));
                                draft = d;
                                open(handshake);
                                return true;
                            }
                        } catch (InvalidHandshakeException e) {
                        // go on with an other draft
                        }
                    }
                    if (draft == null) {
                        close(CloseFrame.PROTOCOL_ERROR, "no draft matches");
                    }
                    return false;
                } else {
                    // special case for multiple step handshakes
                    Handshakedata tmphandshake = draft.translateHandshake(socketBuffer);
                    if (tmphandshake instanceof ClientHandshake == false) {
                        flushAndClose(CloseFrame.PROTOCOL_ERROR, "wrong http function", false);
                        return false;
                    }
                    ClientHandshake handshake = (ClientHandshake) tmphandshake;
                    handshakestate = draft.acceptHandshakeAsServer(handshake);
                    if (handshakestate == HandshakeState.MATCHED) {
                        open(handshake);
                        return true;
                    } else {
                        close(CloseFrame.PROTOCOL_ERROR, "the handshake did finaly not match");
                    }
                    return false;
                }
            } else if (role == Role.CLIENT) {
                draft.setParseMode(role);
                Handshakedata tmphandshake = draft.translateHandshake(socketBuffer);
                if (tmphandshake instanceof ServerHandshake == false) {
                    flushAndClose(CloseFrame.PROTOCOL_ERROR, "wrong http function", false);
                    return false;
                }
                ServerHandshake handshake = (ServerHandshake) tmphandshake;
                handshakestate = draft.acceptHandshakeAsClient(handshakerequest, handshake);
                if (handshakestate == HandshakeState.MATCHED) {
                    try {
                        wsl.onWebsocketHandshakeReceivedAsClient(this, handshakerequest, handshake);
                    } catch (InvalidDataException e) {
                        flushAndClose(e.getCloseCode(), e.getMessage(), false);
                        return false;
                    } catch (RuntimeException e) {
                        wsl.onWebsocketError(this, e);
                        flushAndClose(CloseFrame.NEVER_CONNECTED, e.getMessage(), false);
                        return false;
                    }
                    open(handshake);
                    return true;
                } else {
                    close(CloseFrame.PROTOCOL_ERROR, "draft " + draft + " refuses handshake");
                }
            }
        } catch (InvalidHandshakeException e) {
            close(e);
        }
    } catch (IncompleteHandshakeException e) {
        if (tmpHandshakeBytes.capacity() == 0) {
            socketBuffer.reset();
            int newsize = e.getPreferedSize();
            if (newsize == 0) {
                newsize = socketBuffer.capacity() + 16;
            } else {
                assert (e.getPreferedSize() >= socketBuffer.remaining());
            }
            tmpHandshakeBytes = ByteBuffer.allocate(newsize);
            tmpHandshakeBytes.put(socketBufferNew);
        // tmpHandshakeBytes.flip();
        } else {
            tmpHandshakeBytes.position(tmpHandshakeBytes.limit());
            tmpHandshakeBytes.limit(tmpHandshakeBytes.capacity());
        }
    }
    return false;
}
Also used : HandshakeState(org.java_websocket.drafts.Draft.HandshakeState) Draft(org.java_websocket.drafts.Draft) ServerHandshake(org.java_websocket.handshake.ServerHandshake) Handshakedata(org.java_websocket.handshake.Handshakedata) IncompleteHandshakeException(org.java_websocket.exceptions.IncompleteHandshakeException) InvalidDataException(org.java_websocket.exceptions.InvalidDataException) ServerHandshakeBuilder(org.java_websocket.handshake.ServerHandshakeBuilder) InvalidHandshakeException(org.java_websocket.exceptions.InvalidHandshakeException) ClientHandshake(org.java_websocket.handshake.ClientHandshake) ByteBuffer(java.nio.ByteBuffer)

Example 2 with ServerHandshakeBuilder

use of org.java_websocket.handshake.ServerHandshakeBuilder in project quorrabot by GloriousEggroll.

the class Draft method translateHandshakeHttp.

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);
    }
    // eg. HTTP/1.1 101 Switching the Protocols
    String[] firstLineTokens = line.split(" ", 3);
    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;
}
Also used : HandshakeImpl1Server(org.java_websocket.handshake.HandshakeImpl1Server) IncompleteHandshakeException(org.java_websocket.exceptions.IncompleteHandshakeException) ClientHandshakeBuilder(org.java_websocket.handshake.ClientHandshakeBuilder) HandshakeBuilder(org.java_websocket.handshake.HandshakeBuilder) ServerHandshakeBuilder(org.java_websocket.handshake.ServerHandshakeBuilder) InvalidHandshakeException(org.java_websocket.exceptions.InvalidHandshakeException) ServerHandshakeBuilder(org.java_websocket.handshake.ServerHandshakeBuilder) HandshakeImpl1Client(org.java_websocket.handshake.HandshakeImpl1Client) ClientHandshakeBuilder(org.java_websocket.handshake.ClientHandshakeBuilder)

Aggregations

IncompleteHandshakeException (org.java_websocket.exceptions.IncompleteHandshakeException)2 InvalidHandshakeException (org.java_websocket.exceptions.InvalidHandshakeException)2 ServerHandshakeBuilder (org.java_websocket.handshake.ServerHandshakeBuilder)2 ByteBuffer (java.nio.ByteBuffer)1 Draft (org.java_websocket.drafts.Draft)1 HandshakeState (org.java_websocket.drafts.Draft.HandshakeState)1 InvalidDataException (org.java_websocket.exceptions.InvalidDataException)1 ClientHandshake (org.java_websocket.handshake.ClientHandshake)1 ClientHandshakeBuilder (org.java_websocket.handshake.ClientHandshakeBuilder)1 HandshakeBuilder (org.java_websocket.handshake.HandshakeBuilder)1 HandshakeImpl1Client (org.java_websocket.handshake.HandshakeImpl1Client)1 HandshakeImpl1Server (org.java_websocket.handshake.HandshakeImpl1Server)1 Handshakedata (org.java_websocket.handshake.Handshakedata)1 ServerHandshake (org.java_websocket.handshake.ServerHandshake)1