handleRequest method
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);
}
}
}