From 0a5acdb0cbca47a1f594e393f0313be2db443bcd Mon Sep 17 00:00:00 2001 From: Haacked Date: Fri, 27 Sep 2013 16:36:34 -0700 Subject: [PATCH] Add status code to ApiResponse We weren't setting this before. --- Octokit.Tests/Http/HttpClientAdapterTests.cs | 25 ++++++++++++++++---- Octokit/Http/ApiResponse.cs | 8 +++++++ Octokit/Http/HttpClientAdapter.cs | 13 ++++++---- Octokit/Http/IResponse.cs | 11 +++++++-- Octokit/Http/JsonHttpPipeline.cs | 13 +++++----- 5 files changed, 53 insertions(+), 17 deletions(-) diff --git a/Octokit.Tests/Http/HttpClientAdapterTests.cs b/Octokit.Tests/Http/HttpClientAdapterTests.cs index ea5a7fdb..ac52e946 100644 --- a/Octokit.Tests/Http/HttpClientAdapterTests.cs +++ b/Octokit.Tests/Http/HttpClientAdapterTests.cs @@ -5,6 +5,7 @@ using System.Net.Http; using System.Text; using System.Threading.Tasks; using Octokit.Http; +using Octokit.Tests.Helpers; using Xunit; namespace Octokit.Tests.Http @@ -62,7 +63,7 @@ namespace Octokit.Tests.Http }; var tester = new HttpClientAdapterTester(); - var response = await tester.BuildResponseTester(responseMessage); + var response = await tester.BuildResponseTester(responseMessage); var firstHeader = response.Headers.First(); Assert.Equal("peanut", firstHeader.Key); @@ -70,6 +71,25 @@ namespace Octokit.Tests.Http var lastHeader = response.Headers.Last(); Assert.Equal("ele", lastHeader.Key); Assert.Equal("phant", lastHeader.Value); + Assert.Equal("{}", response.Body); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task ThrowsExceptionWhenForbidden() + { + var responseMessage = new HttpResponseMessage { + StatusCode = HttpStatusCode.Forbidden, + Headers = + { + {"peanut", "butter"}, + } + }; + var tester = new HttpClientAdapterTester(); + + var exception = await AssertEx.Throws(async () => + await tester.BuildResponseTester(responseMessage)); + Assert.Equal(HttpStatusCode.Forbidden, exception.StatusCode); } } @@ -84,10 +104,7 @@ namespace Octokit.Tests.Http { return await BuildResponse(responseMessage); } - } - - } public class TheSendMethod diff --git a/Octokit/Http/ApiResponse.cs b/Octokit/Http/ApiResponse.cs index 32927dc0..a9dc2cdb 100644 --- a/Octokit/Http/ApiResponse.cs +++ b/Octokit/Http/ApiResponse.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Net; namespace Octokit.Http { @@ -10,10 +11,17 @@ namespace Octokit.Http Headers = new Dictionary(); } + object IResponse.BodyAsObject + { + get { return BodyAsObject; } + set { BodyAsObject = (T)value; } + } + public string Body { get; set; } public T BodyAsObject { get; set; } public Dictionary Headers { get; private set; } public Uri ResponseUri { get; set; } public ApiInfo ApiInfo { get; set; } + public HttpStatusCode StatusCode { get; set; } } } diff --git a/Octokit/Http/HttpClientAdapter.cs b/Octokit/Http/HttpClientAdapter.cs index b327c7ad..ce42f9f4 100644 --- a/Octokit/Http/HttpClientAdapter.cs +++ b/Octokit/Http/HttpClientAdapter.cs @@ -25,13 +25,16 @@ namespace Octokit.Http protected async virtual Task> BuildResponse(HttpResponseMessage responseMessage) { Ensure.ArgumentNotNull(responseMessage, "responseMessage"); - + + string responseBody = await responseMessage + .EnsureSuccess() + .Content + .ReadAsStringAsync(); + var response = new ApiResponse { - Body = await responseMessage - .EnsureSuccess() - .Content - .ReadAsStringAsync() + Body = responseBody, + StatusCode = responseMessage.StatusCode, }; foreach (var h in responseMessage.Headers) diff --git a/Octokit/Http/IResponse.cs b/Octokit/Http/IResponse.cs index 16723f3a..3932c851 100644 --- a/Octokit/Http/IResponse.cs +++ b/Octokit/Http/IResponse.cs @@ -1,14 +1,21 @@ using System; using System.Collections.Generic; +using System.Net; namespace Octokit.Http { - public interface IResponse + public interface IResponse : IResponse { + new T BodyAsObject { get; set; } + } + + public interface IResponse + { + object BodyAsObject { get; set; } string Body { get; set; } - T BodyAsObject { get; set; } Dictionary Headers { get; } Uri ResponseUri { get; set; } ApiInfo ApiInfo { get; set; } + HttpStatusCode StatusCode { get; set; } } } diff --git a/Octokit/Http/JsonHttpPipeline.cs b/Octokit/Http/JsonHttpPipeline.cs index 75f956c9..ccc9ee0f 100644 --- a/Octokit/Http/JsonHttpPipeline.cs +++ b/Octokit/Http/JsonHttpPipeline.cs @@ -3,12 +3,12 @@ namespace Octokit.Http { /// - /// Responsible for serializing the request and response as JSON and - /// adding the proper JSON response header. + /// Responsible for serializing the request and response as JSON and + /// adding the proper JSON response header. /// public class JsonHttpPipeline { - readonly IJsonSerializer serializer; + readonly IJsonSerializer _serializer; public JsonHttpPipeline() : this(new SimpleJsonSerializer()) { @@ -18,7 +18,7 @@ namespace Octokit.Http { Ensure.ArgumentNotNull(serializer, "serializer"); - this.serializer = serializer; + _serializer = serializer; } public void SerializeRequest(IRequest request) @@ -30,13 +30,14 @@ namespace Octokit.Http if (request.Method == HttpMethod.Get || request.Body == null) return; if (request.Body is string) return; - request.Body = serializer.Serialize(request.Body); } + request.Body = _serializer.Serialize(request.Body); + } public void DeserializeResponse(IResponse response) { Ensure.ArgumentNotNull(response, "response"); - var json = serializer.Deserialize(response.Body); + var json = _serializer.Deserialize(response.Body); response.BodyAsObject = json; } }