1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.eclipse.jetty.http2.hpack;
21
22 import java.nio.ByteBuffer;
23
24 import org.eclipse.jetty.http.HttpFieldPreEncoder;
25 import org.eclipse.jetty.http.HttpHeader;
26 import org.eclipse.jetty.http.HttpVersion;
27 import org.eclipse.jetty.util.BufferUtil;
28
29
30
31
32
33 public class HpackFieldPreEncoder implements HttpFieldPreEncoder
34 {
35
36
37
38
39 @Override
40 public HttpVersion getHttpVersion()
41 {
42 return HttpVersion.HTTP_2;
43 }
44
45
46
47
48
49 @Override
50 public byte[] getEncodedField(HttpHeader header, String name, String value)
51 {
52 boolean not_indexed=HpackEncoder.__DO_NOT_INDEX.contains(header);
53
54 ByteBuffer buffer = BufferUtil.allocate(name.length()+value.length()+10);
55 BufferUtil.clearToFill(buffer);
56 boolean huffman;
57 int bits;
58
59 if (not_indexed)
60 {
61
62 boolean never_index=HpackEncoder.__NEVER_INDEX.contains(header);
63 huffman=!HpackEncoder.__DO_NOT_HUFFMAN.contains(header);
64 buffer.put(never_index?(byte)0x10:(byte)0x00);
65 bits=4;
66 }
67 else if (header==HttpHeader.CONTENT_LENGTH && value.length()>1)
68 {
69
70 buffer.put((byte)0x00);
71 huffman=true;
72 bits=4;
73 }
74 else
75 {
76
77 buffer.put((byte)0x40);
78 huffman=!HpackEncoder.__DO_NOT_HUFFMAN.contains(header);
79 bits=6;
80 }
81
82 int name_idx=HpackContext.staticIndex(header);
83 if (name_idx>0)
84 NBitInteger.encode(buffer,bits,name_idx);
85 else
86 {
87 buffer.put((byte)0x80);
88 NBitInteger.encode(buffer,7,Huffman.octetsNeededLC(name));
89 Huffman.encodeLC(buffer,name);
90 }
91
92 HpackEncoder.encodeValue(buffer,huffman,value);
93
94 BufferUtil.flipToFlush(buffer,0);
95 return BufferUtil.toArray(buffer);
96 }
97 }