use of com.linkedin.r2.message.rest.RestResponse in project rest.li by linkedin.
the class RestLiResponseHandler method buildResponse.
/**
* Build a RestResponse from PartialRestResponse and RoutingResult.
*
* @param routingResult
* {@link RoutingResult}
* @param partialResponse
* {@link PartialRestResponse}
* @return
*/
public RestResponse buildResponse(final RoutingResult routingResult, PartialRestResponse partialResponse) {
List<String> cookies = CookieUtil.encodeSetCookies(partialResponse.getCookies());
RestResponseBuilder builder = new RestResponseBuilder().setHeaders(partialResponse.getHeaders()).setCookies(cookies).setStatus(partialResponse.getStatus().getCode());
if (partialResponse.hasData()) {
DataMap dataMap = partialResponse.getDataMap();
String mimeType = ((ServerResourceContext) routingResult.getContext()).getResponseMimeType();
builder = encodeResult(mimeType, builder, dataMap);
}
return builder.build();
}
use of com.linkedin.r2.message.rest.RestResponse in project rest.li by linkedin.
the class TestRestLiServer method setUpServer.
private void setUpServer(Engine engine) {
RestLiConfig config = new RestLiConfig();
config.addResourcePackageNames("com.linkedin.restli.server.twitter");
_resourceFactory = new EasyMockResourceFactory();
RestLiDebugRequestHandler debugRequestHandlerA = new RestLiDebugRequestHandler() {
@Override
public void handleRequest(final RestRequest request, final RequestContext context, final ResourceDebugRequestHandler resourceRequestHandler, final RestLiAttachmentReader attachmentReader, final RequestExecutionCallback<RestResponse> callback) {
handleRequestWithCustomResponse(callback, DEBUG_HANDLER_RESPONSE_A);
}
@Override
public String getHandlerId() {
return "a";
}
};
RestLiDebugRequestHandler debugRequestHandlerB = new RestLiDebugRequestHandler() {
@Override
@SuppressWarnings("unchecked")
public void handleRequest(final RestRequest request, final RequestContext context, final ResourceDebugRequestHandler resourceRequestHandler, final RestLiAttachmentReader attachmentReader, final RequestExecutionCallback<RestResponse> callback) {
resourceRequestHandler.handleRequest(request, context, EasyMock.createMock(RequestExecutionCallback.class));
handleRequestWithCustomResponse(callback, DEBUG_HANDLER_RESPONSE_B);
}
@Override
public String getHandlerId() {
return "b";
}
};
config.addDebugRequestHandlers(debugRequestHandlerA, debugRequestHandlerB);
_server = new RestLiServer(config, _resourceFactory, engine);
}
use of com.linkedin.r2.message.rest.RestResponse in project rest.li by linkedin.
the class RAPResponseHandler method channelRead0.
@Override
protected void channelRead0(ChannelHandlerContext ctx, RestResponse response) throws Exception {
final Map<String, String> headers = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
final Map<String, String> wireAttrs = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
headers.putAll(response.getHeaders());
wireAttrs.putAll(WireAttributeHelper.removeWireAttributes(headers));
final RestResponse newResponse = new RestResponseBuilder(response).unsafeSetHeaders(headers).build();
// In general there should always be a callback to handle a received message,
// but it could have been removed due to a previous exception or closure on the
// channel
TransportCallback<RestResponse> callback = ctx.channel().attr(CALLBACK_ATTR_KEY).getAndRemove();
if (callback != null) {
LOG.debug("{}: handling a response", ctx.channel().remoteAddress());
callback.onResponse(TransportResponseImpl.success(newResponse, wireAttrs));
} else {
LOG.debug("{}: dropped a response", ctx.channel().remoteAddress());
}
ctx.fireChannelRead(response);
}
use of com.linkedin.r2.message.rest.RestResponse in project rest.li by linkedin.
the class TestChannelPoolHandler method testConnectionClose.
@Test(dataProvider = "connectionClose")
public void testConnectionClose(String headerName, String headerValue) {
EmbeddedChannel ch = new EmbeddedChannel(new ChannelPoolHandler());
FakePool pool = new FakePool();
ch.attr(ChannelPoolHandler.CHANNEL_POOL_ATTR_KEY).set(pool);
RestResponse response = new RestResponseBuilder().setHeader(headerName, headerValue).build();
ch.writeInbound(response);
Assert.assertTrue(pool.isDisposeCalled());
Assert.assertFalse(pool.isPutCalled());
}
use of com.linkedin.r2.message.rest.RestResponse in project rest.li by linkedin.
the class HttpNettyClient method shutdown.
@Override
public void shutdown(final Callback<None> callback) {
LOG.info("Shutdown requested");
if (_state.compareAndSet(State.RUNNING, State.SHUTTING_DOWN)) {
LOG.info("Shutting down");
final long deadline = System.currentTimeMillis() + _shutdownTimeout;
TimeoutCallback<None> closeChannels = new TimeoutCallback<None>(_scheduler, _shutdownTimeout, TimeUnit.MILLISECONDS, new Callback<None>() {
private void finishShutdown() {
_state.set(State.REQUESTS_STOPPING);
// Timeout any waiters which haven't received a Channel yet
for (Callback<Channel> callback : _channelPoolManager.cancelWaiters()) {
callback.onError(new TimeoutException("Operation did not complete before shutdown"));
}
// Timeout any requests still pending response
for (Channel c : _allChannels) {
TransportCallback<RestResponse> callback = c.attr(RAPResponseHandler.CALLBACK_ATTR_KEY).getAndRemove();
if (callback != null) {
errorResponse(callback, new TimeoutException("Operation did not complete before shutdown"));
}
}
// Close all active and idle Channels
final TimeoutRunnable afterClose = new TimeoutRunnable(_scheduler, deadline - System.currentTimeMillis(), TimeUnit.MILLISECONDS, new Runnable() {
@Override
public void run() {
_state.set(State.SHUTDOWN);
LOG.info("Shutdown complete");
callback.onSuccess(None.none());
}
}, "Timed out waiting for channels to close, continuing shutdown");
_allChannels.close().addListener(new ChannelGroupFutureListener() {
@Override
public void operationComplete(ChannelGroupFuture channelGroupFuture) throws Exception {
if (!channelGroupFuture.isSuccess()) {
LOG.warn("Failed to close some connections, ignoring");
}
afterClose.run();
}
});
}
@Override
public void onSuccess(None none) {
LOG.info("All connection pools shut down, closing all channels");
finishShutdown();
}
@Override
public void onError(Throwable e) {
LOG.warn("Error shutting down HTTP connection pools, ignoring and continuing shutdown", e);
finishShutdown();
}
}, "Connection pool shutdown timeout exceeded (" + _shutdownTimeout + "ms)");
_channelPoolManager.shutdown(closeChannels);
_jmxManager.onProviderShutdown(_channelPoolManager);
} else {
callback.onError(new IllegalStateException("Shutdown has already been requested."));
}
}
Aggregations