(byte[] data, HpackEncoder encoder)
| 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 | } |
no test coverage detected