diff --git a/Octokit.Tests/Http/HttpClientAdapterTests.cs b/Octokit.Tests/Http/HttpClientAdapterTests.cs index f0b2dc5b..84d224a0 100644 --- a/Octokit.Tests/Http/HttpClientAdapterTests.cs +++ b/Octokit.Tests/Http/HttpClientAdapterTests.cs @@ -75,6 +75,21 @@ namespace Octokit.Tests.Http Assert.Equal("phant", lastHeader.Value); Assert.Equal("{}", response.Body); Assert.Equal(httpStatusCode, response.StatusCode); + Assert.Null(response.ContentType); + } + + public async Task SetsContentType(HttpStatusCode httpStatusCode) + { + var responseMessage = new HttpResponseMessage + { + StatusCode = httpStatusCode, + Content = new StringContent("{}", Encoding.UTF8, "application/json"), + }; + var tester = new HttpClientAdapterTester(); + + var response = await tester.BuildResponseTester(responseMessage); + + Assert.Equal("application/json", response.ContentType); } } diff --git a/Octokit.Tests/Http/JsonHttpPipelineTests.cs b/Octokit.Tests/Http/JsonHttpPipelineTests.cs index 8b91a1ba..2ae2a548 100644 --- a/Octokit.Tests/Http/JsonHttpPipelineTests.cs +++ b/Octokit.Tests/Http/JsonHttpPipelineTests.cs @@ -1,6 +1,7 @@ using System; using Octokit.Http; using Xunit; +using Xunit.Extensions; namespace Octokit.Tests.Http { @@ -80,7 +81,11 @@ namespace Octokit.Tests.Http public void DeserializesResponse() { const string data = "works"; - var response = new ApiResponse { Body = SimpleJson.SerializeObject(data) }; + var response = new ApiResponse + { + Body = SimpleJson.SerializeObject(data), + ContentType = "application/json" + }; var jsonPipeline = new JsonHttpPipeline(); jsonPipeline.DeserializeResponse(response); @@ -88,6 +93,22 @@ namespace Octokit.Tests.Http Assert.NotNull(response.BodyAsObject); Assert.Equal(data, response.BodyAsObject); } + + [Fact] + public void IgnoresResponsesNotIdentifiedAsJson() + { + const string data = "works"; + var response = new ApiResponse + { + Body = SimpleJson.SerializeObject(data), + ContentType = "text/html" + }; + var jsonPipeline = new JsonHttpPipeline(); + + jsonPipeline.DeserializeResponse(response); + + Assert.Null(response.BodyAsObject); + } } } } diff --git a/Octokit/Http/ApiResponse.cs b/Octokit/Http/ApiResponse.cs index a9dc2cdb..2b2a2cd0 100644 --- a/Octokit/Http/ApiResponse.cs +++ b/Octokit/Http/ApiResponse.cs @@ -23,5 +23,6 @@ namespace Octokit.Http public Uri ResponseUri { get; set; } public ApiInfo ApiInfo { get; set; } public HttpStatusCode StatusCode { get; set; } + public string ContentType { get; set; } } } diff --git a/Octokit/Http/HttpClientAdapter.cs b/Octokit/Http/HttpClientAdapter.cs index ed95ee1d..c2990fbf 100644 --- a/Octokit/Http/HttpClientAdapter.cs +++ b/Octokit/Http/HttpClientAdapter.cs @@ -26,11 +26,13 @@ namespace Octokit.Http Ensure.ArgumentNotNull(responseMessage, "responseMessage"); string responseBody = null; + string contentType = null; using (var content = responseMessage.Content) { if (content != null) { responseBody = await responseMessage.Content.ReadAsStringAsync(); + contentType = GetContentType(content); } } @@ -38,6 +40,7 @@ namespace Octokit.Http { Body = responseBody, StatusCode = responseMessage.StatusCode, + ContentType = contentType }; foreach (var h in responseMessage.Headers) @@ -56,7 +59,9 @@ namespace Octokit.Http { requestMessage = new HttpRequestMessage(request.Method, request.Endpoint); foreach (var header in request.Headers) + { requestMessage.Headers.Add(header.Key, header.Value); + } var body = request.Body as string; if (body != null) @@ -80,5 +85,14 @@ namespace Octokit.Http return requestMessage; } + + static string GetContentType(HttpContent httpContent) + { + if (httpContent.Headers != null && httpContent.Headers.ContentType != null) + { + return httpContent.Headers.ContentType.MediaType; + } + return null; + } } } diff --git a/Octokit/Http/IResponse.cs b/Octokit/Http/IResponse.cs index 3932c851..056573ce 100644 --- a/Octokit/Http/IResponse.cs +++ b/Octokit/Http/IResponse.cs @@ -17,5 +17,6 @@ namespace Octokit.Http Uri ResponseUri { get; set; } ApiInfo ApiInfo { get; set; } HttpStatusCode StatusCode { get; set; } + string ContentType { get; set; } } } diff --git a/Octokit/Http/JsonHttpPipeline.cs b/Octokit/Http/JsonHttpPipeline.cs index 90d90295..96726dcd 100644 --- a/Octokit/Http/JsonHttpPipeline.cs +++ b/Octokit/Http/JsonHttpPipeline.cs @@ -1,4 +1,5 @@ -using System.Net.Http; +using System; +using System.Net.Http; namespace Octokit.Http { @@ -43,8 +44,11 @@ namespace Octokit.Http { Ensure.ArgumentNotNull(response, "response"); - var json = _serializer.Deserialize(response.Body); - response.BodyAsObject = json; + if (response.ContentType != null && response.ContentType.Equals("application/json", StringComparison.Ordinal)) + { + var json = _serializer.Deserialize(response.Body); + response.BodyAsObject = json; + } } } }