use of com.linkedin.r2.message.RequestContext in project rest.li by linkedin.
the class TestHttpNettyClient method testHeaderSize.
public void testHeaderSize(int headerSize, int expectedResult) throws InterruptedException, IOException, TimeoutException {
TestServer testServer = new TestServer();
HttpNettyClient client = new HttpClientBuilder(_eventLoop, _scheduler).setRequestTimeout(5000000).setIdleTimeout(10000).setShutdownTimeout(500).setMaxHeaderSize(TEST_MAX_HEADER_SIZE).buildRest();
RestRequest r = new RestRequestBuilder(testServer.getResponseWithHeaderSizeURI(headerSize)).build();
FutureCallback<RestResponse> cb = new FutureCallback<RestResponse>();
TransportCallback<RestResponse> callback = new TransportCallbackAdapter<RestResponse>(cb);
client.restRequest(r, new RequestContext(), new HashMap<String, String>(), callback);
try {
RestResponse response = cb.get(300, TimeUnit.SECONDS);
if (expectedResult == TOO_LARGE) {
Assert.fail("Max header size exceeded, expected exception. ");
}
} catch (ExecutionException e) {
if (expectedResult == RESPONSE_OK) {
Assert.fail("Unexpected ExecutionException, header was <= max header size.");
}
verifyCauseChain(e, RemoteInvocationException.class, TooLongFrameException.class);
}
testServer.shutdown();
}
use of com.linkedin.r2.message.RequestContext in project rest.li by linkedin.
the class RestLiIntTestServer method createServer.
public static HttpServer createServer(final Engine engine, int port, boolean useAsyncServletApi, int asyncTimeOut, List<? extends Filter> filters, final FilterChain filterChain, final boolean forceUseRestServer) {
RestLiConfig config = new RestLiConfig();
config.addResourcePackageNames(RESOURCE_PACKAGE_NAMES);
config.setServerNodeUri(URI.create("http://localhost:" + port));
config.setDocumentationRequestHandler(new DefaultDocumentationRequestHandler());
config.addDebugRequestHandlers(new ParseqTraceDebugRequestHandler());
config.setFilters(filters);
GroupMembershipMgr membershipMgr = new HashGroupMembershipMgr();
GroupMgr groupMgr = new HashMapGroupMgr(membershipMgr);
GroupsRestApplication app = new GroupsRestApplication(groupMgr, membershipMgr);
SimpleBeanProvider beanProvider = new SimpleBeanProvider();
beanProvider.add("GroupsRestApplication", app);
//using InjectMockResourceFactory to keep examples spring-free
ResourceFactory factory = new InjectMockResourceFactory(beanProvider);
//Todo this will have to change further to accomodate streaming tests - this is temporary
final TransportDispatcher dispatcher;
if (forceUseRestServer) {
dispatcher = new DelegatingTransportDispatcher(new RestLiServer(config, factory, engine));
} else {
final StreamRequestHandler streamRequestHandler = new RestLiServer(config, factory, engine);
dispatcher = new TransportDispatcher() {
@Override
public void handleRestRequest(RestRequest req, Map<String, String> wireAttrs, RequestContext requestContext, TransportCallback<RestResponse> callback) {
throw new UnsupportedOperationException("This server only accepts streaming");
}
@Override
public void handleStreamRequest(StreamRequest req, Map<String, String> wireAttrs, RequestContext requestContext, TransportCallback<StreamResponse> callback) {
try {
streamRequestHandler.handleRequest(req, requestContext, new TransportCallbackAdapter<>(callback));
} catch (Exception e) {
final Exception ex = RestException.forError(RestStatus.INTERNAL_SERVER_ERROR, e);
callback.onResponse(TransportResponseImpl.<StreamResponse>error(ex));
}
}
};
}
return new HttpServerFactory(filterChain).createServer(port, HttpServerFactory.DEFAULT_CONTEXT_PATH, HttpServerFactory.DEFAULT_THREAD_POOL_SIZE, dispatcher, useAsyncServletApi ? HttpJettyServer.ServletType.ASYNC_EVENT : HttpJettyServer.ServletType.RAP, asyncTimeOut, !forceUseRestServer);
}
use of com.linkedin.r2.message.RequestContext in project rest.li by linkedin.
the class AllPartitionsRequestBuilder method sendRequests.
/**
* A convenience function for caller to issue search request with one call.
* If finer-grain control is required, users should call buildRequestContexts instead and send requests by themselves
*
* @param client - the RestClient to use
* @param request - the query-all request
* @param requestContext - the original request context
* @param callback - callback to be used for each request
* @return the partition cover which informs the caller the RequestContexts, the total number of partitions and the available partition number
* @throws ServiceUnavailableException
*/
public HostSet sendRequests(RestClient client, Request<T> request, RequestContext requestContext, Callback<Response<T>> callback) throws ServiceUnavailableException {
URI serviceUri;
try {
serviceUri = new URI(D2_URI_PREFIX + request.getServiceName());
} catch (URISyntaxException e) {
throw new IllegalArgumentException(e);
}
final Collection<RequestContext> queryAllRequestContext = new ArrayList<RequestContext>();
final HostSet uriResult = _mapper.getAllPartitionsMultipleHosts(serviceUri, 1);
for (URI targetHost : uriResult.getAllHosts()) {
RequestContext context = requestContext.clone();
KeyMapper.TargetHostHints.setRequestContextTargetHost(context, targetHost);
queryAllRequestContext.add(context);
client.sendRequest(request, context, callback);
}
return uriResult;
}
use of com.linkedin.r2.message.RequestContext in project rest.li by linkedin.
the class ScatterGatherBuilder method buildRequestsV2.
// return value contains the request info and the unmapped keys (also the cause)
// V2 is here to differentiate it from the older API
@SuppressWarnings("deprecation")
public ScatterGatherResult<T> buildRequestsV2(BatchGetRequest<T> request, RequestContext requestContext) throws ServiceUnavailableException {
Set<Object> idObjects = request.getObjectIds();
MapKeyResult<URI, Object> mapKeyResult = mapKeys(request, idObjects);
Map<URI, Collection<Object>> batches = mapKeyResult.getMapResult();
Collection<RequestInfo<T>> scatterGatherRequests = new ArrayList<RequestInfo<T>>(batches.size());
for (Map.Entry<URI, Collection<Object>> batch : batches.entrySet()) {
BatchGetRequestBuilder<Object, T> builder = new BatchGetRequestBuilder<Object, T>(request.getBaseUriTemplate(), request.getResponseDecoder(), request.getResourceSpec(), request.getRequestOptions());
builder.ids(batch.getValue());
for (Map.Entry<String, Object> param : request.getQueryParamsObjects().entrySet()) {
if (!param.getKey().equals(RestConstants.QUERY_BATCH_IDS_PARAM)) {
// keep all non-batch query parameters since they could be request specific
builder.setParam(param.getKey(), param.getValue());
}
}
for (Map.Entry<String, String> header : request.getHeaders().entrySet()) {
builder.setHeader(header.getKey(), header.getValue());
}
RequestContext context = requestContext.clone();
KeyMapper.TargetHostHints.setRequestContextTargetHost(context, batch.getKey());
scatterGatherRequests.add(new RequestInfo<T>(builder.build(), context));
}
return new ScatterGatherResult<T>(scatterGatherRequests, mapKeyResult.getUnmappedKeys());
}
use of com.linkedin.r2.message.RequestContext in project rest.li by linkedin.
the class ScatterGatherBuilder method buildRequests.
@SuppressWarnings("deprecation")
public <K> KVScatterGatherResult<K, UpdateStatus> buildRequests(BatchUpdateRequest<K, T> request, RequestContext requestContext) throws ServiceUnavailableException {
Set<Object> idObjects = request.getObjectIds();
Collection<K> ids = new HashSet<K>(idObjects.size());
for (Object o : idObjects) {
@SuppressWarnings("unchecked") K k = (K) o;
ids.add(k);
}
MapKeyResult<URI, K> mapKeyResult = mapKeys(request, ids);
@SuppressWarnings("unchecked") TypeSpec<T> valueType = (TypeSpec<T>) request.getResourceProperties().getValueType();
Map<URI, Map<K, T>> batches = keyMapToInput(mapKeyResult, request);
Collection<KVRequestInfo<K, UpdateStatus>> scatterGatherRequests = new ArrayList<KVRequestInfo<K, UpdateStatus>>(batches.size());
for (Map.Entry<URI, Map<K, T>> batch : batches.entrySet()) {
BatchUpdateRequestBuilder<K, T> builder = new BatchUpdateRequestBuilder<K, T>(request.getBaseUriTemplate(), valueType.getType(), request.getResourceSpec(), request.getRequestOptions());
builder.inputs(batch.getValue());
for (Map.Entry<String, Object> param : request.getQueryParamsObjects().entrySet()) {
if (!param.getKey().equals(RestConstants.QUERY_BATCH_IDS_PARAM)) {
builder.setParam(param.getKey(), param.getValue());
}
}
for (Map.Entry<String, String> header : request.getHeaders().entrySet()) {
builder.setHeader(header.getKey(), header.getValue());
}
RequestContext context = requestContext.clone();
KeyMapper.TargetHostHints.setRequestContextTargetHost(context, batch.getKey());
scatterGatherRequests.add(new KVRequestInfo<K, UpdateStatus>(builder.build(), context));
}
return new KVScatterGatherResult<K, UpdateStatus>(scatterGatherRequests, mapKeyResult.getUnmappedKeys());
}
Aggregations