|  | @@ -15,12 +15,14 @@
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  package org.springframework.security.oauth2.client.web;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponse;
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
 | 
	
		
			
				|  |  | +import org.springframework.util.LinkedMultiValueMap;
 | 
	
		
			
				|  |  | +import org.springframework.util.MultiValueMap;
 | 
	
		
			
				|  |  |  import org.springframework.util.StringUtils;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Utility methods for an OAuth 2.0 Authorization Response.
 | 
	
		
			
				|  |  |   *
 | 
	
	
		
			
				|  | @@ -33,25 +35,36 @@ final class OAuth2AuthorizationResponseUtils {
 | 
	
		
			
				|  |  |  	private OAuth2AuthorizationResponseUtils() {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	static boolean isAuthorizationResponse(HttpServletRequest request) {
 | 
	
		
			
				|  |  | +	static MultiValueMap<String, String> toMultiMap(Map<String, String[]> map) {
 | 
	
		
			
				|  |  | +		MultiValueMap<String, String> params = new LinkedMultiValueMap<>(map.size());
 | 
	
		
			
				|  |  | +		map.forEach((key, values) -> {
 | 
	
		
			
				|  |  | +			if (values.length > 0) {
 | 
	
		
			
				|  |  | +				for (String value : values) {
 | 
	
		
			
				|  |  | +					params.add(key, value);
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		});
 | 
	
		
			
				|  |  | +		return params;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	static boolean isAuthorizationResponse(MultiValueMap<String, String> request) {
 | 
	
		
			
				|  |  |  		return isAuthorizationResponseSuccess(request) || isAuthorizationResponseError(request);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	static boolean isAuthorizationResponseSuccess(HttpServletRequest request) {
 | 
	
		
			
				|  |  | -		return StringUtils.hasText(request.getParameter(OAuth2ParameterNames.CODE)) &&
 | 
	
		
			
				|  |  | -			StringUtils.hasText(request.getParameter(OAuth2ParameterNames.STATE));
 | 
	
		
			
				|  |  | +	static boolean isAuthorizationResponseSuccess(MultiValueMap<String, String> request) {
 | 
	
		
			
				|  |  | +		return StringUtils.hasText(request.getFirst(OAuth2ParameterNames.CODE)) &&
 | 
	
		
			
				|  |  | +			StringUtils.hasText(request.getFirst(OAuth2ParameterNames.STATE));
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	static boolean isAuthorizationResponseError(HttpServletRequest request) {
 | 
	
		
			
				|  |  | -		return StringUtils.hasText(request.getParameter(OAuth2ParameterNames.ERROR)) &&
 | 
	
		
			
				|  |  | -			StringUtils.hasText(request.getParameter(OAuth2ParameterNames.STATE));
 | 
	
		
			
				|  |  | +	static boolean isAuthorizationResponseError(MultiValueMap<String, String> request) {
 | 
	
		
			
				|  |  | +		return StringUtils.hasText(request.getFirst(OAuth2ParameterNames.ERROR)) &&
 | 
	
		
			
				|  |  | +			StringUtils.hasText(request.getFirst(OAuth2ParameterNames.STATE));
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	static OAuth2AuthorizationResponse convert(HttpServletRequest request) {
 | 
	
		
			
				|  |  | -		String code = request.getParameter(OAuth2ParameterNames.CODE);
 | 
	
		
			
				|  |  | -		String errorCode = request.getParameter(OAuth2ParameterNames.ERROR);
 | 
	
		
			
				|  |  | -		String state = request.getParameter(OAuth2ParameterNames.STATE);
 | 
	
		
			
				|  |  | -		String redirectUri = request.getRequestURL().toString();
 | 
	
		
			
				|  |  | +	static OAuth2AuthorizationResponse convert(MultiValueMap<String, String> request, String redirectUri) {
 | 
	
		
			
				|  |  | +		String code = request.getFirst(OAuth2ParameterNames.CODE);
 | 
	
		
			
				|  |  | +		String errorCode = request.getFirst(OAuth2ParameterNames.ERROR);
 | 
	
		
			
				|  |  | +		String state = request.getFirst(OAuth2ParameterNames.STATE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if (StringUtils.hasText(code)) {
 | 
	
		
			
				|  |  |  			return OAuth2AuthorizationResponse.success(code)
 | 
	
	
		
			
				|  | @@ -59,8 +72,8 @@ final class OAuth2AuthorizationResponseUtils {
 | 
	
		
			
				|  |  |  				.state(state)
 | 
	
		
			
				|  |  |  				.build();
 | 
	
		
			
				|  |  |  		} else {
 | 
	
		
			
				|  |  | -			String errorDescription = request.getParameter(OAuth2ParameterNames.ERROR_DESCRIPTION);
 | 
	
		
			
				|  |  | -			String errorUri = request.getParameter(OAuth2ParameterNames.ERROR_URI);
 | 
	
		
			
				|  |  | +			String errorDescription = request.getFirst(OAuth2ParameterNames.ERROR_DESCRIPTION);
 | 
	
		
			
				|  |  | +			String errorUri = request.getFirst(OAuth2ParameterNames.ERROR_URI);
 | 
	
		
			
				|  |  |  			return OAuth2AuthorizationResponse.error(errorCode)
 | 
	
		
			
				|  |  |  				.redirectUri(redirectUri)
 | 
	
		
			
				|  |  |  				.errorDescription(errorDescription)
 |