3333import java .util .HashMap ;
3434import java .util .List ;
3535import java .util .Map ;
36+ import java .util .Objects ;
3637import java .util .regex .Matcher ;
3738import java .util .regex .Pattern ;
3839import java .util .stream .Collectors ;
@@ -150,6 +151,7 @@ public ResponseWrapper<String> get(URI uri, Map<String, String> headers, Scopes
150151 return executeRequest (
151152 "GET" ,
152153 uri ,
154+ true ,
153155 headers ,
154156 new byte [0 ],
155157 HttpResponse .BodyHandlers .ofString (),
@@ -172,6 +174,7 @@ public ResponseWrapper<Path> download(
172174 return executeRequest (
173175 "GET" ,
174176 uri ,
177+ true ,
175178 headers ,
176179 new byte [0 ],
177180 HttpResponse .BodyHandlers .ofFile (file ),
@@ -193,6 +196,7 @@ public ResponseWrapper<InputStream> download(
193196 return executeRequest (
194197 "GET" ,
195198 uri ,
199+ true ,
196200 headers ,
197201 new byte [0 ],
198202 HttpResponse .BodyHandlers .ofInputStream (),
@@ -217,6 +221,7 @@ public ResponseWrapper<String> upload(
217221 return executeRequest (
218222 method ,
219223 uri ,
224+ true ,
220225 headers ,
221226 new byte [0 ],
222227 HttpResponse .BodyHandlers .ofString (),
@@ -241,6 +246,7 @@ public ResponseWrapper<String> head(
241246 return executeRequest (
242247 "HEAD" ,
243248 uri ,
249+ true ,
244250 headers ,
245251 new byte [0 ],
246252 HttpResponse .BodyHandlers .ofString (),
@@ -262,6 +268,7 @@ public ResponseWrapper<String> delete(
262268 return executeRequest (
263269 "DELETE" ,
264270 uri ,
271+ true ,
265272 headers ,
266273 new byte [0 ],
267274 HttpResponse .BodyHandlers .ofString (),
@@ -284,6 +291,7 @@ public ResponseWrapper<String> post(
284291 return executeRequest (
285292 "POST" ,
286293 uri ,
294+ true ,
287295 headers ,
288296 body ,
289297 HttpResponse .BodyHandlers .ofString (),
@@ -306,6 +314,7 @@ public ResponseWrapper<String> patch(
306314 return executeRequest (
307315 "PATCH" ,
308316 uri ,
317+ true ,
309318 headers ,
310319 body ,
311320 HttpResponse .BodyHandlers .ofString (),
@@ -328,6 +337,7 @@ public ResponseWrapper<String> put(
328337 return executeRequest (
329338 "PUT" ,
330339 uri ,
340+ true ,
331341 headers ,
332342 body ,
333343 HttpResponse .BodyHandlers .ofString (),
@@ -411,6 +421,7 @@ public <T> TokenResponse refreshToken(
411421 private <T > ResponseWrapper <T > executeRequest (
412422 String method ,
413423 URI uri ,
424+ boolean includeAuthHeader ,
414425 Map <String , String > headers ,
415426 byte [] body ,
416427 HttpResponse .BodyHandler <T > handler ,
@@ -435,7 +446,8 @@ private <T> ResponseWrapper<T> executeRequest(
435446
436447 // Add authentication header if any
437448 if (authProvider .getAuthHeader (containerRef ) != null
438- && !authProvider .getAuthScheme ().equals (AuthScheme .NONE )) {
449+ && !authProvider .getAuthScheme ().equals (AuthScheme .NONE )
450+ && includeAuthHeader ) {
439451 builder = builder .header (Const .AUTHORIZATION_HEADER , authProvider .getAuthHeader (containerRef ));
440452 }
441453 headers .forEach (builder ::header );
@@ -450,9 +462,22 @@ private <T> ResponseWrapper<T> executeRequest(
450462 // Follow redirect
451463 if (shouldRedirect (response )) {
452464 String location = getLocationHeader (response );
453- LOG .debug ("Redirecting to {}" , location );
465+ URI redirectUri = URI .create (location );
466+ LOG .debug ("Redirecting to {} from domain {} to domain {}" , location , uri , redirectUri );
467+ boolean includeAuthHeaderForRedirect = isSameOrigin (uri , redirectUri );
468+ if (!includeAuthHeaderForRedirect ) {
469+ LOG .debug ("Skipping auth header for redirect from {} to {}" , uri , redirectUri );
470+ }
454471 return executeRequest (
455- method , URI .create (location ), headers , body , handler , bodyPublisher , newScopes , authProvider );
472+ method ,
473+ redirectUri ,
474+ includeAuthHeaderForRedirect ,
475+ headers ,
476+ body ,
477+ handler ,
478+ bodyPublisher ,
479+ newScopes ,
480+ authProvider );
456481 }
457482 return redoRequest (response , builder , handler , newScopes , authProvider );
458483 } catch (Exception e ) {
@@ -461,6 +486,20 @@ private <T> ResponseWrapper<T> executeRequest(
461486 }
462487 }
463488
489+ private static boolean isSameOrigin (URI uri1 , URI uri2 ) {
490+ return Objects .equals (uri1 .getScheme (), uri2 .getScheme ())
491+ && Objects .equals (uri1 .getHost (), uri2 .getHost ())
492+ && getPort (uri1 ) == getPort (uri2 );
493+ }
494+
495+ private static int getPort (URI uri ) {
496+ int port = uri .getPort ();
497+ if (port == -1 ) {
498+ return uri .getScheme ().equals ("https" ) ? 443 : 80 ;
499+ }
500+ return port ;
501+ }
502+
464503 private <T > boolean shouldRedirect (HttpResponse <T > response ) {
465504 return response .statusCode () == HttpURLConnection .HTTP_MOVED_PERM
466505 || response .statusCode () == HttpURLConnection .HTTP_MOVED_TEMP
0 commit comments