Author: buildbot Date: Wed Apr 3 11:31:50 2019 New Revision: 1043107 Log: Staging update by buildbot for mina
Modified: websites/staging/mina/trunk/content/ (props changed) websites/staging/mina/trunk/content/mina-project/technical-documentation/message-flow.html Propchange: websites/staging/mina/trunk/content/ ------------------------------------------------------------------------------ --- cms:source-revision (original) +++ cms:source-revision Wed Apr 3 11:31:50 2019 @@ -1 +1 @@ -1856869 +1856870 Modified: websites/staging/mina/trunk/content/mina-project/technical-documentation/message-flow.html ============================================================================== --- websites/staging/mina/trunk/content/mina-project/technical-documentation/message-flow.html (original) +++ websites/staging/mina/trunk/content/mina-project/technical-documentation/message-flow.html Wed Apr 3 11:31:50 2019 @@ -169,149 +169,155 @@ h2:hover > .headerlink, h3:hover > .head <h1 id="message-flow">Message flow<a class="headerlink" href="#message-flow" title="Permanent link">¶</a></h1> <p>When a selector receives some <em>OP_READ</em> event, the associated <em>IoProcessor</em> is awaken and starts to process this event. It all starts with reading the channel, then pushing the read data through the filter chain down to the <em>IoHandler</em> (aka, the application). If the application decides to write back a response, it goes through the chain again, andultimately the data to be pushed into the channel is pushed into a queue (<em>writeRequestQueue), then the stack is unfolled, down to the _IoProcessor</em>, which pops the data from the queue and writes it into the channel.</p> <p>Here is the representation of such a flow, where the <em>SslFilter</em> has been included (we will come back to it later)</p> -<p>::: text - +-------------------+ - | IoAcceptor | - | +---------+ | - | | Select | | - | +----+----+ | - | | | - +---------+---------+ - . flush/ - +---------+ . +---------+ wakeup - | Channel <-----read------+ . +-----write-----> Channel | +----+ - +---------+ | | | +---------+ | | - +---+--v--+---+ +----v----+---+ - | | writeRequestQueue | | - | IoProcessor | +-+-+-+-+-+-+-+-+ | IoProcessor | - | <- pop -+ | | | | | | | <- put- | | - +---+-----^---+ +-+-+-+-+-+-+-+-+ +---------^---+ - | . . | - fireMessageReceived | . . | write - | . . | - +---v---------+ +---v-----+---+ - | HeadFilter | | HeadFilter <---------------filterWrite---------------+ - +---+-----^---+ +-------------+ | - | . . +-----+------+ - MessageReceived | . . +----------flushScheduledEvents--------> SslHandler | - | . . | +-----+------+ - +---v---------+ +---v------+--+ | - | SslFilter | | SslFilter +----put----+ | - +---+-----^---+ +---------^---+ | | - | . . | | filterWriteQueue | - MessageReceived | . . | filterWrite | +-+-+-+-+-+-+-+-+ | - | . . | +--> | | | | | | | <----pop---+ - +---v---------+ +---v---------+ +-+-+-+-+-+-+-+-+ - | <filters> | | <filters> | - +---+-----v---+ +-------------+ - | . . | - MessageReceived | . . | filterWrite - | . . | - +---v---------+ +---v-----+---+ - | TailFilter | | TailFilter | - +---+-----^---+ +---------^---+ - | . . | - MessageReceived | . . | fireFilterWrite - | . . | - +---v---------+ . | - | IoHandler | . | - +---+-----^---+ . | - | . . | - | ......................................... | - | | - +-------------------sessionWrite--------------------+</p> +<div class="codehilite"><pre> +-------------------+ + | IoAcceptor | + | +---------+ | + | | Select | | + | +----+----+ | + | | | + +---------+---------+ + . flush/ ++---------+ . +---------+ wakeup +| Channel <-----read------+ . +-----write-----> Channel | +----+ ++---------+ | | | +---------+ | | + +---+--v--+---+ +----v----+---+ + | | writeRequestQueue | | + | IoProcessor | +-+-+-+-+-+-+-+-+ | IoProcessor | + | <- pop -+ | | | | | | | <- put- | | + +---+-----^---+ +-+-+-+-+-+-+-+-+ +---------^---+ + | . . | + fireMessageReceived | . . | write + | . . | + +---v---------+ +---v-----+---+ + | HeadFilter | | HeadFilter <---------------filterWrite---------------+ + +---+-----^---+ +-------------+ | + | . . +-----+------+ + MessageReceived | . . +----------flushScheduledEvents--------> SslHandler | + | . . | +-----+------+ + +---v---------+ +---v------+--+ | + | SslFilter | | SslFilter +----put----+ | + +---+-----^---+ +---------^---+ | | + | . . | | filterWriteQueue | + MessageReceived | . . | filterWrite | +-+-+-+-+-+-+-+-+ | + | . . | +--> | | | | | | | <----pop---+ + +---v---------+ +---v---------+ +-+-+-+-+-+-+-+-+ + | <filters> | | <filters> | + +---+-----v---+ +-------------+ + | . . | + MessageReceived | . . | filterWrite + | . . | + +---v---------+ +---v-----+---+ + | TailFilter | | TailFilter | + +---+-----^---+ +---------^---+ + | . . | + MessageReceived | . . | fireFilterWrite + | . . | + +---v---------+ . | + | IoHandler | . | + +---+-----^---+ . | + | . . | + | ......................................... | + | | + +-------------------sessionWrite--------------------+ +</pre></div> + + <p>For instance, if we consider an application which filter chain contains the <em>MdcInjectionFilter</em>, <em>SslFilter</em>, <em>CompressionFilter</em>, <em>ProtocolCodecFilter</em>, <em>LoggingFilter</em>, we end uo with a stack of 77 calls, which needs to be emptied before the response can eventually be written. Here is the stack (in reverse order, the latest call on top of it):</p> -<p>::: text - NioProcessor(AbstractPollingIoProcessor<S>).flush(S) line: 449<br /> - NioProcessor(AbstractPollingIoProcessor<S>).write(S, WriteRequest) line: 436<br /> - NioProcessor(AbstractPollingIoProcessor<S>).write(IoSession, WriteRequest) line: 68 - SimpleIoProcessorPool<S>.write(S, WriteRequest) line: 278 - SimpleIoProcessorPool<S>.write(IoSession, WriteRequest) line: 80<br /> - DefaultIoFilterChain$HeadFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 914 - DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753<br /> - DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 - DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146<br /> - IoFilterEvent.fire() line: 131<br /> - MdcInjectionFilter.filter(IoFilterEvent) line: 162<br /> - MdcInjectionFilter(CommonEventFilter).filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 68<br /> - DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753<br /> - DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 - DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146<br /> - SslHandler.flushScheduledEvents() line: 330 - SslFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 671 - DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753<br /> - DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 - DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146<br /> - CompressionFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 152 - DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753<br /> - DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 - DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146<br /> - ProtocolCodecFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 340 - DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753<br /> - DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 - DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146<br /> - LoggingFilter(IoFilterAdapter).filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 138<br /> - DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753<br /> - DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 - DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146<br /> - DefaultIoFilterChain$TailFilter(IoFilterAdapter).filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 138<br /> - DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753<br /> - DefaultIoFilterChain.fireFilterWrite(WriteRequest) line: 746<br /> - NioSocketSession(AbstractIoSession).write(Object, SocketAddress) line: 570<br /> - NioSocketSession(AbstractIoSession).write(Object) line: 515 - ChatProtocolHandler.messageReceived(IoSession, Object) line: 106<br /> - DefaultIoFilterChain$TailFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 1015<br /> - DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650<br /> - DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 - DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128<br /> - LoggingFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 208 - DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650<br /> - DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 - DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128<br /> - ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(IoFilter$NextFilter, IoSession) line: 413 - ProtocolCodecFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 257 - DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650<br /> - DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 - DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128<br /> - CompressionFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 169 - DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650<br /> - DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 - DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128<br /> - SslHandler.flushScheduledEvents() line: 335 - SslFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 553 - DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650<br /> - DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 - DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128<br /> - IoFilterEvent.fire() line: 105<br /> - MdcInjectionFilter.filter(IoFilterEvent) line: 162<br /> - MdcInjectionFilter(CommonEventFilter).messageReceived(IoFilter$NextFilter, IoSession, Object) line: 84<br /> - DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650<br /> - DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 - DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128<br /> - DefaultIoFilterChain$HeadFilter(IoFilterAdapter).messageReceived(IoFilter$NextFilter, IoSession, Object) line: 122<br /> - DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650<br /> - DefaultIoFilterChain.fireMessageReceived(Object) line: 643<br /> - NioProcessor(AbstractPollingIoProcessor<S>).read(S) line: 539 - AbstractPollingIoProcessor<S>.access$1200(AbstractPollingIoProcessor, AbstractIoSession) line: 68 - AbstractPollingIoProcessor$Processor.process(S) line: 1223<br /> - AbstractPollingIoProcessor$Processor.process() line: 1212 - AbstractPollingIoProcessor$Processor.run() line: 683<br /> - NamePreservingRunnable.run() line: 64 - ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1149<br /> - ThreadPoolExecutor$Worker.run() line: 624 - Thread.run() line: 748 </p> +<div class="codehilite"><pre>NioProcessor(AbstractPollingIoProcessor<S>).flush(S) line: 449 +NioProcessor(AbstractPollingIoProcessor<S>).write(S, WriteRequest) line: 436 +NioProcessor(AbstractPollingIoProcessor<S>).write(IoSession, WriteRequest) line: 68 +SimpleIoProcessorPool<S>.write(S, WriteRequest) line: 278 +SimpleIoProcessorPool<S>.write(IoSession, WriteRequest) line: 80 +DefaultIoFilterChain$HeadFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 914 +DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753 +DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 +DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146 +IoFilterEvent.fire() line: 131 +MdcInjectionFilter.filter(IoFilterEvent) line: 162 +MdcInjectionFilter(CommonEventFilter).filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 68 +DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753 +DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 +DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146 +SslHandler.flushScheduledEvents() line: 330 +SslFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 671 +DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753 +DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 +DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146 +CompressionFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 152 +DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753 +DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 +DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146 +ProtocolCodecFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 340 +DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753 +DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 +DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146 +LoggingFilter(IoFilterAdapter).filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 138 +DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753 +DefaultIoFilterChain.access$1500(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, WriteRequest) line: 49 +DefaultIoFilterChain$EntryImpl$1.filterWrite(IoSession, WriteRequest) line: 1146 +DefaultIoFilterChain$TailFilter(IoFilterAdapter).filterWrite(IoFilter$NextFilter, IoSession, WriteRequest) line: 138 +DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest) line: 753 +DefaultIoFilterChain.fireFilterWrite(WriteRequest) line: 746 +NioSocketSession(AbstractIoSession).write(Object, SocketAddress) line: 570 +NioSocketSession(AbstractIoSession).write(Object) line: 515 +ChatProtocolHandler.messageReceived(IoSession, Object) line: 106 +DefaultIoFilterChain$TailFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 1015 +DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650 +DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 +DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128 +LoggingFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 208 +DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650 +DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 +DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128 +ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(IoFilter$NextFilter, IoSession) line: 413 +ProtocolCodecFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 257 +DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650 +DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 +DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128 +CompressionFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 169 +DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650 +DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 +DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128 +SslHandler.flushScheduledEvents() line: 335 +SslFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 553 +DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650 +DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 +DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128 +IoFilterEvent.fire() line: 105 +MdcInjectionFilter.filter(IoFilterEvent) line: 162 +MdcInjectionFilter(CommonEventFilter).messageReceived(IoFilter$NextFilter, IoSession, Object) line: 84 +DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650 +DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 49 +DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 1128 +DefaultIoFilterChain$HeadFilter(IoFilterAdapter).messageReceived(IoFilter$NextFilter, IoSession, Object) line: 122 +DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 650 +DefaultIoFilterChain.fireMessageReceived(Object) line: 643 +NioProcessor(AbstractPollingIoProcessor<S>).read(S) line: 539 +AbstractPollingIoProcessor<S>.access$1200(AbstractPollingIoProcessor, AbstractIoSession) line: 68 +AbstractPollingIoProcessor$Processor.process(S) line: 1223 +AbstractPollingIoProcessor$Processor.process() line: 1212 +AbstractPollingIoProcessor$Processor.run() line: 683 +NamePreservingRunnable.run() line: 64 +ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1149 +ThreadPoolExecutor$Worker.run() line: 624 +Thread.run() line: 748 +</pre></div> + + <p>Writing the data is done when we are back in the AbstractPollingIoProcessor$Processor.run() call. Here is the stack for that action :</p> -<p>::: text - NioProcessor.write(NioSession, IoBuffer, int) line: 384 - NioProcessor.write(AbstractIoSession, IoBuffer, int) line: 47 - AbstractPollingIoProcessor$Processor.writeBuffer(S, WriteRequest, boolean, int, long) line: 1107<br /> - AbstractPollingIoProcessor$Processor.flushNow(S, long) line: 994<br /> - AbstractPollingIoProcessor$Processor.flush(long) line: 921<br /> - AbstractPollingIoProcessor$Processor.run() line: 688<br /> - NamePreservingRunnable.run() line: 64 - ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1149<br /> - ThreadPoolExecutor$Worker.run() line: 624 - Thread.run() line: 748 </p> +<div class="codehilite"><pre>NioProcessor.write(NioSession, IoBuffer, int) line: 384 +NioProcessor.write(AbstractIoSession, IoBuffer, int) line: 47 +AbstractPollingIoProcessor$Processor.writeBuffer(S, WriteRequest, boolean, int, long) line: 1107 +AbstractPollingIoProcessor$Processor.flushNow(S, long) line: 994 +AbstractPollingIoProcessor$Processor.flush(long) line: 921 +AbstractPollingIoProcessor$Processor.run() line: 688 +NamePreservingRunnable.run() line: 64 +ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1149 +ThreadPoolExecutor$Worker.run() line: 624 +Thread.run() line: 748 +</pre></div> + + <h2 id="the-sslfilter-implementation">The SslFilter implementation<a class="headerlink" href="#the-sslfilter-implementation" title="Permanent link">¶</a></h2> <p>As we can see,the <em>SslFilter</em> never calls the next filter. It delegates that to the <em>SslHandler</em> class. The trick is that it uses a queue to store encrypted messages, which will wait until the message is fully encrypted before flushing them. The rational is that a message can be pretty big, and teh <strong>SSL/TLS</strong> protocol just allows limited encrypted data blocks (around 16k), so it keeps each block of encrypted data into the queue temporarily.</p> <h1 id="room-for-improvements">Room for improvements<a class="headerlink" href="#room-for-improvements" title="Permanent link">¶</a></h1> @@ -325,12 +331,14 @@ Typically, adding a <em>SslFilter</em> i <p>For messages received <em>before</em> the addition of the <em>SslFilter</em>, but still in the chain, we should ditch them for the exact same reason.</p> <p>Bottom line, this is a application issue, and should be handled by the application, because <strong>MINA</strong> can't deal with all the possible. starties in place of the application.</p> <p>That being said, we can use the <em>IoProcessor</em> as a controller. It would b eits responsability to propagate events from one filter to the other, using such a loop:</p> -<p>::: text - for each filter in the chain - do - propagate the event to the filter with the previous result - store the result - done</p> +<div class="codehilite"><pre>for each filter in the chain + do + propagate the event to the filter with the previous result + store the result + done +</pre></div> + + <p>What we call the 'result' is just the transformed data. Typically, when calling the <em>ProtocolCodecFilter.messageReceived</em> event, the result will be the decoded message, not the <em>IoBuffer</em> (or whatever) input. This will be passed to the next filter (remember that the <em>IoFilter.messageReceived</em> method takes an <em>Object</em> as a parameter).</p>