Skip to content

Commit

Permalink
🎨 improving structure
Browse files Browse the repository at this point in the history
  • Loading branch information
hellokaton committed Jul 10, 2018
1 parent bc1d727 commit 6eddafc
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 49 deletions.
6 changes: 4 additions & 2 deletions src/main/java/com/blade/server/netty/NettyServerGroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import lombok.Getter;

/**
* NettyServerGroup
*
* @author biezhi
* @date 2017/9/22
*/
Expand All @@ -14,6 +16,6 @@
public class NettyServerGroup {

private Class<? extends ServerSocketChannel> socketChannel;
private MultithreadEventLoopGroup boosGroup;
private MultithreadEventLoopGroup workerGroup;
private MultithreadEventLoopGroup boosGroup;
private MultithreadEventLoopGroup workerGroup;
}
67 changes: 30 additions & 37 deletions src/main/java/com/blade/server/netty/RouteMethodHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import io.netty.handler.codec.http.cookie.Cookie;
import io.netty.handler.stream.ChunkedStream;
import lombok.extern.slf4j.Slf4j;
import lombok.var;

import java.io.InputStream;
import java.io.StringWriter;
Expand All @@ -36,7 +36,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static com.blade.kit.BladeKit.log404;
import static com.blade.server.netty.HttpConst.CONTENT_LENGTH;
Expand All @@ -62,28 +61,24 @@ public void handleResponse(Response response, ChannelHandlerContext context, boo
response.body().write(new BodyWriter<Void>() {
@Override
public Void onText(StringBody body) {
handleFullResponse(
createFullResponse(response.statusCode(), keepAlive, response.headers(), response.cookiesRaw(), body.content()),
context, keepAlive);
return null;
return handleFullResponse(createFullResponse(response, body.content()), context, keepAlive);
}

@Override
public Void onStream(StreamBody body) {
handleStreamResponse(response.statusCode(), response.headers(), body.content(), context, keepAlive);
return null;
return handleStreamResponse(response, body.content(), context, keepAlive);
}

@Override
public Void onView(ViewBody body) {
StringWriter sw = new StringWriter();
try {
var sw = new StringWriter();

WebContext.blade().templateEngine().render(body.modelAndView(), sw);

response.contentType(Const.CONTENT_TYPE_HTML);

handleFullResponse(
createFullResponse(response.statusCode(), keepAlive, response.headers(), response.cookiesRaw(), sw.toString()),
context, keepAlive);
return handleFullResponse(createFullResponse(response, sw.toString()), context, keepAlive);
} catch (Exception e) {
log.error("Render view error", e);
}
Expand All @@ -92,21 +87,17 @@ public Void onView(ViewBody body) {

@Override
public Void onEmpty(EmptyBody emptyBody) {
handleFullResponse(
createFullResponse(response.statusCode(), keepAlive, response.headers(), response.cookiesRaw(), ""),
context, keepAlive);
return null;
return handleFullResponse(createFullResponse(response, ""), context, keepAlive);
}

@Override
public Void onRawBody(RawBody body) {
handleFullResponse(body.httpResponse(), context, keepAlive);
return null;
return handleFullResponse(body.httpResponse(), context, keepAlive);
}
});
}

public void handleFullResponse(FullHttpResponse response, ChannelHandlerContext context, boolean keepAlive) {
public Void handleFullResponse(FullHttpResponse response, ChannelHandlerContext context, boolean keepAlive) {
if (context.channel().isActive()) {
if (!keepAlive) {
context.write(response).addListener(ChannelFutureListener.CLOSE);
Expand All @@ -116,46 +107,48 @@ public void handleFullResponse(FullHttpResponse response, ChannelHandlerContext
}
context.flush();
}
return null;
}

public Map<String, String> getDefaultHeader(boolean keepAlive) {
Map<String, String> map = new HashMap<>();
public Map<String, String> getDefaultHeader() {
var map = new HashMap<String, String>();
map.put(HttpConst.DATE.toString(), HttpServerInitializer.date.toString());
map.put(HttpConst.X_POWER_BY.toString(), HttpConst.VERSION.toString());
if (keepAlive) {
map.put(HttpConst.CONNECTION.toString(), "keep-alive");
}
return map;
}

public void handleStreamResponse(int status, Map<String, String> headers, InputStream body,
public Void handleStreamResponse(Response response, InputStream body,
ChannelHandlerContext context, boolean keepAlive) {
DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(status));
response.headers().set(TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
headers.forEach((key, value) -> response.headers().set(key, value));

var httpResponse = new DefaultHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(response.statusCode()));

httpResponse.headers().set(TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);

response.headers().forEach((key, value) -> httpResponse.headers().set(key, value));
context.write(response);

context.write(new ChunkedStream(body));
ChannelFuture lastContentFuture = context.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
if (!keepAlive) {
lastContentFuture.addListener(ChannelFutureListener.CLOSE);
}
return null;
}

public FullHttpResponse createFullResponse(int status, boolean keepAlive, Map<String, String> headers, Set<Cookie> cookies, String body) {
headers.putAll(getDefaultHeader(keepAlive));
public FullHttpResponse createFullResponse(Response response, String body) {
Map<String, String> headers = response.headers();
headers.putAll(getDefaultHeader());

if (cookies.size() > 0) {
cookies.forEach(cookie -> headers.put(HttpConst.SET_COOKIE.toString(), io.netty.handler.codec.http.cookie.ServerCookieEncoder.LAX.encode(cookie)));
if (response.cookiesRaw().size() > 0) {
response.cookiesRaw().forEach(cookie -> headers.put(HttpConst.SET_COOKIE.toString(), io.netty.handler.codec.http.cookie.ServerCookieEncoder.LAX.encode(cookie)));
}

FullHttpResponse response = new DefaultFullHttpResponse(
HTTP_1_1, HttpResponseStatus.valueOf(status),
var httpResponse = new DefaultFullHttpResponse(HTTP_1_1, HttpResponseStatus.valueOf(response.statusCode()),
body.isEmpty() ? Unpooled.buffer(0) : Unpooled.wrappedBuffer(body.getBytes(StandardCharsets.UTF_8)));

response.headers().set(CONTENT_LENGTH, response.content().readableBytes());
headers.forEach((key, value) -> response.headers().set(key, value));
return response;
httpResponse.headers().set(CONTENT_LENGTH, httpResponse.content().readableBytes());
headers.forEach((key, value) -> httpResponse.headers().set(key, value));
return httpResponse;
}

/**
Expand Down
21 changes: 11 additions & 10 deletions src/main/java/com/blade/server/netty/StaticFileHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import io.netty.handler.stream.ChunkedFile;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import lombok.var;

import java.io.*;
import java.net.URLConnection;
Expand Down Expand Up @@ -74,11 +75,10 @@ public void handle(ChannelHandlerContext ctx, Request request, Response response
return;
}

Instant start = Instant.now();

String uri = URLDecoder.decode(request.uri(), "UTF-8");
String cleanUri = PathKit.cleanPath(uri.replaceFirst(request.contextPath(), "/"));
String method = StringKit.padRight(request.method(), 6);
String uri = URLDecoder.decode(request.uri(), "UTF-8");
Instant start = Instant.now();
String cleanUri = PathKit.cleanPath(uri.replaceFirst(request.contextPath(), "/"));
String method = StringKit.padRight(request.method(), 6);

if (cleanUri.startsWith(Const.WEB_JARS)) {
InputStream input = StaticFileHandler.class.getResourceAsStream("/META-INF/resources" + uri);
Expand Down Expand Up @@ -190,7 +190,7 @@ public void handle(ChannelHandlerContext ctx, Request request, Response response

private boolean writeJarResource(ChannelHandlerContext ctx, Request request, String uri, InputStream input) throws IOException {

StaticInputStream staticInputStream = new StaticInputStream(input);
var staticInputStream = new StaticInputStream(input);

int size = staticInputStream.size();

Expand Down Expand Up @@ -275,7 +275,7 @@ private void setDateAndCacheHeaders(HttpResponse response, File fileToCache) {
private static final Pattern ALLOWED_FILE_NAME = Pattern.compile("[^-._]?[^<>&\"]*");

private static void sendListing(ChannelHandlerContext ctx, String uri, File dir, String dirPath) {
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK);
var response = new DefaultFullHttpResponse(HTTP_1_1, OK);
response.headers().set(HttpConst.CONTENT_TYPE, "text/html; charset=UTF-8");
StringBuilder buf = new StringBuilder()
.append("<!DOCTYPE html>\r\n")
Expand Down Expand Up @@ -305,7 +305,7 @@ private static void sendListing(ChannelHandlerContext ctx, String uri, File dir,

if (dirs.length > 2) {
String parent = uri.substring(0, uri.lastIndexOf("/"));
buf.append("<li><a href='"+ parent +"' title='' class=''>..<i></i></li>");
buf.append("<li><a href='" + parent + "' title='' class=''>..<i></i></li>");
}

for (File f: Objects.requireNonNull(dir.listFiles())) {
Expand Down Expand Up @@ -349,8 +349,9 @@ private static void sendListing(ChannelHandlerContext ctx, String uri, File dir,
}

private static void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) {
FullHttpResponse response = new DefaultFullHttpResponse(
HTTP_1_1, status, Unpooled.copiedBuffer("Failure: " + status + "\r\n", CharsetUtil.UTF_8));
var response = new DefaultFullHttpResponse(HTTP_1_1, status,
Unpooled.copiedBuffer("Failure: " + status + "\r\n", CharsetUtil.UTF_8));

response.headers().set(HttpConst.CONTENT_TYPE, Const.CONTENT_TYPE_TEXT);
// Close the connection as soon as the error message is sent.
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
Expand Down

0 comments on commit 6eddafc

Please sign in to comment.