httpRoute method

void httpRoute(
  1. String route,
  2. HttpRouteHandler handler, {
  3. HttpTokenConverter? tokenConverter,
  4. Map<String, Object>? responseHeaders,
})

设置http服务的AES加密通讯的动态请求路由,调用过此方法后过启动为web服务器

Implementation

void httpRoute(String route, HttpRouteHandler handler, {HttpTokenConverter? tokenConverter, Map<String, Object>? responseHeaders}) {
  _router ??= Router();
  _router?.post(route, (Request request) async {
    logTrace(['_onHttpRoute <=', request.headers]);
    //合并二进制包
    final requestBytes = <int>[];
    if (_config.binary) {
      final requestBytesList = await request.read().toList();
      for (var element in requestBytesList) {
        requestBytes.addAll(element);
      }
      if (requestBytesList.length > 1) {
        logTrace(['_onHttpRoute <= requestBytesList.length is ${requestBytesList.length}, so merge to one list.']);
      }
    }
    //解析请求数据
    final requestData = _config.binary ? Uint8List.fromList(requestBytes) : await request.readAsString();
    logTrace(['_onHttpRoute <=', requestData]);
    final requestUid = (request.headers['easy-security-identity'] ?? '').trim();
    final requestToken = (tokenConverter == null || requestUid.isEmpty) ? null : await tokenConverter(requestUid);
    final requestPacket = EasySecurity.decrypt(requestData, requestToken ?? _config.pwd);
    if (requestPacket == null) {
      logError(['_onHttpRoute <=', requestData, requestUid, requestToken, requestPacket]);
      return Response.internalServerError(headers: responseHeaders);
    }
    logDebug(['_onHttpRoute <<<<<<', requestPacket]);
    //路由响应数据
    final responsePacket = await handler(request, requestPacket) ?? requestPacket.responseOk();
    logDebug(['_onHttpRoute >>>>>>', responsePacket]);
    final responseData = EasySecurity.encrypt(responsePacket, requestToken ?? _config.pwd, _config.binary);
    if (responseData == null) {
      logError(['_onHttpRoute =>', responsePacket, responseData]);
      return Response.internalServerError(headers: responseHeaders);
    }
    logTrace(['_onHttpRoute =>', responseData]);
    return Response.ok(responseData, headers: {'content-type': _config.binary ? 'application/octet-stream' : 'text/plain'}..addAll(responseHeaders ?? {}));
  });
}