diff --git a/Authentication/Authenticator.cs b/Authentication/Authenticator.cs index e4ca7f7..5df3785 100644 --- a/Authentication/Authenticator.cs +++ b/Authentication/Authenticator.cs @@ -54,6 +54,12 @@ public class Authenticator /// virtual public string AuthenticationType { get; } + /// + /// Returns true when the initialization phase is done, regardless whether it succeeded or not. + /// Override to indicate if the authenticator is still waiting for a token. + /// + virtual public bool IsDoneInitializing => true; + /// /// Check if authenticator has everything it needs to authenticate. Every child class overrides this method. /// diff --git a/Authentication/CloudPakForData/CloudPakForDataAuthenticator.cs b/Authentication/CloudPakForData/CloudPakForDataAuthenticator.cs index 453e615..b2e8448 100644 --- a/Authentication/CloudPakForData/CloudPakForDataAuthenticator.cs +++ b/Authentication/CloudPakForData/CloudPakForDataAuthenticator.cs @@ -42,6 +42,9 @@ public class CloudPakForDataAuthenticator : Authenticator // This field holds an access token and its expiration time. private CloudPakForDataToken tokenData; + private bool isDoneInitializing = false; + + public override bool IsDoneInitializing => isDoneInitializing; /// /// Constructs a CloudPakForDataAuthenticator with all properties. @@ -131,6 +134,7 @@ private void GetToken() private void OnGetToken(DetailedResponse response, IBMError error) { + isDoneInitializing = true; if (error != null) { Log.Error("Credentials.OnRequestCloudPakForDataTokenResponse()", "Exception: {0}", error.ToString()); diff --git a/Authentication/Iam/IamAuthenticator.cs b/Authentication/Iam/IamAuthenticator.cs index c7877f7..b407736 100644 --- a/Authentication/Iam/IamAuthenticator.cs +++ b/Authentication/Iam/IamAuthenticator.cs @@ -39,6 +39,7 @@ public class IamAuthenticator : Authenticator public Dictionary Headers { get; set; } // This field holds an access token and its expiration time. private IamToken tokenData; + private bool isDoneInitializing = false; private const string DefaultIamUrl = "https://iam.cloud.ibm.com/identity/token"; private const string GrantType = "grant_type"; @@ -111,6 +112,8 @@ public override string AuthenticationType get { return AuthTypeIam; } } + public override bool IsDoneInitializing => isDoneInitializing; + /// /// Do we have TokenData? /// @@ -139,6 +142,7 @@ public override void Authenticate(WSConnector connector) private void OnGetToken(DetailedResponse response, IBMError error) { + isDoneInitializing = true; if (error != null) { Log.Error("Credentials.OnRequestIamTokenResponse()", "Exception: {0}", error.ToString()); @@ -200,14 +204,15 @@ private void OnRequestIamTokenResponse(RESTConnector.Request req, RESTConnector. { DetailedResponse response = new DetailedResponse(); response.Result = new IamTokenResponse(); - foreach (KeyValuePair kvp in resp.Headers) - { - response.Headers.Add(kvp.Key, kvp.Value); - } - response.StatusCode = resp.HttpResponseCode; try { + foreach (KeyValuePair kvp in resp.Headers) + { + response.Headers.Add(kvp.Key, kvp.Value); + } + response.StatusCode = resp.HttpResponseCode; + string json = Encoding.UTF8.GetString(resp.Data); response.Result = JsonConvert.DeserializeObject(json); response.Response = json; diff --git a/Connection/RESTConnector.cs b/Connection/RESTConnector.cs index a7c713f..31a44eb 100644 --- a/Connection/RESTConnector.cs +++ b/Connection/RESTConnector.cs @@ -658,7 +658,16 @@ private IEnumerator ProcessRequestQueue() #region Get Error Message public string GetErrorMessage(string error) { - dynamic deserializedObject = Json.Deserialize(error); + dynamic deserializedObject; + try + { + deserializedObject = Json.Deserialize(error); + } + catch (Exception) + { + Log.Error("RESTConnector.GetErrorMessage()", "Non-JSON Error Received!"); + return "Unknown error"; + } if ((deserializedObject as Dictionary).ContainsKey("errors")) { return deserializedObject["errors"][0]["message"];