From f42c1a2209388603a8b0c390d527506939e69d95 Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Thu, 21 Feb 2019 22:40:11 +0100 Subject: [PATCH] Check validity of JSON in OK responses --- .../Infrastructure/Public/StripeClient.cs | 13 +++++++++-- .../Infrastructure/Public/StripeClientTest.cs | 23 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/Stripe.net/Infrastructure/Public/StripeClient.cs b/src/Stripe.net/Infrastructure/Public/StripeClient.cs index dbe8527ded..1f013e8b6f 100644 --- a/src/Stripe.net/Infrastructure/Public/StripeClient.cs +++ b/src/Stripe.net/Infrastructure/Public/StripeClient.cs @@ -62,7 +62,16 @@ private static T ProcessResponse(StripeResponse response) throw BuildStripeException(response); } - var obj = StripeEntity.FromJson(response.Content); + T obj; + try + { + obj = StripeEntity.FromJson(response.Content); + } + catch (Newtonsoft.Json.JsonException) + { + throw BuildInvalidResponseException(response); + } + obj.StripeResponse = response; return obj; @@ -111,7 +120,7 @@ private static StripeException BuildInvalidResponseException(StripeResponse resp return new StripeException( response.StatusCode, null, - $"Invalid response object from API: {response.Content}") + $"Invalid response object from API: \"{response.Content}\"") { StripeResponse = response, }; diff --git a/src/StripeTests/Infrastructure/Public/StripeClientTest.cs b/src/StripeTests/Infrastructure/Public/StripeClientTest.cs index 14fceace26..db3e3f94bb 100644 --- a/src/StripeTests/Infrastructure/Public/StripeClientTest.cs +++ b/src/StripeTests/Infrastructure/Public/StripeClientTest.cs @@ -44,6 +44,25 @@ public async Task RequestAsync_OkResponse() Assert.Equal(response, charge.StripeResponse); } + [Fact] + public async Task RequestAsync_OkResponse_InvalidJson() + { + var response = new StripeResponse(HttpStatusCode.OK, null, "this isn't JSON"); + this.httpClient.Response = response; + + var exception = await Assert.ThrowsAsync(async () => + await this.stripeClient.RequestAsync( + HttpMethod.Post, + "/v1/charges", + this.options, + this.requestOptions)); + + Assert.NotNull(exception); + Assert.Equal(HttpStatusCode.OK, exception.HttpStatusCode); + Assert.Equal("Invalid response object from API: \"this isn't JSON\"", exception.Message); + Assert.Equal(response, exception.StripeResponse); + } + [Fact] public async Task RequestAsync_ApiError() { @@ -106,7 +125,7 @@ await this.stripeClient.RequestAsync( Assert.NotNull(exception); Assert.Equal(HttpStatusCode.InternalServerError, exception.HttpStatusCode); - Assert.Equal("Invalid response object from API: this isn't JSON", exception.Message); + Assert.Equal("Invalid response object from API: \"this isn't JSON\"", exception.Message); Assert.Equal(response, exception.StripeResponse); } @@ -128,7 +147,7 @@ await this.stripeClient.RequestAsync( Assert.NotNull(exception); Assert.Equal(HttpStatusCode.InternalServerError, exception.HttpStatusCode); - Assert.Equal("Invalid response object from API: {}", exception.Message); + Assert.Equal("Invalid response object from API: \"{}\"", exception.Message); Assert.Equal(response, exception.StripeResponse); }