use of ratpack.handling.Handler in project ratpack by ratpack.
the class DefaultRatpackServer method buildAdapter.
protected NettyHandlerAdapter buildAdapter(DefinitionBuild definition) throws Exception {
LOGGER.info("Building registry...");
serverRegistry = buildServerRegistry(definition.getServerConfig(), definition.getUserRegistryFactory());
Handler ratpackHandler = buildRatpackHandler(serverRegistry, definition.getHandlerFactory());
ratpackHandler = decorateHandler(ratpackHandler, serverRegistry);
servicesGraph = new ServicesGraph(serverRegistry);
servicesGraph.start(new DefaultEvent(serverRegistry, reloading));
return new NettyHandlerAdapter(serverRegistry, ratpackHandler);
}
use of ratpack.handling.Handler in project ratpack by ratpack.
the class NettyHandlerAdapter method newRequest.
private void newRequest(final ChannelHandlerContext ctx, final HttpRequest nettyRequest) throws Exception {
if (!nettyRequest.decoderResult().isSuccess()) {
sendError(ctx, HttpResponseStatus.BAD_REQUEST);
return;
}
Headers requestHeaders = new NettyHeadersBackedHeaders(nettyRequest.headers());
//Find the content length we will use this as an indicator of a body
Long contentLength = HttpUtil.getContentLength(nettyRequest, -1L);
String transferEncoding = requestHeaders.get(HttpHeaderNames.TRANSFER_ENCODING);
//If there is a content length or transfer encoding that indicates there is a body
boolean hasBody = (contentLength > 0) || (transferEncoding != null);
RequestBody requestBody = hasBody ? new RequestBody(contentLength, nettyRequest, ctx) : null;
final Channel channel = ctx.channel();
if (requestBody != null) {
channel.attr(BODY_ACCUMULATOR_KEY).set(requestBody);
}
InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();
InetSocketAddress socketAddress = (InetSocketAddress) channel.localAddress();
final DefaultRequest request = new DefaultRequest(Instant.now(), requestHeaders, nettyRequest.method(), nettyRequest.protocolVersion(), nettyRequest.uri(), remoteAddress, socketAddress, serverRegistry.get(ServerConfig.class), requestBody);
final HttpHeaders nettyHeaders = new DefaultHttpHeaders(false);
final MutableHeaders responseHeaders = new NettyHeadersBackedMutableHeaders(nettyHeaders);
final AtomicBoolean transmitted = new AtomicBoolean(false);
final DefaultResponseTransmitter responseTransmitter = new DefaultResponseTransmitter(transmitted, channel, nettyRequest, request, nettyHeaders, requestBody);
ctx.channel().attr(DefaultResponseTransmitter.ATTRIBUTE_KEY).set(responseTransmitter);
Action<Action<Object>> subscribeHandler = thing -> {
transmitted.set(true);
ctx.channel().attr(CHANNEL_SUBSCRIBER_ATTRIBUTE_KEY).set(thing);
};
final DefaultContext.RequestConstants requestConstants = new DefaultContext.RequestConstants(applicationConstants, request, channel, responseTransmitter, subscribeHandler);
final Response response = new DefaultResponse(responseHeaders, ctx.alloc(), responseTransmitter);
requestConstants.response = response;
DefaultContext.start(channel.eventLoop(), requestConstants, serverRegistry, handlers, execution -> {
if (requestBody != null) {
requestBody.close();
channel.attr(BODY_ACCUMULATOR_KEY).set(null);
}
if (!transmitted.get()) {
Handler lastHandler = requestConstants.handler;
StringBuilder description = new StringBuilder();
description.append("No response sent for ").append(request.getMethod().getName()).append(" request to ").append(request.getUri());
if (lastHandler != null) {
description.append(" (last handler: ");
if (lastHandler instanceof DescribingHandler) {
((DescribingHandler) lastHandler).describeTo(description);
} else {
DescribingHandlers.describeTo(lastHandler, description);
}
description.append(")");
}
String message = description.toString();
LOGGER.warn(message);
response.getHeaders().clear();
ByteBuf body;
if (development) {
CharBuffer charBuffer = CharBuffer.wrap(message);
body = ByteBufUtil.encodeString(ctx.alloc(), charBuffer, CharsetUtil.UTF_8);
response.contentType(HttpHeaderConstants.PLAIN_TEXT_UTF8);
} else {
body = Unpooled.EMPTY_BUFFER;
}
response.getHeaders().set(HttpHeaderConstants.CONTENT_LENGTH, body.readableBytes());
responseTransmitter.transmit(HttpResponseStatus.INTERNAL_SERVER_ERROR, body);
}
});
}
use of ratpack.handling.Handler in project ratpack by ratpack.
the class DescribingHandlers method describeTo.
public static void describeTo(Handler handler, StringBuilder stringBuilder) {
Class<? extends Handler> clazz = handler.getClass();
if (clazz.isAnonymousClass()) {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass;
try {
ctClass = pool.get(clazz.getName());
CtBehavior[] behaviors = ctClass.getDeclaredBehaviors();
List<CtBehavior> withLineNumber = Arrays.asList(behaviors).stream().filter(input -> input.getMethodInfo().getLineNumber(0) > 0).sorted((o1, o2) -> Integer.valueOf(o1.getMethodInfo().getLineNumber(0)).compareTo(o2.getMethodInfo().getLineNumber(0))).collect(Collectors.toList());
if (!withLineNumber.isEmpty()) {
CtBehavior method = withLineNumber.get(0);
int lineNumber = method.getMethodInfo().getLineNumber(0);
ClassFile classFile = ctClass.getClassFile();
String sourceFile = classFile.getSourceFile();
if (lineNumber != -1 && sourceFile != null) {
stringBuilder.append("anonymous class ").append(clazz.getName()).append(" at approximately line ").append(lineNumber).append(" of ").append(sourceFile);
return;
}
}
} catch (NotFoundException ignore) {
// fall through
}
}
stringBuilder.append(clazz.getName());
}
use of ratpack.handling.Handler in project ratpack by ratpack.
the class FactoryHandler method handle.
@Override
public void handle(Context context) throws Exception {
Handler handler = factory.create();
last = handler;
handler.handle(context);
}
use of ratpack.handling.Handler in project ratpack by ratpack.
the class DefaultFileHandlerSpec method build.
public static Handler build(ServerConfig serverConfig, Action<? super FileHandlerSpec> config) throws Exception {
if (!serverConfig.isHasBaseDir()) {
throw new BaseDirRequiredException("no base dir set for application");
}
DefaultFileHandlerSpec spec = new DefaultFileHandlerSpec();
config.execute(spec);
Handler handler = new FileHandler(spec.indexFiles, !serverConfig.isDevelopment());
if (spec.dir != null) {
handler = Handlers.fileSystem(serverConfig, spec.dir, handler);
}
if (spec.path != null) {
handler = Handlers.prefix(spec.path, handler);
}
return handler;
}
Aggregations