Handle custom status codes in error handler
Fixes an issue where custom status codes in the error response cause an IllegalArgumentException to be thrown when resolving an HttpStatus. Closes gh-9741
This commit is contained in:
parent
c9a8419e22
commit
d3a3c36ad3
|
@ -48,7 +48,7 @@ public class OAuth2ErrorResponseErrorHandler implements ResponseErrorHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleError(ClientHttpResponse response) throws IOException {
|
public void handleError(ClientHttpResponse response) throws IOException {
|
||||||
if (!HttpStatus.BAD_REQUEST.equals(response.getStatusCode())) {
|
if (HttpStatus.BAD_REQUEST.value() != response.getRawStatusCode()) {
|
||||||
this.defaultErrorHandler.handleError(response);
|
this.defaultErrorHandler.handleError(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,12 +15,19 @@
|
||||||
*/
|
*/
|
||||||
package org.springframework.security.oauth2.client.http;
|
package org.springframework.security.oauth2.client.http;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.client.ClientHttpResponse;
|
||||||
|
import org.springframework.mock.http.MockHttpInputMessage;
|
||||||
import org.springframework.mock.http.client.MockClientHttpResponse;
|
import org.springframework.mock.http.client.MockClientHttpResponse;
|
||||||
import org.springframework.security.oauth2.core.OAuth2AuthorizationException;
|
import org.springframework.security.oauth2.core.OAuth2AuthorizationException;
|
||||||
|
import org.springframework.web.client.UnknownHttpStatusCodeException;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -58,4 +65,49 @@ public class OAuth2ErrorResponseErrorHandlerTests {
|
||||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||||
.hasMessage("[insufficient_scope] The access token expired");
|
.hasMessage("[insufficient_scope] The access token expired");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void handleErrorWhenErrorResponseWithInvalidStatusCodeThenHandled() {
|
||||||
|
CustomMockClientHttpResponse response = new CustomMockClientHttpResponse(new byte[0], 596);
|
||||||
|
assertThatExceptionOfType(UnknownHttpStatusCodeException.class)
|
||||||
|
.isThrownBy(() -> this.errorHandler.handleError(response)).withMessage("596 : [no body]");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class CustomMockClientHttpResponse extends MockHttpInputMessage implements ClientHttpResponse {
|
||||||
|
|
||||||
|
private final int statusCode;
|
||||||
|
|
||||||
|
private CustomMockClientHttpResponse(byte[] content, int statusCode) {
|
||||||
|
super(content);
|
||||||
|
this.statusCode = statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HttpStatus getStatusCode() throws IOException {
|
||||||
|
return HttpStatus.valueOf(getRawStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRawStatusCode() {
|
||||||
|
return this.statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getStatusText() throws IOException {
|
||||||
|
HttpStatus httpStatus = HttpStatus.resolve(this.statusCode);
|
||||||
|
return (httpStatus != null) ? httpStatus.getReasonPhrase() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
try {
|
||||||
|
getBody().close();
|
||||||
|
}
|
||||||
|
catch (IOException ex) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue