package com.linkedin.r2.filter.transport; import com.linkedin.common.callback.Callback; import com.linkedin.r2.filter.NextFilter; import com.linkedin.r2.filter.message.rest.RestFilter; import com.linkedin.r2.filter.message.stream.StreamFilter; import com.linkedin.r2.message.RequestContext; import com.linkedin.r2.message.QueryTunnelUtil; import com.linkedin.r2.message.rest.RestRequest; import com.linkedin.r2.message.rest.RestResponse; import com.linkedin.r2.message.stream.StreamRequest; import com.linkedin.r2.message.stream.StreamResponse; import java.util.Map; /** * @author Zhenkai Zhu */ public class ClientQueryTunnelFilter implements RestFilter, StreamFilter { private final int _queryPostThreshold; public ClientQueryTunnelFilter(int queryPostThreshold) { _queryPostThreshold = queryPostThreshold; } @Override public void onRestRequest(RestRequest req, RequestContext requestContext, Map<String, String> wireAttrs, NextFilter<RestRequest, RestResponse> nextFilter) { final RestRequest newReq; try { newReq = QueryTunnelUtil.encode(req, requestContext, _queryPostThreshold); } catch (Exception e) { nextFilter.onError(e, requestContext, wireAttrs); return; } nextFilter.onRequest(newReq, requestContext, wireAttrs); } @Override public void onStreamRequest(final StreamRequest req, final RequestContext requestContext, final Map<String, String> wireAttrs, final NextFilter<StreamRequest, StreamResponse> nextFilter) { Callback<StreamRequest> callback = new Callback<StreamRequest>() { @Override public void onError(Throwable e) { nextFilter.onError(e, requestContext, wireAttrs); } @Override public void onSuccess(StreamRequest newReq) { nextFilter.onRequest(newReq, requestContext, wireAttrs); } }; // the entire request would be buffered in memory if encoding is needed // this usually is not a problem as request with extremely query parameters is usually get request with no body QueryTunnelUtil.encode(req, requestContext, _queryPostThreshold, callback); } }