Skip to content

Commit 141d17d

Browse files
authored
fix: Ensure redirects are handled by middleware.RedirectHandler (#1909)
* Fix - Ensure redirects are handled by middleware.RedirectHandler * Fix style violations
1 parent b413d79 commit 141d17d

5 files changed

Lines changed: 73 additions & 4 deletions

File tree

components/http/okHttp/gradle/dependencies.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ dependencies {
55

66
testImplementation 'org.mockito:mockito-core:5.18.0'
77
testImplementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
8+
testImplementation 'com.squareup.okhttp3:mockwebserver:4.12.0'
89

910

1011
// This dependency is used internally, and not exposed to consumers on their own compile classpath.

components/http/okHttp/src/main/java/com/microsoft/kiota/http/KiotaClientFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ private KiotaClientFactory() {}
5858
Objects.requireNonNull(interceptors, "parameter interceptors cannot be null");
5959
final OkHttpClient.Builder builder =
6060
new OkHttpClient.Builder()
61+
.followRedirects(
62+
false) // Redirects handled by .middleware.RedirectHandler rather
63+
// than okhttp
6164
.connectTimeout(Duration.ofSeconds(100))
6265
.readTimeout(Duration.ofSeconds(100))
6366
.callTimeout(

components/http/okHttp/src/main/java/com/microsoft/kiota/http/middleware/RedirectHandler.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,12 @@ Request getRedirect(final Request request, final Response userResponse)
173173
request,
174174
"RedirectHandler_Intercept - redirect " + requestsCount,
175175
span);
176-
redirectSpan.setAttribute(
177-
"com.microsoft.kiota.handler.redirect.count", requestsCount);
178-
redirectSpan.setAttribute("http.status_code", response.code());
179-
redirectSpan.end();
176+
if (redirectSpan != null) {
177+
redirectSpan.setAttribute(
178+
"com.microsoft.kiota.handler.redirect.count", requestsCount);
179+
redirectSpan.setAttribute("http.status_code", response.code());
180+
redirectSpan.end();
181+
}
180182
}
181183
} while (shouldRedirect);
182184
} finally {

components/http/okHttp/src/test/java/com/microsoft/kiota/http/KiotaClientFactoryTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ void testCreateWithAuthProviderAndRequestOptions() throws IOException {
153153
}
154154
}
155155

156+
@Test
157+
void upstreamRedirectHandlingDisabledByDefault() {
158+
OkHttpClient client = KiotaClientFactory.create().build();
159+
assertFalse(client.followRedirects());
160+
}
161+
156162
private static RetryHandler getDisabledRetryHandler() {
157163
RetryHandlerOption retryHandlerOption =
158164
new RetryHandlerOption((delay, executionCount, request, response) -> false, 0, 0);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.microsoft.kiota.http.middleware;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import com.microsoft.kiota.http.KiotaClientFactory;
6+
import com.microsoft.kiota.http.middleware.options.RedirectHandlerOption;
7+
8+
import okhttp3.*;
9+
import okhttp3.mockwebserver.MockResponse;
10+
import okhttp3.mockwebserver.MockWebServer;
11+
12+
import org.junit.jupiter.api.Test;
13+
14+
@SuppressWarnings("resource")
15+
public class RedirectHandlerTests {
16+
17+
@Test
18+
void redirectsAreFollowedByDefault() throws Exception {
19+
var server = new MockWebServer();
20+
server.enqueue(
21+
new MockResponse().setResponseCode(301).setHeader("Location", server.url("/bar")));
22+
server.enqueue(new MockResponse().setResponseCode(201));
23+
24+
var interceptors = new Interceptor[] {new RedirectHandler()};
25+
26+
final OkHttpClient client = KiotaClientFactory.create(interceptors).build();
27+
final Request request = new Request.Builder().url(server.url("/foo")).build();
28+
29+
// ACT
30+
var response = client.newCall(request).execute();
31+
32+
server.takeRequest(); // discard first request
33+
var request2 = server.takeRequest();
34+
35+
assertEquals("/bar", request2.getPath());
36+
assertEquals(201, response.code());
37+
}
38+
39+
@Test
40+
void redirectsCanBeDisabled() throws Exception {
41+
var server = new MockWebServer();
42+
server.enqueue(
43+
new MockResponse().setResponseCode(301).setHeader("Location", server.url("/bar")));
44+
45+
var ignoreRedirectsOption = new RedirectHandlerOption(0, response -> false);
46+
var redirectHandler = new RedirectHandler(ignoreRedirectsOption);
47+
var interceptors = new Interceptor[] {redirectHandler};
48+
49+
final OkHttpClient client = KiotaClientFactory.create(interceptors).build();
50+
final Request request = new Request.Builder().url(server.url("/foo")).build();
51+
52+
// ACT
53+
var response = client.newCall(request).execute();
54+
55+
assertEquals(301, response.code());
56+
}
57+
}

0 commit comments

Comments
 (0)