handleRequest method

Future handleRequest(
  1. HttpRequest request
)

Implementation

Future handleRequest(HttpRequest request) async {
  int? serviceId;
  String actionName = 'unknown';
  HttpAction? action;
  try {
    int start = DateTime.now().millisecondsSinceEpoch;
    serviceId = config.getRequired<int>('service_id');
    action = routing.getForRequest(request);
    int queries = 0;
    if (action == null) {
      writeError(request, HttpStatus.notFound, request.uri.toString());
    } else {
      action.stats = Stats(config, serviceId, 'action', action.className);
      try {
        actionName = action.className;
        //TODO: add timeout option
        await action.handleRequest(); //.timeout(new Duration(milliseconds: 1000));
      } on TimeoutException catch (error, stacktrace) {
        writeError(request, HttpStatus.requestTimeout, 'Request Timeout', trace: stacktrace);
      } on Redirect catch (error) {
        request.response.redirect(Uri.http(request.uri.authority, error.uri));
      } on HttpException catch (error, stacktrace) {
        writeError(request, error.code, error.message, trace: stacktrace);
      } catch (error, stacktrace) {
        writeError(request, HttpStatus.internalServerError, 'unknown error occured', trace: stacktrace);
        try {
          await logger.handleError('action.$actionName', error, stacktrace, request: request, requestBody: action.rawBody);
          db.disconnect();
        } catch (e) {
          print('CRITICAL! UNHANDLED ERROR');
          print(e);
        }
      } finally {
        queries = action.db.counter;
        await action.db.disconnect();
      }
    }
    int timeMs = DateTime.now().millisecondsSinceEpoch - start;
    print("T$threadId ${request.method} ${request.uri} ${request.response.statusCode} [${timeMs}ms] [$queries]");
    await request.response.close();

    if (action != null) {
      action.stats?.saveStats(action.db.counter, timeMs);
    }
  } catch (error, stacktrace) {
    try {
      await logger.handleError('action.$actionName', error, stacktrace, request: request, requestBody: action?.rawBody);
      db.disconnect();
    } catch (e) {
      print('CRITICAL! UNHANDLED ERROR');
      print(e);
    }
  }
}