requestHandler method

Future<void> requestHandler(
  1. HttpRequest request
)

Implementation

Future<void> requestHandler(HttpRequest request) async {
  final errorListeners = <void Function(
    HttpRequest request,
    Object? error,
    StackTrace stackTrace,
  )>[];

  try {
    final extras = <String, Object?>{};

    /// Check Global services
    for (final controller in controllers) {
      errorListeners.add(controller.onError);
      final behavior = await controller.onRequest(request);

      if (!behavior.next) {
        return;
      }

      extras.addAll(behavior.extra);
    }

    /// Find route if request is not cut off from services
    final (routeMapper, pathParameters) = findRoute(request);

    ///! Check route is founded
    if (routeMapper == null) {
      if (onRouteNotFound != null) {
        onRouteNotFound!(request);
        return;
      }

      await request.response.notFound();
      return;
    }

    ///! check methods is allowed for route
    else if (!routeMapper.route.methods.contains(request.method)) {
      await request.response.methodNotAllowed();
      return;
    }

    for (final controller in routeMapper.controllers) {
      errorListeners.add(controller.onError);
      final behavior = await controller.onRequest(request);

      if (!behavior.next) {
        return;
      }

      extras.addAll(behavior.extra);
    }

    final payload = HttpRoutePayload(
      extras: extras,
      pathParameters: pathParameters,
    );

    await routeMapper.route.handler!(request, payload);
  } catch (error, stack) {
    /// Call services
    for (final callback in errorListeners) {
      callback(request, error, stack);
    }

    ///
    if (onError != null) {
      onError!(request, error, stack);
      return;
    }

    await request.response.internalServerError();
  }
}