@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof HttpObject) { Response response = wrapResponse(ctx, (HttpObject) msg); ctx.fireChannelRead(response); getProxyRequestQueue(ctx).onResponseDrainNext(ctx, response); } else { ctx.fireChannelRead(msg); } }
@Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { log.debug("write: msg={}", msg); if (msg instanceof SegmentedData) { SegmentedData segmentedData = (SegmentedData) msg; HttpContent content = buildContent(segmentedData); getProxyRequestQueue(ctx) .onRequestWriteOrEnqueue(ctx, segmentedData.streamId(), content, promise); } else if (msg instanceof Request) { Request request = (Request) msg; HttpRequest message = buildRequest(request); getProxyRequestQueue(ctx).onRequestWriteOrEnqueue(ctx, request.streamId(), message, promise); } else { ctx.write(msg, 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); }