@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2017 the original author or authors .
* Copyright 2002 - 2018 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -80,12 +80,18 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -80,12 +80,18 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
/ * *
* Prepare a builder from the host , port , scheme , and context path of the
* given HttpServletRequest .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromContextPath ( HttpServletRequest request ) {
ServletUriComponentsBuilder builder = initFromRequest ( request ) ;
builder . replacePath ( prependForwardedPrefix ( request , request . getContextPath ( ) ) ) ;
String forwardedPrefix = getForwardedPrefix ( request ) ;
builder . replacePath ( forwardedPrefix ! = null ? forwardedPrefix : request . getContextPath ( ) ) ;
return builder ;
}
@ -96,8 +102,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -96,8 +102,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
* will end with "/main" . If the servlet is mapped otherwise , e . g .
* { @code "/" } or { @code "*.do" } , the result will be the same as
* if calling { @link # fromContextPath ( HttpServletRequest ) } .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromServletMapping ( HttpServletRequest request ) {
ServletUriComponentsBuilder builder = fromContextPath ( request ) ;
@ -110,24 +121,34 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -110,24 +121,34 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
/ * *
* Prepare a builder from the host , port , scheme , and path ( but not the query )
* of the HttpServletRequest .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromRequestUri ( HttpServletRequest request ) {
ServletUriComponentsBuilder builder = initFromRequest ( request ) ;
builder . initPath ( prependForwardedPrefix ( request , request . getRequestURI ( ) ) ) ;
builder . initPath ( getRequestUriWith ForwardedPrefix( request ) ) ;
return builder ;
}
/ * *
* Prepare a builder by copying the scheme , host , port , path , and
* query string of an HttpServletRequest .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromRequest ( HttpServletRequest request ) {
ServletUriComponentsBuilder builder = initFromRequest ( request ) ;
builder . initPath ( prependForwardedPrefix ( request , request . getRequestURI ( ) ) ) ;
builder . initPath ( getRequestUriWith ForwardedPrefix( request ) ) ;
builder . query ( request . getQueryString ( ) ) ;
return builder ;
}
@ -151,7 +172,8 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -151,7 +172,8 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
return builder ;
}
private static String prependForwardedPrefix ( HttpServletRequest request , String path ) {
@Nullable
private static String getForwardedPrefix ( HttpServletRequest request ) {
String prefix = null ;
Enumeration < String > names = request . getHeaderNames ( ) ;
while ( names . hasMoreElements ( ) ) {
@ -161,7 +183,22 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -161,7 +183,22 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
}
}
if ( prefix ! = null ) {
path = prefix + path ;
while ( prefix . endsWith ( "/" ) ) {
prefix = prefix . substring ( 0 , prefix . length ( ) - 1 ) ;
}
}
return prefix ;
}
private static String getRequestUriWithForwardedPrefix ( HttpServletRequest request ) {
String path = request . getRequestURI ( ) ;
String forwardedPrefix = getForwardedPrefix ( request ) ;
if ( forwardedPrefix ! = null ) {
String contextPath = request . getContextPath ( ) ;
if ( ! StringUtils . isEmpty ( contextPath ) & & ! contextPath . equals ( "/" ) & & path . startsWith ( contextPath ) ) {
path = path . substring ( contextPath . length ( ) ) ;
}
path = forwardedPrefix + path ;
}
return path ;
}
@ -172,8 +209,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -172,8 +209,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
/ * *
* Same as { @link # fromContextPath ( HttpServletRequest ) } except the
* request is obtained through { @link RequestContextHolder } .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromCurrentContextPath ( ) {
return fromContextPath ( getCurrentRequest ( ) ) ;
@ -182,8 +224,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -182,8 +224,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
/ * *
* Same as { @link # fromServletMapping ( HttpServletRequest ) } except the
* request is obtained through { @link RequestContextHolder } .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromCurrentServletMapping ( ) {
return fromServletMapping ( getCurrentRequest ( ) ) ;
@ -192,8 +239,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -192,8 +239,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
/ * *
* Same as { @link # fromRequestUri ( HttpServletRequest ) } except the
* request is obtained through { @link RequestContextHolder } .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromCurrentRequestUri ( ) {
return fromRequestUri ( getCurrentRequest ( ) ) ;
@ -202,8 +254,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
@@ -202,8 +254,13 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder {
/ * *
* Same as { @link # fromRequest ( HttpServletRequest ) } except the
* request is obtained through { @link RequestContextHolder } .
*
* < p > < strong > Note : < / strong > This method extracts values from "Forwarded"
* and "X-Forwarded-*" headers if found . See class - level docs .
*
* < p > As of 4 . 3 . 15 , this method replaces the contextPath with the value
* of "X-Forwarded-Prefix" rather than prepending , thus aligning with
* { @code ForwardedHeaderFiller } .
* /
public static ServletUriComponentsBuilder fromCurrentRequest ( ) {
return fromRequest ( getCurrentRequest ( ) ) ;