更新http服务器 剔除反射功能
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
import 'dart:io';
|
||||
import 'dart:mirrors';
|
||||
|
||||
import 'package:EasyDartModule/EasyDartModule.dart';
|
||||
import 'package:EasyDartModule/base/logger/Logger.dart';
|
||||
@@ -50,7 +49,7 @@ class ShelfWebServer implements WebServer {
|
||||
} catch (e, s) {
|
||||
if (e is HijackException) {
|
||||
//不能处理该异常直接抛出
|
||||
throw e;
|
||||
rethrow;
|
||||
}
|
||||
stopwatch.stop();
|
||||
logger.error("| 服务器错误 | ${e.toString()} ${s.toString()}",
|
||||
@@ -135,12 +134,24 @@ class ShelfWebServer implements WebServer {
|
||||
}
|
||||
|
||||
@override
|
||||
void start(int port) async {
|
||||
void start(int port, {Function? interceptor}) async {
|
||||
//反射获取全部路由地址
|
||||
final handler = Pipeline()
|
||||
var pipeline = Pipeline()
|
||||
.addMiddleware(requestIdMiddleware())
|
||||
.addMiddleware(logRequests())
|
||||
.addHandler(_routerHandler);
|
||||
.addMiddleware(logRequests());
|
||||
//判断拦截器类型
|
||||
if (interceptor != null) {
|
||||
pipeline = pipeline.addMiddleware((Handler innerHandler) {
|
||||
return (Request request) async {
|
||||
var response = interceptor(request);
|
||||
if (response == null) {
|
||||
return innerHandler(request);
|
||||
}
|
||||
return response;
|
||||
};
|
||||
});
|
||||
}
|
||||
final handler = pipeline.addHandler(_routerHandler);
|
||||
_server = await serve(handler, InternetAddress.anyIPv4, port);
|
||||
print('Server listening on port ${_server?.port}');
|
||||
}
|
||||
@@ -152,88 +163,63 @@ class ShelfWebServer implements WebServer {
|
||||
|
||||
@override
|
||||
void addHandler(handler) {
|
||||
ClassMirror cm = reflectClass(handler.runtimeType);
|
||||
var im = reflect(handler);
|
||||
String path = "";
|
||||
for (var metadata in cm.metadata) {
|
||||
// 检查元数据是否为RequestMapping类型
|
||||
if (metadata.reflectee is RequestMapping) {
|
||||
// 获取实例
|
||||
RequestMapping annotation = metadata.reflectee;
|
||||
path = annotation.path;
|
||||
if (path.endsWith("/")) {
|
||||
path = path.substring(0, path.length - 1);
|
||||
try {
|
||||
handler.callHandler = handler;
|
||||
} catch (e) {
|
||||
print(
|
||||
"请在 ${handler.runtimeType} 中实现set方法 set callHandler(handler) => _callHandler = handler;");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
handler.routeMap.forEach((k, v) {
|
||||
for (var p in v) {
|
||||
if (k == HttpMethod.WS) {
|
||||
addRouter(k, p[0], handler);
|
||||
continue;
|
||||
}
|
||||
addRouter(k, p[0], (req, [a, b, c, d, e, f]) async {
|
||||
//从request中获取token并解码传入
|
||||
String? token = req.headers["token"];
|
||||
dynamic payload;
|
||||
if (token != null) {
|
||||
try {
|
||||
payload = JWT.decode(token).payload;
|
||||
} catch (e) {
|
||||
//jwt解码失败
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
var response;
|
||||
if (p[3] == 2) {
|
||||
response = await p[2](req, payload ?? <String, dynamic>{});
|
||||
} else {
|
||||
response = await p[2](req);
|
||||
}
|
||||
Map<String, String> headers = {...response.headers};
|
||||
headers['Access-Control-Allow-Origin'] = '*';
|
||||
headers['Access-Control-Allow-Headers'] =
|
||||
'Content-Type,X-Span-ID,X-Trace-ID,token';
|
||||
headers["Access-Control-Expose-Headers"] =
|
||||
"Content-Type,X-Span-ID,X-Trace-ID,token";
|
||||
headers['Access-Control-Allow-Methods'] =
|
||||
'GET, POST, PUT, DELETE, OPTIONS';
|
||||
headers["content-type"] = p[1].type;
|
||||
|
||||
response = response.change(headers: headers);
|
||||
|
||||
return response;
|
||||
});
|
||||
}
|
||||
if (annotation.method == HttpMethod.WS) {
|
||||
//wwebsocket处理句柄直接加入路由
|
||||
addRouter(annotation.method, path, handler);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
});
|
||||
} catch (e) {
|
||||
if (e is NoSuchMethodError) {
|
||||
print(
|
||||
"请在 ${handler.runtimeType} 中实现get方法 Map<HttpMethod, List<List>> get routeMap => routes;");
|
||||
return;
|
||||
} else {
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
im.type.declarations.forEach((k, v) {
|
||||
if (v is MethodMirror) {
|
||||
for (var m in v.metadata) {
|
||||
if (m.reflectee is RequestMapping) {
|
||||
var mp = m.reflectee.path as String;
|
||||
|
||||
if (mp.startsWith("/")) {
|
||||
mp = mp.substring(1, mp.length);
|
||||
}
|
||||
|
||||
String p = "$path/$mp";
|
||||
// print("method: ${m.reflectee.method} $p");
|
||||
//把地址加入路由
|
||||
|
||||
addRouter(m.reflectee.method, p, (req, [a, b, c, d, e, f]) async {
|
||||
//从request中获取token并解码传入
|
||||
String? token = req.headers["token"];
|
||||
dynamic payload;
|
||||
if (token != null) {
|
||||
try {
|
||||
payload = JWT.decode(token).payload;
|
||||
} catch (e) {
|
||||
//jwt解码失败
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
List args;
|
||||
if (v.parameters.length == 2) {
|
||||
args = [req, payload ?? <String, dynamic>{}];
|
||||
} else {
|
||||
args = [req];
|
||||
}
|
||||
Response response =
|
||||
await im.invoke(v.simpleName, args).reflectee as Response;
|
||||
//判断contenttype是否定义
|
||||
// var t = response.headers["content-type"];
|
||||
// print(t);
|
||||
Map<String, String> headers = {...response.headers};
|
||||
// if (t == null) {
|
||||
//设置默认contenttype
|
||||
// response = response.change(headers: {
|
||||
// ...response.headers,
|
||||
// "content-type": m.reflectee.responseType.type
|
||||
// });
|
||||
// } else {
|
||||
headers['Access-Control-Allow-Origin'] = '*';
|
||||
headers['Access-Control-Allow-Headers'] =
|
||||
'Content-Type,X-Span-ID,X-Trace-ID';
|
||||
headers['Access-Control-Allow-Methods'] =
|
||||
'GET, POST, PUT, DELETE, OPTIONS';
|
||||
headers["content-type"] = m.reflectee.responseType.type;
|
||||
|
||||
// }
|
||||
response = response.change(headers: headers);
|
||||
|
||||
return response;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void addRouter(HttpMethod method, String path, dynamic handler) {
|
||||
@@ -255,7 +241,7 @@ class ShelfWebServer implements WebServer {
|
||||
_router.options(path, (r) {
|
||||
return Response.ok('', headers: {
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Headers': 'Content-Type,X-Span-ID,X-Trace-ID',
|
||||
'Access-Control-Allow-Headers': 'Content-Type,X-Span-ID,X-Trace-ID,token',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user