in AdlsDotNetSDK/WebTransport.cs [404:482]
private static void HandleWebException(WebException e, OperationResponse resp, string path, string requestId, string token, HttpWebRequest webReq, CancellationToken timeoutCancelToken, CancellationToken actualCancelToken = default(CancellationToken))
{
// The status property will be set to RequestCanceled after Abort.
if (timeoutCancelToken.IsCancellationRequested)
{
// Type should not be of operationcancelledexception otherwise this wont be retried
resp.Ex = new Exception("Operation timed out");
}
else if (actualCancelToken.IsCancellationRequested)
{
resp.Ex = new OperationCanceledException(actualCancelToken);
}
//This the case where some exception occured in server but server returned a response
else if (e.Status == WebExceptionStatus.ProtocolError)
{
try
{
using (var errorResponse = (HttpWebResponse)e.Response)
{
PostPowershellLogDetails(webReq, errorResponse);
resp.HttpStatus = errorResponse.StatusCode;
resp.RequestId = errorResponse.Headers["x-ms-request-id"];
if (resp.HttpStatus == HttpStatusCode.Unauthorized && TokenLog.IsDebugEnabled)
{
string tokenLogLine =
$"HTTPRequest,HTTP401,cReqId:{requestId},sReqId:{resp.RequestId},path:{path},token:{token}";
TokenLog.Debug(tokenLogLine);
}
resp.HttpMessage = errorResponse.StatusDescription;
ByteBuffer errorResponseData = default(ByteBuffer);
if (!InitializeResponseData(errorResponse, ref errorResponseData, true))
{
throw new ArgumentException("ContentLength of error response stream is not set");
}
using (Stream errorStream = errorResponse.GetResponseStream())
{
// Reading the data from the error response into a byte array is necessary to show the actual error data as a part of the
// error message in case JSON parsing does not work. We read the bytes and then pass it back to JsonTextReader using a memorystream
int noBytes;
int totalLengthToRead = errorResponseData.Count;
do
{
noBytes = errorStream.Read(errorResponseData.Data, errorResponseData.Offset, totalLengthToRead);
errorResponseData.Offset += noBytes;
totalLengthToRead -= noBytes;
} while (noBytes > 0 && totalLengthToRead > 0);
// Pass errorResponseData.Offset instead of errorResponseData.Count because errorResponseData.Offset can be less than errorResponseData.Count
//This will be the case mostly for chunked error response where we initialize the byte with 1000 bytes
ParseRemoteError(errorResponseData.Data, errorResponseData.Offset, resp, errorResponse.Headers["Content-Type"]);
}
}
}
catch (Exception ex)
{
resp.Ex = ex;
}
}
else//No response stream is returned, Dont know what to do, so just store the exception
{
switch (e.Status)
{
case WebExceptionStatus.NameResolutionFailure:
case WebExceptionStatus.ServerProtocolViolation:
case WebExceptionStatus.ConnectFailure:
case WebExceptionStatus.ConnectionClosed:
case WebExceptionStatus.KeepAliveFailure:
case WebExceptionStatus.ReceiveFailure:
case WebExceptionStatus.SendFailure:
case WebExceptionStatus.Timeout:
case WebExceptionStatus.UnknownError:
resp.ConnectionFailure = true;
break;
}
resp.Ex = e;
}
}