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);
}
}