toMiddleware method

  1. @override
Middleware toMiddleware()
override

Builds the shelf middleware this value configures.

Implementation

@override
Middleware toMiddleware() {
  return (Handler inner) {
    return (Request request) async {
      final parts = RequestParts.of(request);
      final origin = parts.headers['origin'];
      final allowed = origins.headerFor(origin);

      // An `OPTIONS` without `Access-Control-Request-Method` is an ordinary
      // request asking what a path supports, not a preflight.
      final isPreflight = parts.method == 'OPTIONS' &&
          parts.headers['access-control-request-method'] != null;

      if (isPreflight) {
        // A refused origin still gets an answer, just without permission.
        return Response(
          204,
          headers: {
            ...?_allowHeaders(allowed),
            if (allowed != null) ...{
              'access-control-allow-methods': methods.join(', '),
              'access-control-allow-headers': headers.join(', '),
              if (maxAge != null)
                'access-control-max-age': '${maxAge!.inSeconds}',
            },
            ..._varyPreflight(),
          },
        );
      }

      final response = await inner(request);
      return response.change(headers: _allowHeaders(allowed) ?? _vary());
    };
  };
}