resolveAndSanitizeRedirectWithResolver function

Future<String?> resolveAndSanitizeRedirectWithResolver(
  1. Map<String, dynamic> payload,
  2. Map<String, String> queryParameters, {
  3. required Uri requestUri,
  4. required FutureOr<String?> resolveRedirect(
    1. String? candidate
    ),
  5. String? fallbackHost,
  6. String? fallbackScheme,
  7. String payloadCallbackKey = 'callbackUrl',
  8. String payloadRedirectKey = 'redirect',
  9. String queryCallbackKey = 'callbackUrl',
})

Resolves and sanitizes redirect values using callback precedence plus an optional external resolver.

The flow is:

  1. Resolve candidate from payload/query via resolveRedirectCandidate.
  2. Sanitize candidate for same-origin safety.
  3. Invoke resolveRedirect with sanitized candidate.
  4. Sanitize resolved value again (or fallback to candidate when null).

Implementation

Future<String?> resolveAndSanitizeRedirectWithResolver(
  Map<String, dynamic> payload,
  Map<String, String> queryParameters, {
  required Uri requestUri,
  required FutureOr<String?> Function(String? candidate) resolveRedirect,
  String? fallbackHost,
  String? fallbackScheme,
  String payloadCallbackKey = 'callbackUrl',
  String payloadRedirectKey = 'redirect',
  String queryCallbackKey = 'callbackUrl',
}) async {
  final candidate = resolveAndSanitizeRedirectCandidate(
    payload,
    queryParameters,
    requestUri: requestUri,
    fallbackHost: fallbackHost,
    fallbackScheme: fallbackScheme,
    payloadCallbackKey: payloadCallbackKey,
    payloadRedirectKey: payloadRedirectKey,
    queryCallbackKey: queryCallbackKey,
  );
  final resolved = await Future<String?>.value(resolveRedirect(candidate));
  return sanitizeRedirectUrl(
    resolved ?? candidate,
    requestUri: requestUri,
    fallbackHost: fallbackHost,
    fallbackScheme: fallbackScheme,
  );
}