public void onRequestWriteOrEnqueue( ChannelHandlerContext ctx, Integer streamId, Object request, ChannelPromise promise) { if (streamId == null || streamId == Message.H1_STREAM_ID_NONE) { log.debug("writing request {}", request); ctx.write(request, promise); } else { boolean shouldWrite = currentProxiedH2StreamId().map(id -> id.equals(streamId)).orElse(Boolean.TRUE); Queue<PendingRequest> queue = streamQueue.computeIfAbsent(streamId, k -> Queues.newArrayDeque()); if (shouldWrite) { log.debug("writing h2-h1 proxy request {}", request); ctx.write(request, promise); } else { log.debug("enqueuing h2-h1 proxy request {}", request); queue.offer(new PendingRequest(request, promise)); } } }
Response wrapResponse(ChannelHandlerContext ctx, HttpObject msg) { log.debug("wrapResponse msg={}", msg); final Response response; if (msg instanceof FullHttpResponse) { response = new FullHttp1Response((FullHttpResponse) msg); } else if (msg instanceof HttpResponse) { response = new SegmentedHttp1Response((HttpResponse) msg); } else if (msg instanceof HttpContent) { response = getProxyRequestQueue(ctx) .currentResponse() .map(r -> new SegmentedResponseData(r, new Http1SegmentedData((HttpContent) msg))) .orElse(null); } else { // TODO(CK): throw an exception if response is null? response = null; } return getProxyRequestQueue(ctx) .currentProxiedH2StreamId() .<Response>map( streamId -> { if (response instanceof SegmentedResponseData) { return new ProxySegmentedResponseData((SegmentedResponseData) response, streamId); } else { return new ProxyResponse(response, streamId); } }) .orElse(response); }
assertEquals(3, subject.currentProxiedH2StreamId().orElse(0), 0); Response response = DefaultFullResponse.builder() assertEquals(5, subject.currentProxiedH2StreamId().orElse(0), 0);
assertEquals(3, subject.currentProxiedH2StreamId().orElse(0), 0); Response stream3Response0 = DefaultSegmentedResponse.builder() assertEquals(5, subject.currentProxiedH2StreamId().orElse(0), 0); Response stream5Response0 = DefaultSegmentedResponse.builder()