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) {
            }
          }
          if (draft == null) {
            close(CloseFrame.PROTOCOL_ERROR,"no draft matches");
          }
          return false;
        }
 else {
          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);
    }
 else {
      tmpHandshakeBytes.position(tmpHandshakeBytes.limit());
      tmpHandshakeBytes.limit(tmpHandshakeBytes.capacity());
    }
  }
  return false;
}

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 ) { } } if ( draft == null ) { close ( CloseFrame . PROTOCOL_ERROR , "no draft matches" ) ; } return false ; } else { 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 ) ; } else { tmpHandshakeBytes . position ( tmpHandshakeBytes . limit ( ) ) ; tmpHandshakeBytes . limit ( tmpHandshakeBytes . capacity ( ) ) ; } } return false ; }
returns whether the handshake phase has is completed . in case of a broken handshake this will be never the case .
