redactUriForLog function

String redactUriForLog(
  1. String uri
)

Redacts sensitive URI components before writing logs.

Implementation

String redactUriForLog(String uri) {
  if (uri.trim().isEmpty) {
    return '<empty>';
  }
  final String sanitized = uri.replaceAll('\r', r'\r').replaceAll('\n', r'\n');
  if (!sanitized.contains('://')) {
    return '<scheme-missing>';
  }

  final Uri parsed;
  try {
    parsed = Uri.parse(sanitized);
  } on FormatException {
    return '<unparseable>';
  }
  if (parsed.scheme.isEmpty) {
    return '<scheme-missing>';
  }

  final String authority = parsed.hasAuthority
      ? (parsed.userInfo.isEmpty ? parsed.authority : parsed.host)
      : '';
  final String query = parsed.queryParametersAll.isEmpty
      ? ''
      : parsed.queryParametersAll.keys
            .map((String key) => '$key=<redacted>')
            .join('&');
  return Uri(
    scheme: parsed.scheme,
    userInfo: '',
    host: authority == parsed.host ? parsed.host : authority,
    port: parsed.hasPort ? parsed.port : 0,
    path: parsed.path,
    query: query.isEmpty ? null : query,
  ).replace(port: parsed.hasPort ? parsed.port : null).toString();
}