Skip to content

Commit 909383f

Browse files
committed
- fixes a bug where chunk encoding would make the redirect handler fail
1 parent 317c35f commit 909383f

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

src/main/java/com/microsoft/graph/httpcore/HttpClients.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public static Builder custom() {
2222
return new OkHttpClient.Builder()
2323
.addInterceptor(new TelemetryHandler())
2424
.followRedirects(false)
25+
.followSslRedirects(false)
2526
.protocols(Arrays.asList(Protocol.HTTP_1_1)); //https://stackoverflow.com/questions/62031298/sockettimeout-on-java-11-but-not-on-java-8
2627
}
2728

src/main/java/com/microsoft/graph/httpcore/RedirectHandler.java

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@
1919
import okhttp3.Response;
2020

2121
public class RedirectHandler implements Interceptor{
22-
22+
2323
public final MiddlewareType MIDDLEWARE_TYPE = MiddlewareType.REDIRECT;
24-
24+
2525
private RedirectOptions mRedirectOptions;
26-
26+
2727
/*
2828
* Initialize using default redirect options, default IShouldRedirect and max redirect value
2929
*/
3030
public RedirectHandler() {
3131
this(null);
3232
}
33-
33+
3434
/*
3535
* @param redirectOptions pass instance of redirect options to be used
3636
*/
@@ -40,16 +40,16 @@ public RedirectHandler(RedirectOptions redirectOptions) {
4040
this.mRedirectOptions = new RedirectOptions();
4141
}
4242
}
43-
43+
4444
boolean isRedirected(Request request, Response response, int redirectCount, RedirectOptions redirectOptions) throws IOException {
4545
// Check max count of redirects reached
4646
if(redirectCount > redirectOptions.maxRedirects()) return false;
47-
47+
4848
// Location header empty then don't redirect
4949
final String locationHeader = response.header("location");
5050
if(locationHeader == null)
5151
return false;
52-
52+
5353
// If any of 301,302,303,307,308 then redirect
5454
final int statusCode = response.code();
5555
if(statusCode == HTTP_PERM_REDIRECT || //308
@@ -58,31 +58,31 @@ boolean isRedirected(Request request, Response response, int redirectCount, Redi
5858
statusCode == HTTP_SEE_OTHER || //303
5959
statusCode == HTTP_MOVED_TEMP) //302
6060
return true;
61-
61+
6262
return false;
6363
}
64-
64+
6565
Request getRedirect(
6666
final Request request,
67-
final Response userResponse) throws ProtocolException {
67+
final Response userResponse) throws ProtocolException {
6868
String location = userResponse.header("Location");
6969
if (location == null || location.length() == 0) return null;
70-
70+
7171
// For relative URL in location header, the new url to redirect is relative to original request
7272
if(location.startsWith("/")) {
7373
if(request.url().toString().endsWith("/")) {
7474
location = location.substring(1);
7575
}
7676
location = request.url() + location;
7777
}
78-
78+
7979
HttpUrl requestUrl = userResponse.request().url();
80-
80+
8181
HttpUrl locationUrl = userResponse.request().url().resolve(location);
82-
82+
8383
// Don't follow redirects to unsupported protocols.
8484
if (locationUrl == null) return null;
85-
85+
8686
// Most redirects don't include a request body.
8787
Request.Builder requestBuilder = userResponse.request().newBuilder();
8888

@@ -94,7 +94,7 @@ Request getRedirect(
9494
if (!sameScheme || !sameHost) {
9595
requestBuilder.removeHeader("Authorization");
9696
}
97-
97+
9898
// Response status code 303 See Other then POST changes to GET
9999
if(userResponse.code() == HTTP_SEE_OTHER) {
100100
requestBuilder.method("GET", null);
@@ -107,29 +107,30 @@ Request getRedirect(
107107
@Override
108108
public Response intercept(Chain chain) throws IOException {
109109
Request request = chain.request();
110-
110+
111111
if(request.tag(TelemetryOptions.class) == null)
112112
request = request.newBuilder().tag(TelemetryOptions.class, new TelemetryOptions()).build();
113113
request.tag(TelemetryOptions.class).setFeatureUsage(TelemetryOptions.REDIRECT_HANDLER_ENABLED_FLAG);
114-
114+
115115
Response response = null;
116116
int requestsCount = 1;
117-
117+
118118
// Use should retry pass along with this request
119119
RedirectOptions redirectOptions = request.tag(RedirectOptions.class);
120120
redirectOptions = redirectOptions != null ? redirectOptions : this.mRedirectOptions;
121-
121+
122122
while(true) {
123123
response = chain.proceed(request);
124-
boolean shouldRedirect = isRedirected(request, response, requestsCount, redirectOptions)
124+
final boolean shouldRedirect = isRedirected(request, response, requestsCount, redirectOptions)
125125
&& redirectOptions.shouldRedirect().shouldRedirect(response);
126126
if(!shouldRedirect) break;
127-
128-
Request followup = getRedirect(request, response);
129-
if(followup == null) break;
130-
request = followup;
131-
132-
requestsCount++;
127+
128+
final Request followup = getRedirect(request, response);
129+
if(followup != null) {
130+
response.close();
131+
request = followup;
132+
requestsCount++;
133+
}
133134
}
134135
return response;
135136
}

0 commit comments

Comments
 (0)