internal static async Task <MobileConnectStatus> AttemptDiscoveryAfterOperatorSelection(IDiscoveryService discovery, Uri redirectedUrl, MobileConnectConfig config) { var parsedRedirect = discovery.ParseDiscoveryRedirect(redirectedUrl); if (!parsedRedirect.HasMCCAndMNC) { return(MobileConnectStatus.StartDiscovery()); } DiscoveryResponse response; try { response = await discovery.CompleteSelectedOperatorDiscoveryAsync(config, config.RedirectUrl, parsedRedirect.SelectedMCC, parsedRedirect.SelectedMNC); if (response.ResponseData?.subscriber_id == null) { response.ResponseData.subscriber_id = parsedRedirect.EncryptedMSISDN; } } catch (MobileConnectInvalidArgumentException e) { Log.Error(() => $"An invalid argument was passed to AttemptDiscoveryAfterOperatorSelection arg={e.Argument}"); return(MobileConnectStatus.Error(ErrorCodes.InvalidArgument, string.Format("An argument was found to be invalid during the process. The argument was {0}.", e.Argument), e)); } catch (MobileConnectEndpointHttpException e) { Log.Error(() => $"A general http error occurred in AttemptDiscoveryAfterOperatorSelection redirectedUrl={redirectedUrl} discoveryUrl={config.DiscoveryUrl}"); return(MobileConnectStatus.Error(ErrorCodes.HttpFailure, "An HTTP failure occured while calling the discovery endpoint, the endpoint may be inaccessible", e)); } catch (Exception e) { Log.Error(() => $"A general error occurred in AttemptDiscoveryAfterOperatorSelection redirectedUrl={redirectedUrl} discoveryUrl={config.DiscoveryUrl}"); return(MobileConnectStatus.Error(ErrorCodes.Unknown, "An unknown error occured while calling the Discovery service to obtain operator details", e)); } return(GenerateStatusFromDiscoveryResponse(discovery, response)); }