Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions components/http/okHttp/gradle/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ dependencies {

testImplementation 'org.mockito:mockito-core:5.18.0'
testImplementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
testImplementation 'com.squareup.okhttp3:mockwebserver:4.12.0'


// This dependency is used internally, and not exposed to consumers on their own compile classpath.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ private KiotaClientFactory() {}
Objects.requireNonNull(interceptors, "parameter interceptors cannot be null");
final OkHttpClient.Builder builder =
new OkHttpClient.Builder()
.followRedirects(false) // Redirects handled by .middleware.RedirectHandler rather than okhttp
.connectTimeout(Duration.ofSeconds(100))
.readTimeout(Duration.ofSeconds(100))
.callTimeout(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,11 @@ Request getRedirect(final Request request, final Response userResponse)
request,
"RedirectHandler_Intercept - redirect " + requestsCount,
span);
redirectSpan.setAttribute(
"com.microsoft.kiota.handler.redirect.count", requestsCount);
redirectSpan.setAttribute("http.status_code", response.code());
redirectSpan.end();
if(redirectSpan != null) {
redirectSpan.setAttribute("com.microsoft.kiota.handler.redirect.count", requestsCount);
redirectSpan.setAttribute("http.status_code", response.code());
redirectSpan.end();
}
}
} while (shouldRedirect);
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,12 @@ void testCreateWithAuthProviderAndRequestOptions() throws IOException {
}
}

@Test
void upstreamRedirectHandlingDisabledByDefault() {
OkHttpClient client = KiotaClientFactory.create().build();
assertFalse(client.followRedirects());
}

private static RetryHandler getDisabledRetryHandler() {
RetryHandlerOption retryHandlerOption =
new RetryHandlerOption((delay, executionCount, request, response) -> false, 0, 0);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.microsoft.kiota.http.middleware;

import com.microsoft.kiota.http.KiotaClientFactory;
import com.microsoft.kiota.http.middleware.options.RedirectHandlerOption;
import okhttp3.*;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;


@SuppressWarnings("resource")
public class RedirectHandlerTests {

@Test
void redirectsAreFollowedByDefault() throws Exception {
var server = new MockWebServer();
server.enqueue(new MockResponse()
.setResponseCode(301)
.setHeader("Location", server.url("/bar"))
);
server.enqueue(new MockResponse()
.setResponseCode(201)
);

var interceptors = new Interceptor[] { new RedirectHandler() };

final OkHttpClient client = KiotaClientFactory.create(interceptors).build();
final Request request = new Request.Builder().url(server.url("/foo")).build();

// ACT
var response = client.newCall(request).execute();

server.takeRequest(); // discard first request
var request2 = server.takeRequest();

assertEquals("/bar", request2.getPath());
assertEquals(201, response.code());
}

@Test
void redirectsCanBeDisabled() throws Exception {
var server = new MockWebServer();
server.enqueue(new MockResponse()
.setResponseCode(301)
.setHeader("Location", server.url("/bar"))
);

var ignoreRedirectsOption = new RedirectHandlerOption(0, response -> false);
var redirectHandler = new RedirectHandler(ignoreRedirectsOption);
var interceptors = new Interceptor[] { redirectHandler };

final OkHttpClient client = KiotaClientFactory.create(interceptors).build();
final Request request = new Request.Builder().url(server.url("/foo")).build();

// ACT
var response = client.newCall(request).execute();

assertEquals(301, response.code());
}
}
Loading