public IPromise<IRemoteConnection> Clone(bool async)
 {
   var newConn = new ProxyServerConnection(_service, _endpoints);
   newConn.SessionPolicy = this.SessionPolicy;
   newConn._defaults = this._defaults;
   return newConn.Login(_lastCredentials, async)
     .Convert(u => (IRemoteConnection)newConn);
 }
Ejemplo n.º 2
0
    /// <summary>
    /// Asynchronously gets an HTTP connection to an innovator instance (or proxy) at the given URL
    /// </summary>
    /// <param name="url">URL of the innovator instance (or proxy)</param>
    /// <param name="preferences">Object containing preferences for the connection</param>
    /// <returns>A promise to return a connection object</returns>
    public static IPromise<IRemoteConnection> GetConnection(string url
      , ConnectionPreferences preferences, bool async)
    {
      url = (url ?? "").TrimEnd('/');
      if (!url.EndsWith("/server", StringComparison.OrdinalIgnoreCase)) url += "/Server";
      var configUrl = url + "/mapping.xml";

      var masterService = preferences.HttpService ?? DefaultService.Invoke();
      var arasSerice = preferences.HttpService ?? new DefaultHttpService() { Compression = CompressionType.none };
      Func<ServerMapping, IRemoteConnection> connFactory = m =>
      {
        var uri = (m.Url ?? "").TrimEnd('/');
        if (!uri.EndsWith("/server", StringComparison.OrdinalIgnoreCase)) url += "/Server";
        switch (m.Type)
        {
          case ServerType.Proxy:
            m.Endpoints.Base = new Uri(uri + "/");
            var conn = new Connection.ProxyServerConnection(masterService, m.Endpoints);
            conn.SessionPolicy = preferences.SessionPolicy;
            if (!string.IsNullOrEmpty(preferences.UserAgent))
              conn.DefaultSettings(req => req.UserAgent = preferences.UserAgent);
            return conn;
          default:
            return ArasConn(arasSerice, uri, preferences);
        }
      };

      var result = new Promise<IRemoteConnection>();
      result.CancelTarget(masterService.Execute("GET", configUrl, null, CredentialCache.DefaultCredentials
                                          , async, request =>
        {
          request.UserAgent = preferences.UserAgent;
          request.SetHeader("Accept", "text/xml");
        }).Progress((p, m) => result.Notify(p, m))
        .Done(r => {
          var data = r.AsString();
          if (string.IsNullOrEmpty(data))
          {
            result.Resolve(ArasConn(arasSerice, url, preferences));
          }
          else
          {
            try
            {
              var servers = ServerMapping.FromXml(data).ToArray();
              if (servers.Length < 1)
              {
                result.Resolve(ArasConn(arasSerice, url, preferences));
              }
              else if (servers.Length == 1)
              {
                result.Resolve(connFactory(servers.Single()));
              }
              else
              {
                foreach (var server in servers)
                {
                  server.Factory = connFactory;
                }
                result.Resolve(new MappedConnection(servers));
              }
            }
            catch (XmlException)
            {
              result.Resolve(ArasConn(arasSerice, url, preferences));
            }
          }
        }).Fail(ex => {
          result.Resolve(ArasConn(arasSerice, url, preferences));
        }));
      return result;
    }
 public bool Equals(ProxyServerConnection conn)
 {
   return conn._endpoints.Base.Equals(this._endpoints.Base)
     && String.Equals(conn._database, this._database)
     && String.Equals(conn._userId, this._userId);
 }