Files
IM-server-new/broker/src/main/java/com/xiaoleilu/loServer/handler/ActionHandler.java
T

163 lines
5.2 KiB
Java
Raw Normal View History

2019-03-16 17:04:23 +08:00
package com.xiaoleilu.loServer.handler;
2020-12-12 16:15:13 +08:00
import cn.wildfirechat.common.IMExceptionEvent;
2019-03-16 17:04:23 +08:00
import com.xiaoleilu.hutool.lang.Singleton;
import com.xiaoleilu.loServer.ServerSetting;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.action.UnknownErrorAction;
import com.xiaoleilu.loServer.action.FileAction;
import com.xiaoleilu.loServer.filter.Filter;
import io.moquette.spi.IMessagesStore;
import io.moquette.spi.ISessionsStore;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2020-01-10 12:34:31 +08:00
import win.liyufan.im.Utility;
2019-03-16 17:04:23 +08:00
/**
* Action处理单元
2019-06-29 16:42:55 +08:00
*
2019-03-16 17:04:23 +08:00
* @author Looly
*/
abstract public class ActionHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
private static final Logger Logger = LoggerFactory.getLogger(ActionHandler.class);
public ActionHandler(IMessagesStore messagesStore, ISessionsStore sessionsStore) {
Action.messagesStore = messagesStore;
Action.sessionsStore = sessionsStore;
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest fullHttpRequest) throws Exception {
Logger.info("Http request whit url {}", fullHttpRequest.uri());
final Request request = Request.build(ctx, fullHttpRequest);
final Response response = Response.build(ctx, request);
response.setContentType("application/json");
try {
//do filter
boolean isPass = this.doFilter(request, response);
2019-06-29 16:42:55 +08:00
2019-03-16 17:04:23 +08:00
if(isPass){
//do action
this.doAction(ctx, request, response);
}
} catch (Exception e) {
2019-12-24 11:43:47 +08:00
e.printStackTrace();
2020-12-12 16:15:13 +08:00
Utility.printExecption(Logger, e, IMExceptionEvent.EventType.SHORT_LINK_Exception);
2019-03-16 17:04:23 +08:00
Action errorAction = ServerSetting.getErrorAction(ServerSetting.MAPPING_ERROR);
request.putParam(UnknownErrorAction.ERROR_PARAM_NAME, e);
response.setContent(e.toString());
2021-05-24 10:31:09 +08:00
errorAction.doAction(request, response);
2019-03-16 17:04:23 +08:00
//如果发送请求未被触发,则触发之,否则跳过。
if(!response.isSent()){
response.send();
}
ctx.fireExceptionCaught(e);
ctx.close();
}
2019-06-29 16:42:55 +08:00
2019-03-16 17:04:23 +08:00
}
2019-06-29 16:42:55 +08:00
2019-03-16 17:04:23 +08:00
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
super.exceptionCaught(ctx, cause);
Logger.warn("{}", cause.getMessage());
Channel channel = ctx.channel();
if(channel.isActive())ctx.close();
}
2019-06-29 16:42:55 +08:00
2019-03-16 17:04:23 +08:00
//---------------------------------------------------------------------------------------- Private method start
/**
* 执行过滤
* @param request 请求
* @param response 响应
* @@return 是否继续
*/
private boolean doFilter(Request request, Response response) {
//全局过滤器
Filter filter = ServerSetting.getFilter(ServerSetting.MAPPING_ALL);
if(null != filter){
if(false == filter.doFilter(request, response)){
return false;
}
}
2019-06-29 16:42:55 +08:00
2019-03-16 17:04:23 +08:00
//自定义Path过滤器
filter = ServerSetting.getFilter(request.getPath());
if(null != filter){
if(false == filter.doFilter(request, response)){
return false;
}
}
2019-06-29 16:42:55 +08:00
2019-03-16 17:04:23 +08:00
return true;
}
abstract boolean isValidePath(String path);
/**
* 执行Action
* @param request 请求对象
* @param response 响应对象
*/
private void doAction(ChannelHandlerContext ctx, Request request, Response response){
2020-02-27 13:53:25 +08:00
if(("/route".equalsIgnoreCase(request.getPath()) || request.getPath().startsWith("/fs/"))
&& "OPTIONS".equalsIgnoreCase(request.getMethod())){
2019-06-29 16:42:55 +08:00
handleOptions(ctx, request, response);
return;
}
2022-08-22 15:28:24 +08:00
if ("HEAD".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpResponseStatus.OK);
response.send();
return;
}
2019-03-16 17:04:23 +08:00
Action action;
if (isValidePath(request.getPath())) {
action = ServerSetting.getAction(request.getPath(), request.getMethod().toUpperCase());
} else {
action = ServerSetting.getErrorAction(ServerSetting.MAPPING_ERROR);
}
if (action == null && (request.getPath().startsWith("/api") || request.getPath().startsWith("/admin"))) {
action = ServerSetting.getErrorAction(ServerSetting.MAPPING_ERROR);
}
if (null == action) {
//查找匹配所有路径的Action
action = ServerSetting.getAction(ServerSetting.MAPPING_ALL, request.getMethod());
if(null == action){
// 非Action方法,调用静态文件读取
action = Singleton.get(FileAction.class);
}
}
action.ctx = ctx;
2021-05-24 10:31:09 +08:00
boolean isSync = action.doAction(request, response);
2019-03-16 17:04:23 +08:00
if(isSync) {
//如果发送请求未被触发,则触发之,否则跳过。
if(!response.isSent()){
response.send();
}
}
}
//---------------------------------------------------------------------------------------- Private method start
2019-06-29 16:42:55 +08:00
private void handleOptions(ChannelHandlerContext ctx, Request request, Response response){
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.send();
}
2019-03-16 17:04:23 +08:00
}