@@ -172,6 +172,26 @@ public void connectionsArePooledByHostAndPort() throws InterruptedException {
172
172
173
173
}
174
174
175
+ @ Test
176
+ public void doesNotRetryOn429StatusCode () throws InterruptedException {
177
+ server .return429OnFirstRequest = true ;
178
+ server .closeConnection = false ;
179
+
180
+ HttpTestUtils .sendGetRequest (server .port (), client ).join ();
181
+ // Wait to ensure no retries happen
182
+ Thread .sleep (100 );
183
+
184
+ // Verify only one request was made (no retries)
185
+ assertThat (server .requestCount ).isEqualTo (1 );
186
+
187
+ // Send second request to verify connection reuse works after 429
188
+ HttpTestUtils .sendGetRequest (server .port (), client ).join ();
189
+
190
+ // Verify connection was reused and total of 2 requests
191
+ assertThat (server .channels .size ()).isEqualTo (1 );
192
+ assertThat (server .requestCount ).isEqualTo (2 );
193
+ }
194
+
175
195
private static class Server extends ChannelInitializer <Channel > {
176
196
private static final byte [] CONTENT = "helloworld" .getBytes (StandardCharsets .UTF_8 );
177
197
private ServerBootstrap bootstrap ;
@@ -181,6 +201,9 @@ private static class Server extends ChannelInitializer<Channel> {
181
201
private SslContext sslCtx ;
182
202
private boolean return500OnFirstRequest ;
183
203
private boolean closeConnection ;
204
+ private boolean return429OnFirstRequest ;
205
+ private volatile int requestCount = 0 ;
206
+
184
207
185
208
public void init () throws Exception {
186
209
SelfSignedCertificate ssc = new SelfSignedCertificate ();
@@ -218,10 +241,14 @@ private class BehaviorTestChannelHandler extends ChannelDuplexHandler {
218
241
@ Override
219
242
public void channelRead (ChannelHandlerContext ctx , Object msg ) {
220
243
if (msg instanceof HttpRequest ) {
244
+ requestCount ++;
221
245
222
246
HttpResponseStatus status ;
223
247
if (ctx .channel ().equals (channels .get (0 )) && return500OnFirstRequest ) {
224
248
status = INTERNAL_SERVER_ERROR ;
249
+ } else if (ctx .channel ().equals (channels .get (0 )) && return429OnFirstRequest ) {
250
+ status = HttpResponseStatus .TOO_MANY_REQUESTS ;
251
+ return429OnFirstRequest = false ; // Reset after first use
225
252
} else {
226
253
status = OK ;
227
254
}
0 commit comments