1919import okhttp3 .Response ;
2020
2121public 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