createUri function

Uri? createUri(
  1. String? url
)

Implementation

Uri? createUri(String? url) {
  if (url == null || url.length == 0) return null;

  try {
    var uri = Uri.parse(url);
    return uri;
  } catch (e) {
    //sometimes Uri refuses to parse urls with encodable chars so need to manually parse + reconstruct
    var parts = url.split("://");
    if (parts.length != 2) throw FormatException("Invalid URL: '${url}'");

    var urlParts = splitOnFirst(parts[1], "/");
    var relativeUrl = urlParts.length == 1 ? "/" : "/" + urlParts[1]!;

    var relativeUrlParts = splitOnFirst(relativeUrl, "?");
    var path = relativeUrlParts[0];

    Map<String?, String?>? query = null;

    if (relativeUrlParts.length == 2) {
      query = Map<String?, String?>();
      var qs = relativeUrlParts[1]!;
      var qsParts = qs.split("&");
      for (var qsPart in qsParts) {
        var kvp = splitOnFirst(qsPart, "=");
        if (kvp.length == 1) continue;
        query[kvp[0]] = kvp[1];
      }
    }

    return parts[0] == "https"
        ? Uri.https(urlParts[0]!, path!, query as Map<String, String>?)
        : Uri.http(urlParts[0]!, path!, query as Map<String, String>?);
  }
}