f1495e1945
Motivation: GraalVM native images are a new way to deliver java applications. Netty is one of the most popular libraries however there are a few limitations that make it impossible to use with native images out of the box. Adding a few metadata (in specific modules will allow the compilation to success and produce working binaries) Modification: Added properties files in `META-INF` and substitutions classes (under `internal.svm`) will solve the compilation issues. The substitutions classes are not visible and do not have a public constructor so they are not visible to end users. Result: Fixes #8959 This fix is very conservative as it applies the minimum config required to build: * pure netty servers * vert.x applications * grpc applications The build is having trouble due to checkstyle which does not seem to be able to find the copyright notice on property files.
68 lines
2.6 KiB
Java
68 lines
2.6 KiB
Java
/*
|
|
* Copyright 2013 The Netty Project
|
|
*
|
|
* The Netty Project licenses this file to you under the Apache License,
|
|
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
package io.netty.testsuite.svm;
|
|
|
|
import io.netty.buffer.Unpooled;
|
|
import io.netty.channel.ChannelFutureListener;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.channel.SimpleChannelInboundHandler;
|
|
import io.netty.handler.codec.http.DefaultFullHttpResponse;
|
|
import io.netty.handler.codec.http.FullHttpResponse;
|
|
import io.netty.handler.codec.http.HttpObject;
|
|
import io.netty.handler.codec.http.HttpUtil;
|
|
import io.netty.handler.codec.http.HttpRequest;
|
|
import io.netty.util.AsciiString;
|
|
|
|
import static io.netty.handler.codec.http.HttpHeaderNames.*;
|
|
import static io.netty.handler.codec.http.HttpResponseStatus.*;
|
|
import static io.netty.handler.codec.http.HttpVersion.*;
|
|
|
|
public class HttpNativeServerHandler extends SimpleChannelInboundHandler<HttpObject> {
|
|
private static final byte[] CONTENT = { 'H', 'e', 'l', 'l', 'o', ' ', 'N', 'a', 't', 'i', 'v', 'e' };
|
|
|
|
private static final AsciiString KEEP_ALIVE = AsciiString.cached("keep-alive");
|
|
|
|
@Override
|
|
public void channelReadComplete(ChannelHandlerContext ctx) {
|
|
ctx.flush();
|
|
}
|
|
|
|
@Override
|
|
public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) {
|
|
if (msg instanceof HttpRequest) {
|
|
HttpRequest req = (HttpRequest) msg;
|
|
|
|
boolean keepAlive = HttpUtil.isKeepAlive(req);
|
|
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(CONTENT));
|
|
response.headers().set(CONTENT_TYPE, "text/plain");
|
|
response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes());
|
|
|
|
if (!keepAlive) {
|
|
ctx.write(response).addListener(ChannelFutureListener.CLOSE);
|
|
} else {
|
|
response.headers().set(CONNECTION, KEEP_ALIVE);
|
|
ctx.write(response);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
|
cause.printStackTrace();
|
|
ctx.close();
|
|
}
|
|
}
|