1. @override
Future receive(Request req)

The mechanism for delivering a Request to this controller for processing.

This method is the entry point of a Request into this RequestController. By default, it invokes this controller's processRequest method and, if that method determines processing should continue to the nextController and a nextController exists, the request will be delivered to nextController.

An RequestSink invokes this method on its initial controller in its processRequest method.

Some RequestControllers may override this method if they do not wish to use simple chaining. For example, the Router class overrides this method to deliver the Request to the appropriate RouteController. If overriding this method, it is important that you always invoke subsequent controller's with receive and not processRequest. You must also ensure that CORS requests are handled properly, as this method does the heavy-lifting for handling CORS requests.

Source

@override
Future receive(Request req) async {
  RequestController next;
  try {
    var requestURISegmentIterator = req.innerRequest.uri.pathSegments.iterator;
    if (_basePathSegments.length > 0) {
      for (var i = 0; i < _basePathSegments.length; i++) {
        requestURISegmentIterator.moveNext();
        if (_basePathSegments[i] != requestURISegmentIterator.current) {
          await _unhandledRequestController(req);
          return null;
        }
      }
    }

    var remainingSegments = <String>[];
    while (requestURISegmentIterator.moveNext()) {
      remainingSegments.add(requestURISegmentIterator.current);
    }
    if (remainingSegments.isEmpty) {
      remainingSegments = [""];
    }

    var node = _rootRouteNode.nodeForPathSegments(remainingSegments);
    if (node?.specification == null) {
      await _unhandledRequestController(req);
      return null;
    }

    var requestPath = new HTTPRequestPath(node.specification, remainingSegments);
    req.path = requestPath;
    next = node.controller;
  } catch (any, stack) {
    return handleError(req, any, stack);
  }

  return next?.receive(req);
}