|
56 | 56 | import org.apache.hc.core5.http.HttpHost; |
57 | 57 | import org.apache.hc.core5.http.HttpStatus; |
58 | 58 | import org.apache.hc.core5.http.ProtocolException; |
| 59 | +import org.apache.hc.core5.http.io.support.ClassicRequestBuilder; |
| 60 | +import org.apache.hc.core5.http.io.support.ClassicResponseBuilder; |
59 | 61 | import org.apache.hc.core5.http.message.BasicClassicHttpResponse; |
60 | 62 | import org.junit.jupiter.api.Assertions; |
61 | 63 | import org.junit.jupiter.api.BeforeEach; |
@@ -357,6 +359,56 @@ public void testRedirectProtocolException() throws Exception { |
357 | 359 | Mockito.verify(response1).close(); |
358 | 360 | } |
359 | 361 |
|
| 362 | + @Test |
| 363 | + public void testPutSeeOtherRedirect() throws Exception { |
| 364 | + final HttpRoute route = new HttpRoute(target); |
| 365 | + final URI targetUri = new URI("http://localhost:80/stuff"); |
| 366 | + final ClassicHttpRequest request = ClassicRequestBuilder.put() |
| 367 | + .setUri(targetUri) |
| 368 | + .setEntity("stuff") |
| 369 | + .build(); |
| 370 | + final HttpClientContext context = HttpClientContext.create(); |
| 371 | + |
| 372 | + final URI redirect1 = new URI("http://localhost:80/see-something-else"); |
| 373 | + final ClassicHttpResponse response1 = ClassicResponseBuilder.create(HttpStatus.SC_SEE_OTHER) |
| 374 | + .addHeader(HttpHeaders.LOCATION, redirect1.toASCIIString()) |
| 375 | + .build(); |
| 376 | + final URI redirect2 = new URI("http://localhost:80/other-stuff"); |
| 377 | + final ClassicHttpResponse response2 = ClassicResponseBuilder.create(HttpStatus.SC_MOVED_PERMANENTLY) |
| 378 | + .addHeader(HttpHeaders.LOCATION, redirect2.toASCIIString()) |
| 379 | + .build(); |
| 380 | + final ClassicHttpResponse response3 = ClassicResponseBuilder.create(HttpStatus.SC_OK) |
| 381 | + .build(); |
| 382 | + |
| 383 | + Mockito.when(chain.proceed( |
| 384 | + HttpRequestMatcher.matchesRequestUri(targetUri), |
| 385 | + ArgumentMatchers.any())).thenReturn(response1); |
| 386 | + Mockito.when(chain.proceed( |
| 387 | + HttpRequestMatcher.matchesRequestUri(redirect1), |
| 388 | + ArgumentMatchers.any())).thenReturn(response2); |
| 389 | + Mockito.when(chain.proceed( |
| 390 | + HttpRequestMatcher.matchesRequestUri(redirect2), |
| 391 | + ArgumentMatchers.any())).thenReturn(response3); |
| 392 | + |
| 393 | + final ExecChain.Scope scope = new ExecChain.Scope("test", route, request, endpoint, context); |
| 394 | + final ClassicHttpResponse finalResponse = redirectExec.execute(request, scope, chain); |
| 395 | + Assertions.assertEquals(200, finalResponse.getCode()); |
| 396 | + |
| 397 | + final ArgumentCaptor<ClassicHttpRequest> reqCaptor = ArgumentCaptor.forClass(ClassicHttpRequest.class); |
| 398 | + Mockito.verify(chain, Mockito.times(3)).proceed(reqCaptor.capture(), ArgumentMatchers.same(scope)); |
| 399 | + |
| 400 | + final List<ClassicHttpRequest> allValues = reqCaptor.getAllValues(); |
| 401 | + Assertions.assertNotNull(allValues); |
| 402 | + Assertions.assertEquals(3, allValues.size()); |
| 403 | + final ClassicHttpRequest request1 = allValues.get(0); |
| 404 | + final ClassicHttpRequest request2 = allValues.get(1); |
| 405 | + final ClassicHttpRequest request3 = allValues.get(2); |
| 406 | + Assertions.assertSame(request, request1); |
| 407 | + Assertions.assertEquals(request1.getMethod(), "PUT"); |
| 408 | + Assertions.assertEquals(request2.getMethod(), "GET"); |
| 409 | + Assertions.assertEquals(request3.getMethod(), "GET"); |
| 410 | + } |
| 411 | + |
360 | 412 | private static class HttpRequestMatcher implements ArgumentMatcher<ClassicHttpRequest> { |
361 | 413 |
|
362 | 414 | private final URI expectedRequestUri; |
|
0 commit comments