1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.eclipse.jetty.spdy.generator;
18
19 import java.nio.ByteBuffer;
20
21 import org.eclipse.jetty.spdy.ByteBufferPool;
22 import org.eclipse.jetty.spdy.SessionException;
23 import org.eclipse.jetty.spdy.api.SessionStatus;
24 import org.eclipse.jetty.spdy.frames.ControlFrame;
25 import org.eclipse.jetty.spdy.frames.HeadersFrame;
26
27 public class HeadersGenerator extends ControlFrameGenerator
28 {
29 private final HeadersBlockGenerator headersBlockGenerator;
30
31 public HeadersGenerator(ByteBufferPool bufferPool, HeadersBlockGenerator headersBlockGenerator)
32 {
33 super(bufferPool);
34 this.headersBlockGenerator = headersBlockGenerator;
35 }
36
37 @Override
38 public ByteBuffer generate(ControlFrame frame)
39 {
40 HeadersFrame headers = (HeadersFrame)frame;
41 short version = headers.getVersion();
42
43 ByteBuffer headersBuffer = headersBlockGenerator.generate(version, headers.getHeaders());
44
45 int frameBodyLength = 4;
46
47 int frameLength = frameBodyLength + headersBuffer.remaining();
48 if (frameLength > 0xFF_FF_FF)
49 {
50
51
52 throw new SessionException(SessionStatus.PROTOCOL_ERROR, "Too many headers");
53 }
54
55 int totalLength = ControlFrame.HEADER_LENGTH + frameLength;
56
57 ByteBuffer buffer = getByteBufferPool().acquire(totalLength, true);
58 generateControlFrameHeader(headers, frameLength, buffer);
59
60 buffer.putInt(headers.getStreamId() & 0x7F_FF_FF_FF);
61
62 buffer.put(headersBuffer);
63
64 buffer.flip();
65 return buffer;
66 }
67 }