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