1
2
3
4
5
6
7
8
9
10
11
12
13
14 package org.eclipse.jetty.spdy.generator;
15
16 import java.nio.ByteBuffer;
17
18 import org.eclipse.jetty.spdy.ByteBufferPool;
19 import org.eclipse.jetty.spdy.SessionException;
20 import org.eclipse.jetty.spdy.api.SPDY;
21 import org.eclipse.jetty.spdy.api.SessionStatus;
22 import org.eclipse.jetty.spdy.frames.ControlFrame;
23 import org.eclipse.jetty.spdy.frames.HeadersFrame;
24
25 public class HeadersGenerator extends ControlFrameGenerator
26 {
27 private final HeadersBlockGenerator headersBlockGenerator;
28
29 public HeadersGenerator(ByteBufferPool bufferPool, HeadersBlockGenerator headersBlockGenerator)
30 {
31 super(bufferPool);
32 this.headersBlockGenerator = headersBlockGenerator;
33 }
34
35 @Override
36 public ByteBuffer generate(ControlFrame frame)
37 {
38 HeadersFrame headers = (HeadersFrame)frame;
39 short version = headers.getVersion();
40
41 ByteBuffer headersBuffer = headersBlockGenerator.generate(version, headers.getHeaders());
42
43 int frameBodyLength = 4;
44 if (frame.getVersion() == SPDY.V2)
45 frameBodyLength += 2;
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 if (frame.getVersion() == SPDY.V2)
62 buffer.putShort((short)0);
63
64 buffer.put(headersBuffer);
65
66 buffer.flip();
67 return buffer;
68 }
69 }