< prev index next >
1 /*
2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 */
24
25 package java.net.http;
26
27 import java.io.IOException;
28 import java.nio.ByteBuffer;
29
30 class PushPromiseFrame extends HeaderFrame {
31
32 int padLength;
33 int promisedStream;
34
35 PushPromiseFrame() {
36 type = TYPE;
37 }
38
39 public static final int TYPE = 0x5;
40
41 // Flags
42 public static final int END_HEADERS = 0x4;
43 public static final int PADDED = 0x8;
44
45 @Override
46 public String toString() {
47 return super.toString() + " promisedStreamid: " + promisedStream
48 + " headerLength: " + headerLength;
49 }
50
51 @Override
52 String flagAsString(int flag) {
53 switch (flag) {
54 case PADDED:
55 return "PADDED";
56 case END_HEADERS:
57 return "END_HEADERS";
58 }
59 return super.flagAsString(flag);
60 }
61
62 public void setPadLength(int padLength) {
63 this.padLength = padLength;
64 flags |= PADDED;
65 }
66
67 public void setPromisedStream(int stream) {
68 this.promisedStream = stream;
69 }
70
71 public int getPromisedStream() {
72 return promisedStream;
73 }
74
75 /**
76 */
77 @Override
78 void readIncomingImpl(ByteBufferConsumer bc) throws IOException {
79 if ((flags & PADDED) != 0) {
80 padLength = bc.getByte();
81 headerLength = length - (padLength + 5);
82 } else
83 headerLength = length - 4;
84
85 promisedStream = bc.getInt() & 0x7fffffff;
86 headerBlocks = bc.getBuffers(headerLength);
87 }
88
89 @Override
90 void computeLength() {
91 int len = 0;
92 if ((flags & PADDED) != 0) {
93 len += (1 + padLength);
94 }
95 len += (4 + headerLength);
96 this.length = len;
97 }
98
99 @Override
100 void writeOutgoing(ByteBufferGenerator bg) {
101 super.writeOutgoing(bg);
102 ByteBuffer buf = bg.getBuffer(length);
103 if ((flags & PADDED) != 0) {
104 buf.put((byte)padLength);
105 }
106 buf.putInt(promisedStream);
107 for (int i=0; i<headerBlocks.length; i++) {
108 bg.addByteBuffer(headerBlocks[i]);
109 }
110 if ((flags & PADDED) != 0) {
111 bg.addPadding(padLength);
112 }
113 }
114
115 @Override
116 public boolean endHeaders() {
117 return getFlag(END_HEADERS);
118 }
119 }
< prev index next >