|
@@ -123,7 +123,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
}
|
|
|
|
|
|
request.Method = method;
|
|
|
- request.Timeout = 20000;
|
|
|
+ request.Timeout = options.TimeoutMs;
|
|
|
|
|
|
if (!string.IsNullOrEmpty(options.Host))
|
|
|
{
|
|
@@ -390,7 +390,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
|
|
|
if (!options.BufferContent)
|
|
|
{
|
|
|
- var response = await httpWebRequest.GetResponseAsync().ConfigureAwait(false);
|
|
|
+ var response = await GetResponseAsync(httpWebRequest, TimeSpan.FromMilliseconds(options.TimeoutMs)).ConfigureAwait(false);
|
|
|
|
|
|
var httpResponse = (HttpWebResponse)response;
|
|
|
|
|
@@ -401,7 +401,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
return GetResponseInfo(httpResponse, httpResponse.GetResponseStream(), GetContentLength(httpResponse), httpResponse);
|
|
|
}
|
|
|
|
|
|
- using (var response = await httpWebRequest.GetResponseAsync().ConfigureAwait(false))
|
|
|
+ using (var response = await GetResponseAsync(httpWebRequest, TimeSpan.FromMilliseconds(options.TimeoutMs)).ConfigureAwait(false))
|
|
|
{
|
|
|
var httpResponse = (HttpWebResponse)response;
|
|
|
|
|
@@ -843,5 +843,47 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
{
|
|
|
return Post(url, postData, null, cancellationToken);
|
|
|
}
|
|
|
+
|
|
|
+ private Task<WebResponse> GetResponseAsync(WebRequest request, TimeSpan timeout)
|
|
|
+ {
|
|
|
+ var taskCompletion = new TaskCompletionSource<WebResponse>();
|
|
|
+
|
|
|
+ Task<WebResponse> asyncTask = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
|
|
|
+
|
|
|
+ ThreadPool.RegisterWaitForSingleObject((asyncTask as IAsyncResult).AsyncWaitHandle, TimeoutCallback, request, timeout, true);
|
|
|
+ asyncTask.ContinueWith(task =>
|
|
|
+ {
|
|
|
+ taskCompletion.TrySetResult(task.Result);
|
|
|
+
|
|
|
+ }, TaskContinuationOptions.NotOnFaulted);
|
|
|
+
|
|
|
+ // Handle errors
|
|
|
+ asyncTask.ContinueWith(task =>
|
|
|
+ {
|
|
|
+ if (task.Exception != null)
|
|
|
+ {
|
|
|
+ taskCompletion.TrySetException(task.Exception);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ taskCompletion.TrySetException(new List<Exception>());
|
|
|
+ }
|
|
|
+
|
|
|
+ }, TaskContinuationOptions.OnlyOnFaulted);
|
|
|
+
|
|
|
+ return taskCompletion.Task;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void TimeoutCallback(object state, bool timedOut)
|
|
|
+ {
|
|
|
+ if (timedOut)
|
|
|
+ {
|
|
|
+ WebRequest request = (WebRequest)state;
|
|
|
+ if (state != null)
|
|
|
+ {
|
|
|
+ request.Abort();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|