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 @Override
39 public boolean acceptInboundMessage(Object msg) throws Exception {
40 return msg instanceof HttpMessage || msg instanceof SpdyRstStreamFrame;
41 }
42
43 @Override
44 protected void encode(ChannelHandlerContext ctx, HttpMessage msg, List<Object> out) throws Exception {
45 Integer id = ids.poll();
46 if (id != null && id.intValue() != NO_ID && !msg.headers().contains(SpdyHttpHeaders.Names.STREAM_ID)) {
47 msg.headers().setInt(Names.STREAM_ID, id);
48 }
49
50 out.add(ReferenceCountUtil.retain(msg));
51 }
52
53 @Override
54 protected void decode(ChannelHandlerContext ctx, Object msg, List<Object> out) throws Exception {
55 if (msg instanceof HttpMessage) {
56 boolean contains = ((HttpMessage) msg).headers().contains(SpdyHttpHeaders.Names.STREAM_ID);
57 if (!contains) {
58 ids.add(NO_ID);
59 } else {
60 ids.add(((HttpMessage) msg).headers().getInt(Names.STREAM_ID));
61 }
62 } else if (msg instanceof SpdyRstStreamFrame) {
63 ids.remove(((SpdyRstStreamFrame) msg).streamId());
64 }
65
66 out.add(ReferenceCountUtil.retain(msg));
67 }
68 }