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 import java.util.Map;
23
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.SettingsFrame;
28 import org.eclipse.jetty.io.ByteBufferPool;
29 import org.eclipse.jetty.util.BufferUtil;
30
31 public class SettingsGenerator extends FrameGenerator
32 {
33 public SettingsGenerator(HeaderGenerator headerGenerator)
34 {
35 super(headerGenerator);
36 }
37
38 @Override
39 public void generate(ByteBufferPool.Lease lease, Frame frame)
40 {
41 SettingsFrame settingsFrame = (SettingsFrame)frame;
42 generateSettings(lease, settingsFrame.getSettings(), settingsFrame.isReply());
43 }
44
45 public void generateSettings(ByteBufferPool.Lease lease, Map<Integer, Integer> settings, boolean reply)
46 {
47
48 int entryLength = 2 + 4;
49 int length = entryLength * settings.size();
50 if (length > getMaxFrameSize())
51 throw new IllegalArgumentException("Invalid settings, too big");
52
53 ByteBuffer header = generateHeader(lease, FrameType.SETTINGS, length, reply ? Flags.ACK : Flags.NONE, 0);
54
55 for (Map.Entry<Integer, Integer> entry : settings.entrySet())
56 {
57 header.putShort(entry.getKey().shortValue());
58 header.putInt(entry.getValue());
59 }
60
61 BufferUtil.flipToFlush(header, 0);
62 lease.append(header, true);
63 }
64 }