Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/Stripe.net/Infrastructure/Public/LiveApiRequestor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ namespace Stripe
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -225,6 +227,18 @@ private static StripeException BuildV2StripeException(StripeResponse response)
}
}

private static void MaybeEmitStripeNotice(HttpResponseHeaders headers)
{
if (headers != null && headers.Contains("Stripe-Notice"))
Comment thread
xavdid marked this conversation as resolved.
{
var notice = headers.GetValues("Stripe-Notice").FirstOrDefault();
if (notice != null)
Comment thread
xavdid marked this conversation as resolved.
Outdated
{
Trace.TraceWarning(notice);
Comment thread
xavdid marked this conversation as resolved.
Outdated
}
}
}

// Note: BaseOptions options really means query params here
private StripeRequest MakeStripeRequest(
BaseAddress baseAddress,
Expand Down Expand Up @@ -274,6 +288,8 @@ private T ProcessResponse<T>(StripeResponse response, ApiMode apiMode)
throw BuildStripeException(response);
}

MaybeEmitStripeNotice(response.Headers);

T obj;
try
{
Expand Down Expand Up @@ -362,6 +378,8 @@ public override async Task<StripeResponse> RawRequestAsync(
throw BuildStripeException(response);
}

MaybeEmitStripeNotice(response.Headers);

return response;
}
}
Expand Down
133 changes: 133 additions & 0 deletions src/StripeTests/Infrastructure/Public/LiveApiRequestorTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ namespace StripeTests
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -711,6 +713,137 @@ public async Task StripeAccountHeaderSet()
Assert.Equal("acct_2345", lastRequest.StripeHeaders["Stripe-Account"]);
}

[Fact]
public async Task RequestAsync_EmitsTraceWarning_WhenStripeNoticeHeaderPresent()
{
var headers = BuildHeaders("Stripe-Notice", "test notice message");
var response = new StripeResponse(HttpStatusCode.OK, headers, "{\"id\": \"ch_123\"}");
this.httpClient.Response = response;

var listener = new CapturingTraceListener();
Trace.Listeners.Add(listener);
try
{
await this.apiRequestor.RequestAsync<Charge>(
BaseAddress.Api,
HttpMethod.Post,
"/v1/charges",
this.options,
this.requestOptions);

Assert.Contains("test notice message", listener.Warnings);
}
finally
{
Trace.Listeners.Remove(listener);
}
}

[Fact]
public async Task RequestAsync_NoTraceWarning_WhenStripeNoticeHeaderAbsent()
{
var response = new StripeResponse(HttpStatusCode.OK, null, "{\"id\": \"ch_123\"}");
this.httpClient.Response = response;

var listener = new CapturingTraceListener();
Trace.Listeners.Add(listener);
try
{
await this.apiRequestor.RequestAsync<Charge>(
BaseAddress.Api,
HttpMethod.Post,
"/v1/charges",
this.options,
this.requestOptions);

Assert.Empty(listener.Warnings);
}
finally
{
Trace.Listeners.Remove(listener);
}
}

[Fact]
public async Task RawRequestAsync_EmitsTraceWarning_WhenStripeNoticeHeaderPresent()
{
var headers = BuildHeaders("Stripe-Notice", "raw notice message");
var response = new StripeResponse(HttpStatusCode.OK, headers, "{\"id\": \"ch_123\"}");
this.httpClient.Response = response;

var listener = new CapturingTraceListener();
Trace.Listeners.Add(listener);
try
{
await this.apiRequestor.RawRequestAsync(
HttpMethod.Post,
"/v1/charges",
"foo=bar");

Assert.Contains("raw notice message", listener.Warnings);
}
finally
{
Trace.Listeners.Remove(listener);
}
}

[Fact]
public async Task RawRequestAsync_NoTraceWarning_WhenStripeNoticeHeaderAbsent()
{
var response = new StripeResponse(HttpStatusCode.OK, null, "{\"id\": \"ch_123\"}");
this.httpClient.Response = response;

var listener = new CapturingTraceListener();
Trace.Listeners.Add(listener);
try
{
await this.apiRequestor.RawRequestAsync(
HttpMethod.Post,
"/v1/charges",
"foo=bar");

Assert.Empty(listener.Warnings);
}
finally
{
Trace.Listeners.Remove(listener);
}
}

private static HttpResponseHeaders BuildHeaders(string name, string value)
{
var message = new HttpResponseMessage();
message.Headers.Add(name, value);
return message.Headers;
}

private class CapturingTraceListener : TraceListener
{
public List<string> Warnings { get; } = new List<string>();

public override void TraceEvent(
TraceEventCache eventCache,
string source,
TraceEventType eventType,
int id,
string message)
{
if (eventType == TraceEventType.Warning)
{
this.Warnings.Add(message);
}
}

public override void Write(string message)
{
}

public override void WriteLine(string message)
{
}
}

private class Foo : StripeEntity<Foo>
{
[JsonProperty("bar")]
Expand Down
Loading