MCPcopy Create free account
hub / github.com/DeNA/PacketProxy / encodeToFrames

Method encodeToFrames

src/main/java/core/packetproxy/http2/Grpc.java:138–197  ·  view source on GitHub ↗
(byte[] data, HpackEncoder encoder)

Source from the content-addressed store, hash-verified

136 }
137
138 private byte[] encodeToFrames(byte[] data, HpackEncoder encoder) throws Exception {
139 ByteArrayOutputStream out = new ByteArrayOutputStream();
140 Http http = Http.create(data);
141 int flags = Integer.valueOf(http.getFirstHeader("X-PacketProxy-HTTP2-Flags"));
142 HttpFields.Mutable GRPC2ndHeaderHttpFields = HttpFields.build();
143
144 List<String> unusedHeaders = new ArrayList<>();
145 for (HeaderField field : http.getHeader().getFields()) {
146
147 if (field.getName().startsWith("x-trailer-")) {
148
149 unusedHeaders.add(field.getName());
150 GRPC2ndHeaderHttpFields.add(field.getName().substring(10), field.getValue());
151 }
152 }
153
154 for (String name : unusedHeaders) {
155
156 http.removeHeader(name);
157 }
158 boolean has_second_frame = (http.getBody() != null && http.getBody().length > 0)
159 || GRPC2ndHeaderHttpFields.size() > 0;
160
161 int first_flags = flags & 0xff | HeadersFrame.FLAG_END_STREAM;
162 if (has_second_frame) {
163
164 first_flags = flags & 0xff & ~HeadersFrame.FLAG_END_STREAM;
165 }
166 http.updateHeader("X-PacketProxy-HTTP2-Flags", String.valueOf(first_flags));
167
168 HeadersFrame headersFrame = new HeadersFrame(http);
169 out.write(headersFrame.toByteArrayWithoutExtra(encoder));
170
171 if (http.getBody() != null && http.getBody().length > 0) {
172
173 DataFrame dataFrame = new DataFrame(http);
174 if (GRPC2ndHeaderHttpFields.size() > 0) {
175
176 dataFrame.setFlags(dataFrame.getFlags() & 0xff & ~DataFrame.FLAG_END_STREAM);
177 }
178 out.write(dataFrame.toByteArrayWithoutExtra());
179 }
180
181 if (GRPC2ndHeaderHttpFields.size() > 0) {
182
183 Http althttp = http;
184 althttp.setBody(new byte[0]);
185 althttp.removeMatches("^(?!X-PacketProxy-HTTP2).*$");
186
187 for (HttpField headerField : GRPC2ndHeaderHttpFields) {
188
189 althttp.updateHeader(headerField.getName(), headerField.getValue());
190 }
191 althttp.updateHeader("X-PacketProxy-HTTP2-Flags",
192 String.valueOf(flags & 0xff | HeadersFrame.FLAG_END_STREAM));
193 HeadersFrame headers2ndFrame = new HeadersFrame(althttp);
194 out.write(headers2ndFrame.toByteArrayWithoutExtra(encoder));
195 }

Callers 2

Calls 15

createMethod · 0.95
getFirstHeaderMethod · 0.95
getHeaderMethod · 0.95
removeHeaderMethod · 0.95
getBodyMethod · 0.95
updateHeaderMethod · 0.95
setBodyMethod · 0.95
removeMatchesMethod · 0.95
getFieldsMethod · 0.80
setFlagsMethod · 0.80

Tested by

no test coverage detected