package com.linkedin.r2.streaming.sample; import com.linkedin.common.callback.Callback; import com.linkedin.r2.message.RequestContext; import com.linkedin.r2.message.stream.StreamRequest; import com.linkedin.r2.message.stream.StreamRequestBuilder; import com.linkedin.r2.message.stream.StreamResponse; import com.linkedin.r2.transport.common.Client; import com.linkedin.r2.transport.common.StreamRequestHandler; import java.net.URI; /** * A simple proxy that rewrites URI for request to downstream and relays response back to upstream. * Nevertheless, back pressure is still achieved. * * @author Zhenkai Zhu */ public class UriRewriteProxy implements StreamRequestHandler { final private Client _client; final private UriRewriter _uriRewriter; public UriRewriteProxy(Client client, UriRewriter uriRewriter) { _client = client; _uriRewriter = uriRewriter; } @Override public void handleRequest(StreamRequest request, RequestContext requestContext, final Callback<StreamResponse> callback) { URI newUri = _uriRewriter.rewrite(request.getURI()); StreamRequestBuilder builder = new StreamRequestBuilder(request); builder.setURI(newUri); StreamRequest newRequest = builder.build(request.getEntityStream()); _client.streamRequest(newRequest, requestContext, callback); } public interface UriRewriter { /** * Returns a new URI based on the input uri * e.g. d2://company/1000 -> http://192.168.0.1/company/1000 * @param uri input uri * @return the rewritten uri */ URI rewrite(URI uri); } }