public void processRead()

in core/src/main/java/org/apache/mina/transport/nio/SslHelper.java [240:329]


    public void processRead(AbstractIoSession session, ByteBuffer readBuffer) throws SSLException {
        ByteBuffer tempBuffer;

        if (previous != null) {
            tempBuffer = accumulate(readBuffer);
        } else {
            tempBuffer = readBuffer;
        }

        boolean done = false;
        SSLEngineResult result;
        ByteBuffer appBuffer = ByteBuffer.allocateDirect(sslEngine.getSession().getApplicationBufferSize());

        HandshakeStatus handshakeStatus = sslEngine.getHandshakeStatus();
        while (!done) {
            switch (handshakeStatus) {
            case NEED_UNWRAP:
            case NOT_HANDSHAKING:
            case FINISHED:
                result = sslEngine.unwrap(tempBuffer, appBuffer);
                processResult(session, handshakeStatus, result);

                switch (result.getStatus()) {
                case BUFFER_UNDERFLOW:
                    /* we need more data */
                    done = true;
                    break;
                case BUFFER_OVERFLOW:
                    /* resize output buffer */
                    appBuffer = ByteBuffer.allocateDirect(appBuffer.capacity() * 2);
                    break;
                case OK:
                    if ((handshakeStatus == HandshakeStatus.NOT_HANDSHAKING) && (result.bytesProduced() > 0)) {
                        appBuffer.flip();
                        session.processMessageReceived(appBuffer);
                    }
                    break;
                case CLOSED:
                    break;
                }
                if (sslEngine != null) {
                    handshakeStatus = sslEngine.getHandshakeStatus();
                } else {
                    done = true;
                }
                break;
            case NEED_TASK:
                Runnable task;

                while ((task = sslEngine.getDelegatedTask()) != null) {
                    task.run();
                }
                handshakeStatus = sslEngine.getHandshakeStatus();
                break;
            case NEED_WRAP:
                result = sslEngine.wrap(EMPTY_BUFFER, appBuffer);
                processResult(session, handshakeStatus, result);
                switch (result.getStatus()) {
                case BUFFER_OVERFLOW:
                    appBuffer = ByteBuffer.allocateDirect(appBuffer.capacity() * 2);
                    break;
                case BUFFER_UNDERFLOW:
                    done = true;
                    break;
                case CLOSED:
                case OK:
                    appBuffer.flip();
                    WriteRequest writeRequest = new DefaultWriteRequest(appBuffer);
                    writeRequest.setMessage(appBuffer);
                    writeRequest.setSecureInternal(true);
                    session.enqueueWriteRequest(writeRequest);
                    break;
                }
                if (sslEngine != null) {
                    handshakeStatus = sslEngine.getHandshakeStatus();
                } else {
                    done = true;
                }
            }
            if (handshakeStatus == HandshakeStatus.FINISHED) {
                state = State.CREDENTAILS_AVAILABLE;
            }
        }
        if (tempBuffer.remaining() > 0) {
            previous = duplicate(tempBuffer);
        } else {
            previous = null;
        }
        readBuffer.clear();
    }