Merge pull request #796 from octokit/deprecate-httpclient-timeout

deprecate httpclient timeout in favour of cancellation token
This commit is contained in:
Phil Haack
2015-05-08 12:47:57 -07:00
4 changed files with 47 additions and 10 deletions
@@ -32,5 +32,25 @@ public class HttpClientAdapterTests
Assert.Equal(78, imageBytes[2]);
Assert.Equal(130, imageBytes.Last());
}
[IntegrationTest]
public async Task CanCancelARequest()
{
var httpClient = new HttpClientAdapter();
var request = new Request
{
BaseAddress = new Uri("https://github.global.ssl.fastly.net/", UriKind.Absolute),
Endpoint = new Uri("/images/icons/emoji/poop.png?v=5", UriKind.RelativeOrAbsolute),
AllowAutoRedirect = true,
Method = HttpMethod.Get,
Timeout = TimeSpan.FromMilliseconds(10)
};
var response = httpClient.Send(request, CancellationToken.None);
await Task.Delay(TimeSpan.FromSeconds(2));
Assert.True(response.IsCanceled);
}
}
}
@@ -16,11 +16,15 @@ namespace Octokit.Tests.Http
{
public class TheBuildRequestMessageMethod
{
readonly Uri _endpoint = new Uri("/ha-ha-business", UriKind.Relative);
[Fact]
public void AddsHeadersToRequestMessage()
{
var request = new Request
{
BaseAddress = GitHubClient.GitHubApiUrl,
Endpoint = _endpoint,
Method = HttpMethod.Post,
Headers =
{
@@ -47,6 +51,8 @@ namespace Octokit.Tests.Http
{
var request = new Request
{
BaseAddress = GitHubClient.GitHubApiUrl,
Endpoint = _endpoint,
Method = HttpMethod.Post,
Body = "{}",
ContentType = "text/plain"
@@ -64,6 +70,8 @@ namespace Octokit.Tests.Http
{
var request = new Request
{
BaseAddress = GitHubClient.GitHubApiUrl,
Endpoint = _endpoint,
Method = HttpMethod.Post,
Body = new MemoryStream(),
ContentType = "text/plain"
@@ -82,6 +90,8 @@ namespace Octokit.Tests.Http
{
var request = new Request
{
BaseAddress = GitHubClient.GitHubApiUrl,
Endpoint = _endpoint,
Method = HttpMethod.Post,
Body = new FormUrlEncodedContent(new Dictionary<string, string> {{"foo", "bar"}})
};
+1 -1
View File
@@ -23,7 +23,7 @@ namespace Octokit
/// the user agent for analytics purposes.
/// </param>
public GitHubClient(ProductHeaderValue productInformation)
: this(new Connection(productInformation))
: this(new Connection(productInformation, GitHubApiUrl))
{
}
+16 -9
View File
@@ -50,15 +50,21 @@ namespace Octokit.Internal
httpOptions.Proxy = _webProxy;
}
var http = new HttpClient(httpOptions)
var http = new HttpClient(httpOptions);
var cancellationTokenForRequest = cancellationToken;
if (request.Timeout != TimeSpan.Zero)
{
BaseAddress = request.BaseAddress,
Timeout = request.Timeout
};
var timeoutCancellation = new CancellationTokenSource(request.Timeout);
var unifiedCancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCancellation.Token);
cancellationTokenForRequest = unifiedCancellationToken.Token;
}
using (var requestMessage = BuildRequestMessage(request))
{
// Make the request
var responseMessage = await http.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, cancellationToken)
var responseMessage = await http.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, cancellationTokenForRequest)
.ConfigureAwait(false);
return await BuildResponse(responseMessage).ConfigureAwait(false);
}
@@ -77,13 +83,13 @@ namespace Octokit.Internal
contentType = GetContentMediaType(responseMessage.Content);
// We added support for downloading images and zip-files. Let's constrain this appropriately.
if (contentType == null || (!contentType.StartsWith("image/") && !contentType.StartsWith("application/")))
if (contentType != null && (contentType.StartsWith("image/") || contentType.Equals("application/zip", StringComparison.OrdinalIgnoreCase)))
{
responseBody = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
responseBody = await responseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
}
else
{
responseBody = await responseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
responseBody = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
}
}
}
@@ -101,7 +107,8 @@ namespace Octokit.Internal
HttpRequestMessage requestMessage = null;
try
{
requestMessage = new HttpRequestMessage(request.Method, request.Endpoint);
var fullUri = new Uri(request.BaseAddress, request.Endpoint);
requestMessage = new HttpRequestMessage(request.Method, fullUri);
foreach (var header in request.Headers)
{
requestMessage.Headers.Add(header.Key, header.Value);