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

Method decodeFromFrames

src/main/java/core/packetproxy/http2/Grpc.java:88–126  ·  view source on GitHub ↗
(byte[] frames)

Source from the content-addressed store, hash-verified

86 }
87
88 private byte[] decodeFromFrames(byte[] frames) throws Exception {
89 ByteArrayOutputStream outHeader = new ByteArrayOutputStream();
90 ByteArrayOutputStream outData = new ByteArrayOutputStream();
91 Http httpHeaderSums = null;
92
93 for (Frame frame : FrameUtils.parseFrames(frames)) {
94
95 if (frame instanceof HeadersFrame) {
96
97 HeadersFrame headersFrame = (HeadersFrame) frame;
98 Http http = Http.create(headersFrame.getHttp());
99 if (null == httpHeaderSums) { // Main Header Frame
100
101 httpHeaderSums = http;
102 } else { // Trailer Header Frame
103
104 for (HeaderField field : http.getHeader().getFields()) {
105
106 httpHeaderSums.updateHeader("x-trailer-" + field.getName(), field.getValue());
107 }
108 }
109 } else if (frame instanceof DataFrame) {
110
111 DataFrame dataFrame = (DataFrame) frame;
112 outData.write(dataFrame.getPayload());
113 }
114 }
115 outHeader.write(httpHeaderSums.toByteArray());
116 // 順序をHeader, Dataにする。本当はStreamIDで管理してencode時に元の順番に戻せるようにしたい。
117 // 暫定でgRPC over HTTP2のレスポンスの2つめのヘッダは"x-trailer-"から始まるヘッダに従って元の順番に戻す。
118 outData.writeTo(outHeader);
119 Http http = Http.create(outHeader.toByteArray());
120 int flags = Integer.valueOf(http.getFirstHeader("X-PacketProxy-HTTP2-Flags"));
121 if (http.getBody() == null || http.getBody().length == 0) {
122
123 http.updateHeader("X-PacketProxy-HTTP2-Flags", String.valueOf(flags & 0xff | HeadersFrame.FLAG_END_STREAM));
124 }
125 return http.toByteArray();
126 }
127
128 @Override
129 protected byte[] encodeClientRequestToFrames(byte[] http) throws Exception {

Calls 15

parseFramesMethod · 0.95
createMethod · 0.95
getHttpMethod · 0.95
getHeaderMethod · 0.95
updateHeaderMethod · 0.95
toByteArrayMethod · 0.95
getFirstHeaderMethod · 0.95
getBodyMethod · 0.95
getFieldsMethod · 0.80
getPayloadMethod · 0.80
writeToMethod · 0.80
getNameMethod · 0.65

Tested by

no test coverage detected