1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package io.netty.handler.codec.spdy;
17  
18  import io.netty.channel.ChannelHandlerContext;
19  import io.netty.handler.codec.MessageToMessageCodec;
20  import io.netty.handler.codec.http.HttpMessage;
21  import io.netty.handler.codec.spdy.SpdyHttpHeaders.Names;
22  import io.netty.util.ReferenceCountUtil;
23  
24  import java.util.ArrayDeque;
25  import java.util.List;
26  import java.util.Queue;
27  
28  
29  
30  
31  
32  
33  public class SpdyHttpResponseStreamIdHandler extends
34          MessageToMessageCodec<Object, HttpMessage> {
35      private static final Integer NO_ID = -1;
36      private final Queue<Integer> ids = new ArrayDeque<Integer>();
37  
38      public SpdyHttpResponseStreamIdHandler() {
39          super(Object.class, HttpMessage.class);
40      }
41  
42      @Override
43      public boolean acceptInboundMessage(Object msg) throws Exception {
44          return msg instanceof HttpMessage || msg instanceof SpdyRstStreamFrame;
45      }
46  
47      @Override
48      protected void encode(ChannelHandlerContext ctx, HttpMessage msg, List<Object> out) throws Exception {
49          Integer id = ids.poll();
50          if (id != null && id.intValue() != NO_ID && !msg.headers().contains(SpdyHttpHeaders.Names.STREAM_ID)) {
51              msg.headers().setInt(Names.STREAM_ID, id);
52          }
53  
54          out.add(ReferenceCountUtil.retain(msg));
55      }
56  
57      @Override
58      protected void decode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
59          if (msg instanceof HttpMessage) {
60              boolean contains = ((HttpMessage) msg).headers().contains(SpdyHttpHeaders.Names.STREAM_ID);
61              if (!contains) {
62                  ids.add(NO_ID);
63              } else {
64                  ids.add(((HttpMessage) msg).headers().getInt(Names.STREAM_ID));
65              }
66          } else if (msg instanceof SpdyRstStreamFrame) {
67              ids.remove(((SpdyRstStreamFrame) msg).streamId());
68          }
69  
70          out.add(ReferenceCountUtil.retain(msg));
71      }
72  }