Skip to content

Commit c6bf8a6

Browse files
committed
Fix - Ensure redirects are handled by middleware.RedirectHandler
1 parent 5d94234 commit c6bf8a6

5 files changed

Lines changed: 75 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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ private KiotaClientFactory() {}
5858
Objects.requireNonNull(interceptors, "parameter interceptors cannot be null");
5959
final OkHttpClient.Builder builder =
6060
new OkHttpClient.Builder()
61+
.followRedirects(false) // Redirects handled by .middleware.RedirectHandler rather than okhttp
6162
.connectTimeout(Duration.ofSeconds(100))
6263
.readTimeout(Duration.ofSeconds(100))
6364
.callTimeout(

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,11 @@ 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("com.microsoft.kiota.handler.redirect.count", requestsCount);
178+
redirectSpan.setAttribute("http.status_code", response.code());
179+
redirectSpan.end();
180+
}
180181
}
181182
} while (shouldRedirect);
182183
} 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: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.microsoft.kiota.http.middleware;
2+
3+
import com.microsoft.kiota.http.KiotaClientFactory;
4+
import com.microsoft.kiota.http.middleware.options.RedirectHandlerOption;
5+
import okhttp3.*;
6+
import okhttp3.mockwebserver.MockResponse;
7+
import okhttp3.mockwebserver.MockWebServer;
8+
import org.junit.jupiter.api.Test;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
12+
13+
@SuppressWarnings("resource")
14+
public class RedirectHandlerTests {
15+
16+
@Test
17+
void redirectsAreFollowedByDefault() throws Exception {
18+
var server = new MockWebServer();
19+
server.enqueue(new MockResponse()
20+
.setResponseCode(301)
21+
.setHeader("Location", server.url("/bar"))
22+
);
23+
server.enqueue(new MockResponse()
24+
.setResponseCode(201)
25+
);
26+
27+
var interceptors = new Interceptor[] { new RedirectHandler() };
28+
29+
final OkHttpClient client = KiotaClientFactory.create(interceptors).build();
30+
final Request request = new Request.Builder().url(server.url("/foo")).build();
31+
32+
// ACT
33+
var response = client.newCall(request).execute();
34+
35+
server.takeRequest(); // discard first request
36+
var request2 = server.takeRequest();
37+
38+
assertEquals("/bar", request2.getPath());
39+
assertEquals(201, response.code());
40+
}
41+
42+
@Test
43+
void redirectsCanBeDisabled() throws Exception {
44+
var server = new MockWebServer();
45+
server.enqueue(new MockResponse()
46+
.setResponseCode(301)
47+
.setHeader("Location", server.url("/bar"))
48+
);
49+
50+
var ignoreRedirectsOption = new RedirectHandlerOption(0, response -> false);
51+
var redirectHandler = new RedirectHandler(ignoreRedirectsOption);
52+
var interceptors = new Interceptor[] { redirectHandler };
53+
54+
final OkHttpClient client = KiotaClientFactory.create(interceptors).build();
55+
final Request request = new Request.Builder().url(server.url("/foo")).build();
56+
57+
// ACT
58+
var response = client.newCall(request).execute();
59+
60+
assertEquals(301, response.code());
61+
}
62+
}

0 commit comments

Comments
 (0)