parseUri static method

ConfigParams parseUri(
  1. String? uri,
  2. String defaultProtocol,
  3. int defaultPort
)

Parses URI into config parameters. The URI shall be in the following form: protocol://username@password@host1:port1,host2:port2,...?param1=abc&param2=xyz&...

  • uri the URI to be parsed
  • defaultProtocol a default protocol
  • defaultPort a default port return a configuration parameters with URI elements

Implementation

static ConfigParams parseUri(
    String? uri, String defaultProtocol, int defaultPort) {
  var options = ConfigParams();

  if (uri == null || uri == '') return options;

  uri = uri.trim();

  // Process parameters
  var pos = uri.indexOf('?');
  if (pos > 0) {
    var params = uri.substring(pos + 1);
    uri = uri.substring(0, pos);

    var paramsList = params.split('&');
    for (var param in paramsList) {
      var pos = param.indexOf('=');
      if (pos >= 0) {
        var key = Uri.decodeComponent(param.substring(0, pos));
        var value = Uri.decodeComponent(param.substring(pos + 1));
        options.setAsObject(key, value);
      } else {
        options.setAsObject(Uri.decodeComponent(param), null);
      }
    }
  }

  // Process protocol
  pos = uri.indexOf('://');
  if (pos > 0) {
    var protocol = uri.substring(0, pos);
    uri = uri.substring(pos + 3);
    options.setAsObject('protocol', protocol);
  } else {
    options.setAsObject('protocol', defaultProtocol);
  }

  // Process user and password
  pos = uri.indexOf('@');
  if (pos > 0) {
    var userAndPass = uri.substring(0, pos);
    uri = uri.substring(pos + 1);

    pos = userAndPass.indexOf(':');
    if (pos > 0) {
      options.setAsObject('username', userAndPass.substring(0, pos));
      options.setAsObject('password', userAndPass.substring(pos + 1));
    } else {
      options.setAsObject('username', userAndPass);
    }
  }

  pos = uri.indexOf('/');
  if (pos > 0) {
    var path = uri.substring(pos + 1);
    uri = uri.substring(0, pos);
    options.setAsObject('path', path);
  }

  // Process host and ports
  // options.setAsObject('servers', concatValues(options.getAsString('servers'), uri));
  var servers = uri.split(',');
  for (var server in servers) {
    pos = server.indexOf(':');
    if (pos > 0) {
      options.setAsObject(
          'servers', concatValues(options.getAsString('servers'), server));
      options.setAsObject(
          'host',
          concatValues(
              options.getAsString('host'), server.substring(0, pos)));
      options.setAsObject(
          'port',
          concatValues(
              options.getAsString('port'), server.substring(pos + 1)));
    } else {
      options.setAsObject(
          'servers',
          concatValues(options.getAsString('servers'),
              server + ':' + defaultPort.toString()));
      options.setAsObject(
          'host', concatValues(options.getAsString('host'), server));
      options.setAsObject('port',
          concatValues(options.getAsString('port'), defaultPort.toString()));
    }
  }

  return options;
}