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.Arrays;
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.GoAwayFrame;
28 import org.eclipse.jetty.io.ByteBufferPool;
29 import org.eclipse.jetty.util.BufferUtil;
30
31 public class GoAwayGenerator extends FrameGenerator
32 {
33 public GoAwayGenerator(HeaderGenerator headerGenerator)
34 {
35 super(headerGenerator);
36 }
37
38 @Override
39 public void generate(ByteBufferPool.Lease lease, Frame frame)
40 {
41 GoAwayFrame goAwayFrame = (GoAwayFrame)frame;
42 generateGoAway(lease, goAwayFrame.getLastStreamId(), goAwayFrame.getError(), goAwayFrame.getPayload());
43 }
44
45 public void generateGoAway(ByteBufferPool.Lease lease, int lastStreamId, int error, byte[] payload)
46 {
47 if (lastStreamId < 0)
48 throw new IllegalArgumentException("Invalid last stream id: " + lastStreamId);
49
50
51 int fixedLength = 4 + 4;
52
53
54 int maxPayloadLength = Frame.DEFAULT_MAX_LENGTH - fixedLength;
55 if (payload != null && payload.length > maxPayloadLength)
56 payload = Arrays.copyOfRange(payload, 0, maxPayloadLength);
57
58 int length = fixedLength + (payload != null ? payload.length : 0);
59 ByteBuffer header = generateHeader(lease, FrameType.GO_AWAY, length, Flags.NONE, 0);
60
61 header.putInt(lastStreamId);
62 header.putInt(error);
63
64 if (payload != null)
65 {
66 header.put(payload);
67 }
68
69 BufferUtil.flipToFlush(header, 0);
70 lease.append(header, true);
71 }
72 }