Home / Class/ SmtpRequestEncoder Class — netty Architecture

SmtpRequestEncoder Class — netty Architecture

Architecture documentation for the SmtpRequestEncoder class in SmtpRequestEncoder.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  640fb209_7291_2bea_5631_bccb325c0ab8["SmtpRequestEncoder"]
  6262636a_d4ee_3ab0_23c4_7bc4bd0f1493["SmtpRequestEncoder.java"]
  640fb209_7291_2bea_5631_bccb325c0ab8 -->|defined in| 6262636a_d4ee_3ab0_23c4_7bc4bd0f1493
  b6903b5a_f036_cd9e_d8c5_b0cf8674fcc9["SmtpRequestEncoder()"]
  640fb209_7291_2bea_5631_bccb325c0ab8 -->|method| b6903b5a_f036_cd9e_d8c5_b0cf8674fcc9
  ef91d52f_e8c2_be61_749b_216cafc2d24e["acceptOutboundMessage()"]
  640fb209_7291_2bea_5631_bccb325c0ab8 -->|method| ef91d52f_e8c2_be61_749b_216cafc2d24e
  bdebf017_c4ec_ab04_d0f6_c9c4ebdfc609["encode()"]
  640fb209_7291_2bea_5631_bccb325c0ab8 -->|method| bdebf017_c4ec_ab04_d0f6_c9c4ebdfc609
  d5329265_57f0_6eb0_ac33_6964c34ac0bc["writeParameters()"]
  640fb209_7291_2bea_5631_bccb325c0ab8 -->|method| d5329265_57f0_6eb0_ac33_6964c34ac0bc

Relationship Graph

Source Code

codec-smtp/src/main/java/io/netty/handler/codec/smtp/SmtpRequestEncoder.java lines 33–121

@UnstableApi
public final class SmtpRequestEncoder extends MessageToMessageEncoder<Object> {
    private static final int CRLF_SHORT = ('\r' << 8) | '\n';
    private static final byte SP = ' ';
    private static final ByteBuf DOT_CRLF_BUFFER = LeakPresenceDetector.staticInitializer(() ->
            Unpooled.unreleasableBuffer(Unpooled.directBuffer(3)
                    .writeByte('.').writeByte('\r').writeByte('\n')).asReadOnly());

    private boolean contentExpected;

    public SmtpRequestEncoder() {
        super(Object.class);
    }

    @Override
    public boolean acceptOutboundMessage(Object msg) throws Exception {
        return msg instanceof SmtpRequest || msg instanceof SmtpContent;
    }

    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
        if (msg instanceof SmtpRequest) {
            final SmtpRequest req = (SmtpRequest) msg;
            if (contentExpected) {
                if (req.command().equals(SmtpCommand.RSET)) {
                    contentExpected = false;
                } else {
                    throw new IllegalStateException("SmtpContent expected");
                }
            }
            boolean release = true;
            final ByteBuf buffer = ctx.alloc().buffer();
            try {
                req.command().encode(buffer);
                boolean notEmpty = req.command() != SmtpCommand.EMPTY;
                writeParameters(req.parameters(), buffer, notEmpty);
                ByteBufUtil.writeShortBE(buffer, CRLF_SHORT);
                out.add(buffer);
                release = false;
                if (req.command().isContentExpected()) {
                    contentExpected = true;
                }
            } finally {
                if (release) {
                    buffer.release();
                }
            }
        }

        if (msg instanceof SmtpContent) {
            if (!contentExpected) {
                throw new IllegalStateException("No SmtpContent expected");
            }
            final ByteBuf content = ((SmtpContent) msg).content();
            out.add(content.retain());
            if (msg instanceof LastSmtpContent) {
                out.add(DOT_CRLF_BUFFER.retainedDuplicate());
                contentExpected = false;
            }
        }
    }

    private static void writeParameters(List<CharSequence> parameters, ByteBuf out, boolean commandNotEmpty) {
        if (parameters.isEmpty()) {
            return;
        }
        if (commandNotEmpty) {
            out.writeByte(SP);
        }
        if (parameters instanceof RandomAccess) {
            final int sizeMinusOne = parameters.size() - 1;
            for (int i = 0; i < sizeMinusOne; i++) {
                ByteBufUtil.writeAscii(out, parameters.get(i));
                out.writeByte(SP);
            }
            ByteBufUtil.writeAscii(out, parameters.get(sizeMinusOne));
        } else {
            final Iterator<CharSequence> params = parameters.iterator();
            for (;;) {
                ByteBufUtil.writeAscii(out, params.next());
                if (params.hasNext()) {

Frequently Asked Questions

What is the SmtpRequestEncoder class?
SmtpRequestEncoder is a class in the netty codebase, defined in codec-smtp/src/main/java/io/netty/handler/codec/smtp/SmtpRequestEncoder.java.
Where is SmtpRequestEncoder defined?
SmtpRequestEncoder is defined in codec-smtp/src/main/java/io/netty/handler/codec/smtp/SmtpRequestEncoder.java at line 33.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free