1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.http2.generator;
20
21 import java.nio.ByteBuffer;
22
23 import org.eclipse.jetty.http.MetaData;
24 import org.eclipse.jetty.http2.Flags;
25 import org.eclipse.jetty.http2.frames.Frame;
26 import org.eclipse.jetty.http2.frames.FrameType;
27 import org.eclipse.jetty.http2.frames.PushPromiseFrame;
28 import org.eclipse.jetty.http2.hpack.HpackEncoder;
29 import org.eclipse.jetty.io.ByteBufferPool;
30 import org.eclipse.jetty.util.BufferUtil;
31
32 public class PushPromiseGenerator extends FrameGenerator
33 {
34 private final HpackEncoder encoder;
35
36 public PushPromiseGenerator(HeaderGenerator headerGenerator, HpackEncoder encoder)
37 {
38 super(headerGenerator);
39 this.encoder = encoder;
40 }
41
42 @Override
43 public void generate(ByteBufferPool.Lease lease, Frame frame)
44 {
45 PushPromiseFrame pushPromiseFrame = (PushPromiseFrame)frame;
46 generatePushPromise(lease, pushPromiseFrame.getStreamId(), pushPromiseFrame.getPromisedStreamId(), pushPromiseFrame.getMetaData());
47 }
48
49 public void generatePushPromise(ByteBufferPool.Lease lease, int streamId, int promisedStreamId, MetaData metaData)
50 {
51 if (streamId < 0)
52 throw new IllegalArgumentException("Invalid stream id: " + streamId);
53 if (promisedStreamId < 0)
54 throw new IllegalArgumentException("Invalid promised stream id: " + promisedStreamId);
55
56 int maxFrameSize = getMaxFrameSize();
57
58 int extraSpace = 4;
59 maxFrameSize -= extraSpace;
60
61 ByteBuffer hpacked = lease.acquire(maxFrameSize, false);
62 BufferUtil.clearToFill(hpacked);
63 encoder.encode(hpacked, metaData);
64 int hpackedLength = hpacked.position();
65 BufferUtil.flipToFlush(hpacked, 0);
66
67 int length = hpackedLength + extraSpace;
68 int flags = Flags.END_HEADERS;
69
70 ByteBuffer header = generateHeader(lease, FrameType.PUSH_PROMISE, length, flags, streamId);
71 header.putInt(promisedStreamId);
72 BufferUtil.flipToFlush(header, 0);
73
74 lease.append(header, true);
75 lease.append(hpacked, true);
76 }
77 }