private void ProcessResponse()

in src/PFXImportPowershell/PFXImportPS/cmdlets/RemoveUserPFXCertificate.cs [201:279]


        private void ProcessResponse(HttpWebRequest request, string userthumbprint)
        {
            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.NoContent)
                    {
                        string responseMessage;
                        using (var rawStream = response.GetResponseStream())
                        {
                            using (var responseReader = new StreamReader(rawStream, Encoding.UTF8))
                            {
                                responseMessage = responseReader.ReadToEnd();
                            }
                        }

                        this.WriteError(
                            new ErrorRecord(
                                new InvalidOperationException(string.Format("Remove failed for {0}: {1}{2}{3}", userthumbprint, response.StatusCode, Environment.NewLine, responseMessage)),
                                "Remove Failed",
                                ErrorCategory.InvalidResult,
                                userthumbprint));
                        failureCnt++;
                    }
                    else
                    {
                        successCnt++;
                    }
                }
            }
            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
                {
                    var resp = new StreamReader(we.Response.GetResponseStream()).ReadToEnd();

                    dynamic obj = JsonConvert.DeserializeObject(resp);

                    string messageFromServer;
                    if (obj.error != null)
                    {
                        messageFromServer = obj.error.message.ToString();
                    }
                    else
                    {
                        messageFromServer = String.Format("Failed to deserialize response {0}", resp);
                    }

                    this.WriteDebug(string.Format("Error Message: {0}", messageFromServer));
                    this.WriteError(new ErrorRecord(we, we.Message + messageFromServer + " request-id:" + we.Response.Headers["request-id"], ErrorCategory.InvalidResult, null));
                }
            }

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