Starts the server.
Returns false on failure; otherwise, returns the HttpServer.
Source
startServer(InternetAddress address, int port) async {
var server =
await _serverGenerator(address ?? InternetAddress.LOOPBACK_IP_V4, port);
this.httpServer = server;
server.listen((HttpRequest request) async {
String req_url =
request.uri.toString().replaceAll(new RegExp(r'\/+$'), '');
if (req_url.isEmpty) req_url = '/';
RequestContext req = await RequestContext.from(request, {}, this, null);
ResponseContext res = await ResponseContext.from(request.response, this);
bool canContinue = true;
var execHandler = (handler, req) async {
if (canContinue) {
canContinue = await new Future.sync(() async {
return _applyHandler(handler, req, res);
}).catchError((e, [StackTrace stackTrace]) async {
if (e is AngelHttpException) {
// Special handling for AngelHttpExceptions :)
try {
res.status(e.statusCode);
String accept = request.headers.value(HttpHeaders.ACCEPT);
if (accept == "*/*" ||
accept.contains("application/json") ||
accept.contains("application/javascript")) {
res.json(e.toMap());
} else {
await _errorHandler(e, req, res);
}
_finalizeResponse(request, res);
} catch (_) {}
}
_onError(e, stackTrace);
canContinue = false;
return false;
});
} else
return false;
};
for (var handler in before) {
await execHandler(handler, req);
}
for (Route route in routes) {
if (!canContinue) break;
if (route.matcher.hasMatch(req_url) &&
(request.method == route.method || route.method == '*')) {
req.params = route.parseParameters(request.uri.toString());
req.route = route;
for (var handler in route.handlers) {
await execHandler(handler, req);
}
}
}
for (var handler in after) {
await execHandler(handler, req);
}
_finalizeResponse(request, res);
});
return server;
}