1 module hunt.http.codec.http.decode.HeaderBlockFragments;
2
3 import hunt.io.ByteBuffer;
4
5 import hunt.http.codec.http.frame.PriorityFrame;
6 import hunt.io.BufferUtils;
7
8 class HeaderBlockFragments {
9 private PriorityFrame priorityFrame;
10 private bool endStream;
11 private int streamId;
12 private ByteBuffer storage;
13
14 void storeFragment(ByteBuffer fragment, int length, bool last) {
15 if (storage is null) {
16 int space = last ? length : length * 2;
17 storage = BufferUtils.allocate(space);
18 }
19
20 // Grow the storage if necessary.
21 if (storage.remaining() < length) {
22 int space = last ? length : length * 2;
23 int capacity = storage.position() + space;
24 ByteBuffer newStorage = BufferUtils.allocate(capacity);
25 storage.flip();
26 newStorage.put(storage);
27 storage = newStorage;
28 }
29
30 // Copy the fragment into the storage.
31 int limit = fragment.limit();
32 fragment.limit(fragment.position() + length);
33 storage.put(fragment);
34 fragment.limit(limit);
35 }
36
37 PriorityFrame getPriorityFrame() {
38 return priorityFrame;
39 }
40
41 void setPriorityFrame(PriorityFrame priorityFrame) {
42 this.priorityFrame = priorityFrame;
43 }
44
45 bool isEndStream() {
46 return endStream;
47 }
48
49 void setEndStream(bool endStream) {
50 this.endStream = endStream;
51 }
52
53 ByteBuffer complete() {
54 ByteBuffer result = storage;
55 storage = null;
56 result.flip();
57 return result;
58 }
59
60 int getStreamId() {
61 return streamId;
62 }
63
64 void setStreamId(int streamId) {
65 this.streamId = streamId;
66 }
67 }