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 }