private boolean handleGetMessageBody() {
            final int expectedBytes;
            final int bytesRead;
            try {
                expectedBytes = buffer.remaining();
                bytesRead = channel.read(buffer);
                if (bytesRead == -1) { // EOF
                    currentState = RxThreadStates.RESET;
                    return true;
                } else if (bytesRead < expectedBytes) {
                    // Didn't read the entire header, so wait for more data
                    return false;
                }
            } catch (IOException e) {
                stats.incrementStat(statPrefix + STAT_CONNECTION_FAIL);
                log.info("RxThread: exception caught while reading data",
                        e);
                currentState = RxThreadStates.RESET;
                return false;
            }

            // Check EOM bytes
            if (buffer.get(buffer.position() - 2)
                    == LegacyOCPMessage.OCP_EOM_FIRST_BYTE
                    && buffer.get(buffer.position() - 1)
                    == LegacyOCPMessage.OCP_EOM_SECOND_BYTE) {
                // EOM matched! Reset the buffer for reading.
                buffer.flip();
                currentState = RxThreadStates.PROCESS_MESSAGE;
            } else {
                // EOM didn't match. Reset the buffer to the full capacity and
                // try to regain sync
                buffer.limit(buffer.capacity());
                currentState = RxThreadStates.NO_SYNC;
            }
            return true;
        }