using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace TapTap.TapDB.Standalone.Internal {
public class MessageHandler : HttpClientHandler {
///
/// 最大重试次数
///
private const int MAX_RETRY_TIMES = 3;
public MessageHandler() {
AllowAutoRedirect = false;
UseCookies = false;
}
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
HttpResponseMessage response = null;
for (int i = 0; i < MAX_RETRY_TIMES; i++) {
response = await base.SendAsync(request, cancellationToken);
if (response.IsSuccessStatusCode) {
break;
}
if ((int)response.StatusCode >= 300 && (int)response.StatusCode <= 399) {
var redirectUri = response.Headers.Location;
if (null != redirectUri)
{
request = GenerateNewRequest(request, redirectUri);
}
}
if (i != MAX_RETRY_TIMES - 1)
{
response.Dispose();
}
}
return response;
}
private static HttpRequestMessage GenerateNewRequest(HttpRequestMessage originalRequest, Uri redirectUri)
{
if (!redirectUri.IsAbsoluteUri)
{
redirectUri = new Uri(originalRequest.RequestUri, redirectUri);
}
var newRequest = new HttpRequestMessage(originalRequest.Method, redirectUri)
{
Content = originalRequest.Content
};
foreach (var header in originalRequest.Headers)
{
newRequest.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
return newRequest;
}
}
}