Future startServer(InternetAddress address, int port)

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;
}