private void ProcessCollectionResponse()

in src/PFXImportPowershell/PFXImportPS/cmdlets/GetUserPFXCertificate.cs [187:245]


        private void ProcessCollectionResponse(HttpWebRequest request, string filter)
        {
            bool needsRetry = false;
            TimeSpan waitTime = TimeSpan.Zero;
            double retryAfter = 60; // TODO: get a good default wait time.
            try
            {
                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        string responseMessage = string.Empty;
                        using (StreamReader rs = new StreamReader(response.GetResponseStream()))
                        {
                            responseMessage = rs.ReadToEnd();
                        }

                        List<UserPFXCertificate> certList = SerializationHelpers.DeserializeUserPFXCertificateList(responseMessage);
                        foreach (UserPFXCertificate cert in certList)
                        {
                            this.WriteObject(cert);
                        }
                    }
                    else
                    {
                        this.WriteError(new ErrorRecord(new InvalidOperationException(response.StatusDescription), response.StatusCode.ToString(), ErrorCategory.InvalidResult, filter));
                    }
                }
            }
            catch (WebException we)
            {
                HttpWebResponse response = we.Response as HttpWebResponse;
                if (we.Status == WebExceptionStatus.ProtocolError && response.StatusCode == (HttpStatusCode)429)
                {
                    needsRetry = true;
                    if (response.Headers["x-ms-retry-after-ms"] != null)
                    {
                        retryAfter = double.Parse(response.Headers["x-ms-retry-after-ms"]);
                    }

                    if (response.Headers["Retry-After"] != null)
                    {
                        retryAfter = double.Parse(response.Headers["Retry-After"]);
                    }
                }
                else
                {
                    this.WriteError(new ErrorRecord(we, we.Message + " request-id:" + we.Response.Headers["request-id"], ErrorCategory.InvalidResult, filter));
                }
            }

            // Waiting until response is closed to re-use request
            if (needsRetry)
            {
                this.WriteWarning(string.Format(LogMessages.GetUserPfxTooManyRequests, retryAfter));
                Thread.Sleep(TimeSpan.FromSeconds(retryAfter));
                ProcessCollectionResponse(request, filter);
            }
        }