Skip to content

Commit cb4d131

Browse files
authored
Warn when stripe-notify header is present (#2219)
1 parent 5880465 commit cb4d131

2 files changed

Lines changed: 95 additions & 0 deletions

File tree

src/main/java/com/stripe/net/LiveStripeResponseGetter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@
2121
import java.util.List;
2222
import java.util.Map;
2323
import java.util.Optional;
24+
import java.util.logging.Logger;
2425

2526
public class LiveStripeResponseGetter implements StripeResponseGetter {
27+
private static final Logger logger = Logger.getLogger("Stripe");
28+
2629
private final HttpClient httpClient;
2730
private final StripeResponseGetterOptions options;
2831

@@ -131,6 +134,8 @@ public <T extends StripeObject> T request(ApiRequest apiRequest, Type typeToken)
131134
StripeResponse response =
132135
sendWithTelemetry(request, apiRequest.getUsage(), r -> httpClient.requestWithRetries(r));
133136

137+
maybeEmitStripeNotice(response.headers());
138+
134139
int responseCode = response.code();
135140
String responseBody = response.body();
136141
String requestId = response.requestId();
@@ -174,6 +179,8 @@ public InputStream requestStream(ApiRequest apiRequest) throws StripeException {
174179
sendWithTelemetry(
175180
request, apiRequest.getUsage(), r -> httpClient.requestStreamWithRetries(r));
176181

182+
maybeEmitStripeNotice(responseStream.headers());
183+
177184
int responseCode = responseStream.code();
178185

179186
if (responseCode < 200 || responseCode >= 300) {
@@ -255,6 +262,10 @@ public InputStream requestStream(
255262
return this.requestStream(new ApiRequest(baseAddress, method, path, params, options));
256263
}
257264

265+
private static void maybeEmitStripeNotice(HttpHeaders headers) {
266+
headers.firstValue("Stripe-Notice").ifPresent(logger::warning);
267+
}
268+
258269
private static HttpClient buildDefaultHttpClient() {
259270
return new HttpURLConnectionClient();
260271
}

src/test/java/com/stripe/functional/LiveStripeResponseGetterTest.java

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.stripe.functional;
22

33
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
45
import static org.junit.jupiter.api.Assertions.assertNotNull;
56
import static org.junit.jupiter.api.Assertions.assertThrows;
7+
import static org.junit.jupiter.api.Assertions.assertTrue;
68

9+
import com.google.common.collect.ImmutableList;
10+
import com.google.common.collect.ImmutableMap;
711
import com.google.gson.JsonSyntaxException;
812
import com.stripe.BaseStripeTest;
913
import com.stripe.exception.ApiException;
@@ -18,12 +22,92 @@
1822
import com.stripe.net.StripeRequest;
1923
import com.stripe.net.StripeResponse;
2024
import com.stripe.net.StripeResponseGetter;
25+
import java.util.ArrayList;
2126
import java.util.Collections;
27+
import java.util.List;
28+
import java.util.logging.Handler;
29+
import java.util.logging.Level;
30+
import java.util.logging.LogRecord;
31+
import java.util.logging.Logger;
2232
import org.hamcrest.CoreMatchers;
33+
import org.junit.jupiter.api.AfterEach;
34+
import org.junit.jupiter.api.BeforeEach;
2335
import org.junit.jupiter.api.Test;
2436
import org.mockito.Mockito;
2537

2638
public class LiveStripeResponseGetterTest extends BaseStripeTest {
39+
private Logger stripeLogger;
40+
private CapturingHandler logHandler;
41+
42+
private static class CapturingHandler extends Handler {
43+
final List<LogRecord> records = new ArrayList<>();
44+
45+
@Override
46+
public void publish(LogRecord record) {
47+
records.add(record);
48+
}
49+
50+
@Override
51+
public void flush() {}
52+
53+
@Override
54+
public void close() {}
55+
}
56+
57+
@BeforeEach
58+
public void setUpLogger() {
59+
stripeLogger = Logger.getLogger("Stripe");
60+
logHandler = new CapturingHandler();
61+
logHandler.setLevel(Level.ALL);
62+
stripeLogger.addHandler(logHandler);
63+
stripeLogger.setLevel(Level.ALL);
64+
stripeLogger.setUseParentHandlers(false);
65+
}
66+
67+
@AfterEach
68+
public void tearDownLogger() {
69+
stripeLogger.removeHandler(logHandler);
70+
stripeLogger.setUseParentHandlers(true);
71+
}
72+
73+
@Test
74+
public void testStripeNoticeHeaderEmitsWarning() throws StripeException {
75+
HttpClient spy = Mockito.spy(new HttpURLConnectionClient());
76+
StripeResponseGetter srg = new LiveStripeResponseGetter(spy);
77+
ApiResource.setGlobalResponseGetter(srg);
78+
StripeResponse response =
79+
new StripeResponse(
80+
200,
81+
HttpHeaders.of(
82+
ImmutableMap.of(
83+
"Stripe-Notice",
84+
ImmutableList.of("This API version will be deprecated soon."))),
85+
"{\"id\": \"sub_123\", \"object\": \"subscription\"}");
86+
Mockito.doReturn(response).when(spy).requestWithRetries(Mockito.<StripeRequest>any());
87+
Subscription.retrieve("sub_123");
88+
89+
assertEquals(1, logHandler.records.size());
90+
assertEquals(Level.WARNING, logHandler.records.get(0).getLevel());
91+
assertEquals(
92+
"This API version will be deprecated soon.", logHandler.records.get(0).getMessage());
93+
}
94+
95+
@Test
96+
public void testNoStripeNoticeHeaderEmitsNoWarning() throws StripeException {
97+
HttpClient spy = Mockito.spy(new HttpURLConnectionClient());
98+
StripeResponseGetter srg = new LiveStripeResponseGetter(spy);
99+
ApiResource.setGlobalResponseGetter(srg);
100+
StripeResponse response =
101+
new StripeResponse(
102+
200,
103+
HttpHeaders.of(Collections.emptyMap()),
104+
"{\"id\": \"sub_123\", \"object\": \"subscription\"}");
105+
Mockito.doReturn(response).when(spy).requestWithRetries(Mockito.<StripeRequest>any());
106+
Subscription.retrieve("sub_123");
107+
108+
assertTrue(logHandler.records.isEmpty());
109+
}
110+
27111
@Test
28112
public void testInvalidJson() throws StripeException {
29113
HttpClient spy = Mockito.spy(new HttpURLConnectionClient());

0 commit comments

Comments
 (0)