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