Example usage for org.apache.http.nio.reactor SessionInputBuffer fill

List of usage examples for org.apache.http.nio.reactor SessionInputBuffer fill

Introduction

In this page you can find the example usage for org.apache.http.nio.reactor SessionInputBuffer fill.

Prototype

int fill(ReadableByteChannel src) throws IOException;

Source Link

Document

Makes an attempt to fill the buffer with data from the given ReadableByteChannel .

Usage

From source file:com.ok2c.lightmtp.impl.protocol.SendQuitCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    int bytesRead = buf.fill(iosession.channel());
    SMTPReply reply = this.parser.parse(buf, bytesRead == -1);

    if (reply != null) {
        switch (this.codecState) {
        case QUIT_RESPONSE_EXPECTED:
            iosession.close();// w ww.  j a v a2s.  c  om
            this.codecState = CodecState.COMPLETED;
            sessionState.setReply(reply);
            break;
        default:
            throw new SMTPProtocolException("Unexpected reply: " + reply);
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.SendRsetCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    int bytesRead = buf.fill(iosession.channel());
    SMTPReply reply = this.parser.parse(buf, bytesRead == -1);

    if (reply != null) {
        switch (this.codecState) {
        case RSET_RESPONSE_EXPECTED:
            sessionState.reset(null);/*w  w  w.ja va2 s. c  o  m*/
            sessionState.setReply(reply);
            this.codecState = CodecState.COMPLETED;
            break;
        default:
            throw new SMTPProtocolException("Unexpected reply: " + reply);
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.SimpleSendHeloCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    int bytesRead = buf.fill(iosession.channel());
    SMTPReply reply = this.parser.parse(buf, bytesRead == -1);

    if (reply != null) {
        switch (this.codecState) {
        case SERVICE_READY_EXPECTED:
            if (reply.getCode() == SMTPCodes.SERVICE_READY) {
                this.codecState = CodecState.HELO_READY;
                iosession.setEvent(SelectionKey.OP_WRITE);
            } else {
                this.codecState = CodecState.COMPLETED;
                sessionState.setReply(reply);
            }//from w ww  .j  a  v  a 2  s  .com
            break;
        case HELO_RESPONSE_EXPECTED:
            this.codecState = CodecState.COMPLETED;
            sessionState.setReply(reply);
            break;
        default:
            if (reply.getCode() == SMTPCodes.ERR_TRANS_SERVICE_NOT_AVAILABLE) {
                sessionState.setReply(reply);
                this.codecState = CodecState.COMPLETED;
            } else {
                throw new SMTPProtocolException("Unexpected reply: " + reply);
            }
        }
    } else {
        if (bytesRead == -1 && !sessionState.isTerminated()) {
            throw new UnexpectedEndOfStreamException();
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.TestSMTPInOutBuffers.java

@Test
public void testReadLineChunks() throws Exception {
    SessionInputBuffer inbuf = new SMTPInputBuffer(16, 16);

    ReadableByteChannel channel = newChannel("O\ne\r\nTwo\r\nTh\ree");

    inbuf.fill(channel);

    CharArrayBuffer line = new CharArrayBuffer(64);

    line.clear();//from   w  ww .j  a  va2  s  .com
    Assert.assertTrue(inbuf.readLine(line, false));
    Assert.assertEquals("O", line.toString());
    line.clear();
    Assert.assertTrue(inbuf.readLine(line, false));
    Assert.assertEquals("e", line.toString());

    line.clear();
    Assert.assertTrue(inbuf.readLine(line, false));
    Assert.assertEquals("Two", line.toString());

    line.clear();
    Assert.assertFalse(inbuf.readLine(line, false));

    channel = newChannel("\r\nFour");
    inbuf.fill(channel);

    line.clear();
    Assert.assertTrue(inbuf.readLine(line, false));
    Assert.assertEquals("Th\ree", line.toString());

    inbuf.fill(channel);

    line.clear();
    Assert.assertTrue(inbuf.readLine(line, true));
    Assert.assertEquals("Four", line.toString());

    line.clear();
    Assert.assertFalse(inbuf.readLine(line, true));
}

From source file:com.ok2c.lightmtp.impl.protocol.SendLocalHeloCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    int bytesRead = buf.fill(iosession.channel());
    SMTPReply reply = this.parser.parse(buf, bytesRead == -1);

    if (reply != null) {
        switch (this.codecState) {
        case SERVICE_READY_EXPECTED:
            if (reply.getCode() == SMTPCodes.SERVICE_READY) {
                this.codecState = CodecState.LHLO_READY;
                iosession.setEvent(SelectionKey.OP_WRITE);
            } else {
                this.codecState = CodecState.COMPLETED;
                sessionState.setReply(reply);
            }/*w  ww .j  ava  2  s.c  o  m*/
            break;
        case LHLO_RESPONSE_EXPECTED:
            if (reply.getCode() == SMTPCodes.OK) {

                Set<String> extensions = sessionState.getExtensions();

                List<String> lines = reply.getLines();
                if (lines.size() > 1) {
                    for (int i = 1; i < lines.size(); i++) {
                        String line = lines.get(i);
                        extensions.add(line.toUpperCase(Locale.US));
                    }
                }
            }
            this.codecState = CodecState.COMPLETED;
            sessionState.setReply(reply);
            break;
        default:
            if (reply.getCode() == SMTPCodes.ERR_TRANS_SERVICE_NOT_AVAILABLE) {
                sessionState.setReply(reply);
                this.codecState = CodecState.COMPLETED;
            } else {
                throw new SMTPProtocolException("Unexpected reply: " + reply);
            }
        }
    } else {
        if (bytesRead == -1 && !sessionState.isTerminated()) {
            throw new UnexpectedEndOfStreamException();
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.ExtendedSendHeloCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    int bytesRead = buf.fill(iosession.channel());
    SMTPReply reply = this.parser.parse(buf, bytesRead == -1);

    if (reply != null) {
        switch (this.codecState) {
        case SERVICE_READY_EXPECTED:
            if (reply.getCode() == SMTPCodes.SERVICE_READY) {
                this.codecState = CodecState.EHLO_READY;
                iosession.setEvent(SelectionKey.OP_WRITE);
            } else {
                this.codecState = CodecState.COMPLETED;
                sessionState.setReply(reply);
            }/*from  ww w .j  a  va2s.c om*/
            break;
        case EHLO_RESPONSE_EXPECTED:
            if (reply.getCode() == SMTPCodes.OK) {

                Set<String> extensions = sessionState.getExtensions();

                List<String> lines = reply.getLines();
                if (lines.size() > 1) {
                    for (int i = 1; i < lines.size(); i++) {
                        String line = lines.get(i);
                        extensions.add(line.toUpperCase(Locale.US));
                    }
                }
                this.codecState = CodecState.COMPLETED;
                sessionState.setReply(reply);
            } else if (reply.getCode() == SMTPCodes.ERR_PERM_SYNTAX_ERR_COMMAND) {
                this.codecState = CodecState.HELO_READY;
                iosession.setEvent(SelectionKey.OP_WRITE);
            } else {
                this.codecState = CodecState.COMPLETED;
                sessionState.setReply(reply);
            }
            break;
        case HELO_RESPONSE_EXPECTED:
            this.codecState = CodecState.COMPLETED;
            sessionState.setReply(reply);
            break;
        default:
            if (reply.getCode() == SMTPCodes.ERR_TRANS_SERVICE_NOT_AVAILABLE) {
                sessionState.setReply(reply);
                this.codecState = CodecState.COMPLETED;
            } else {
                throw new SMTPProtocolException("Unexpected reply: " + reply);
            }
        }
    } else {
        if (bytesRead == -1 && !sessionState.isTerminated()) {
            throw new UnexpectedEndOfStreamException();
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.PipeliningReceiveEnvelopCodec.java

@Override
public void consumeData(final IOSession iosession, final ServerState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    synchronized (sessionState) {
        for (;;) {
            int bytesRead = buf.fill(iosession.channel());
            try {
                SMTPCommand command = this.parser.parse(buf, bytesRead == -1);
                if (command == null) {
                    if (bytesRead == -1 && !sessionState.isTerminated() && this.pendingActions.isEmpty()) {
                        throw new UnexpectedEndOfStreamException();
                    } else {
                        break;
                    }/*from   w  w w.  j a v a2  s.  com*/
                }
                Action<ServerState> action = this.commandHandler.handle(command);
                this.pendingActions.add(action);
            } catch (SMTPErrorException ex) {
                SMTPReply reply = new SMTPReply(ex.getCode(), ex.getEnhancedCode(), ex.getMessage());
                this.pendingActions.add(new SimpleAction(reply));
            } catch (SMTPProtocolException ex) {
                SMTPReply reply = new SMTPReply(SMTPCodes.ERR_PERM_SYNTAX_ERR_COMMAND, new SMTPCode(5, 3, 0),
                        ex.getMessage());
                this.pendingActions.add(new SimpleAction(reply));
            }
        }

        if (!this.pendingActions.isEmpty()) {
            iosession.setEvent(SelectionKey.OP_WRITE);
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.PipeliningSendEnvelopCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    while (this.codecState != CodecState.COMPLETED) {
        int bytesRead = buf.fill(iosession.channel());
        SMTPReply reply = this.parser.parse(buf, bytesRead == -1);

        if (reply == null) {
            if (bytesRead == -1 && !sessionState.isTerminated()) {
                throw new UnexpectedEndOfStreamException();
            } else {
                break;
            }/*from   w w w  .jav  a 2s  .  c o  m*/
        }

        switch (this.codecState) {
        case MAIL_RESPONSE_EXPECTED:
            this.codecState = CodecState.RCPT_RESPONSE_EXPECTED;
            if (reply.getCode() != SMTPCodes.OK) {
                this.deliveryFailed = true;
                sessionState.setReply(reply);
            }
            break;
        case RCPT_RESPONSE_EXPECTED:
            String recipient = this.recipients.removeFirst();

            if (reply.getCode() != SMTPCodes.OK) {
                sessionState.getFailures().add(new RcptResult(reply, recipient));
            }
            if (this.recipients.isEmpty()) {
                this.codecState = CodecState.DATA_RESPONSE_EXPECTED;
            }
            break;
        case DATA_RESPONSE_EXPECTED:
            this.codecState = CodecState.COMPLETED;
            if (reply.getCode() != SMTPCodes.START_MAIL_INPUT) {
                this.deliveryFailed = true;
            }
            sessionState.setReply(reply);
            break;
        default:
            if (reply.getCode() == SMTPCodes.ERR_TRANS_SERVICE_NOT_AVAILABLE) {
                sessionState.setReply(reply);
                this.codecState = CodecState.COMPLETED;
            } else {
                throw new SMTPProtocolException("Unexpected reply: " + reply);
            }
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.SendDataCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();

    while (this.codecState != CodecState.COMPLETED) {
        int bytesRead = buf.fill(iosession.channel());

        SMTPReply reply = this.parser.parse(buf, bytesRead == -1);
        if (reply == null) {
            if (bytesRead == -1 && !sessionState.isTerminated()) {
                throw new UnexpectedEndOfStreamException();
            } else {
                break;
            }/*w  w w  .  ja va 2  s  . c  o  m*/
        }

        switch (this.codecState) {
        case CONTENT_RESPONSE_EXPECTED:
            if (this.mode.equals(DataAckMode.PER_RECIPIENT)) {
                String recipient = this.recipients.removeFirst();
                if (reply.getCode() != SMTPCodes.OK) {
                    sessionState.getFailures().add(new RcptResult(reply, recipient));
                }
            }
            if (this.recipients.isEmpty()) {
                this.codecState = CodecState.COMPLETED;
            }
            sessionState.setReply(reply);
            break;
        default:
            throw new SMTPProtocolException("Unexpected reply: " + reply);
        }
    }
}

From source file:com.ok2c.lightmtp.impl.protocol.SimpleSendEnvelopCodec.java

@Override
public void consumeData(final IOSession iosession, final ClientState sessionState)
        throws IOException, SMTPProtocolException {
    Args.notNull(iosession, "IO session");
    Args.notNull(sessionState, "Session state");

    SessionInputBuffer buf = this.iobuffers.getInbuf();
    DeliveryRequest request = sessionState.getRequest();

    int bytesRead = buf.fill(iosession.channel());
    SMTPReply reply = this.parser.parse(buf, bytesRead == -1);

    if (reply != null) {
        switch (this.codecState) {
        case MAIL_RESPONSE_EXPECTED:
            if (reply.getCode() == SMTPCodes.OK) {
                this.codecState = CodecState.RCPT_REQUEST_READY;
                this.recipients.clear();
                this.recipients.addAll(request.getRecipients());
                iosession.setEvent(SelectionKey.OP_WRITE);
            } else {
                this.deliveryFailed = true;
                this.codecState = CodecState.COMPLETED;
                sessionState.setReply(reply);
            }//from  w w w .j  a v  a2s .  co  m
            break;
        case RCPT_RESPONSE_EXPECTED:
            if (this.recipients.isEmpty()) {
                throw new IllegalStateException("Unexpected state: " + this.codecState);
            }
            String recipient = this.recipients.removeFirst();

            if (reply.getCode() != SMTPCodes.OK) {
                sessionState.getFailures().add(new RcptResult(reply, recipient));
            }

            if (this.recipients.isEmpty()) {
                List<String> requested = request.getRecipients();
                List<RcptResult> failured = sessionState.getFailures();
                if (requested.size() > failured.size()) {
                    this.codecState = CodecState.DATA_REQUEST_READY;
                } else {
                    this.deliveryFailed = true;
                    this.codecState = CodecState.COMPLETED;
                    sessionState.setReply(reply);
                }
            } else {
                this.codecState = CodecState.RCPT_REQUEST_READY;
            }
            iosession.setEvent(SelectionKey.OP_WRITE);
            break;
        case DATA_RESPONSE_EXPECTED:
            this.codecState = CodecState.COMPLETED;
            if (reply.getCode() != SMTPCodes.START_MAIL_INPUT) {
                this.deliveryFailed = true;
            }
            sessionState.setReply(reply);
            break;
        default:
            if (reply.getCode() == SMTPCodes.ERR_TRANS_SERVICE_NOT_AVAILABLE) {
                sessionState.setReply(reply);
                this.codecState = CodecState.COMPLETED;
            } else {
                throw new SMTPProtocolException("Unexpected reply: " + reply);
            }
        }
    }

    if (bytesRead == -1 && !sessionState.isTerminated()) {
        throw new UnexpectedEndOfStreamException();
    }
}