(byte[] frames)
| 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 { |
no test coverage detected