mirror of
https://github.com/geoserver/geoserver-cloud.git
synced 2025-12-08 20:16:08 +00:00
Merge pull request #682 from vuilleumierc/GSBAB-281-18n-service-exception
Handle unsupported language service exception
This commit is contained in:
commit
ba0ef2c323
@ -62,13 +62,13 @@ public class StatusCodeWmsExceptionHandler extends WMSServiceExceptionHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleServiceException(ServiceException exception, Request request) {
|
public void handleServiceException(ServiceException exception, Request request) {
|
||||||
setStausCode(exception, request);
|
setStatusCode(exception, request);
|
||||||
super.handleServiceException(exception, request);
|
super.handleServiceException(exception, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setStausCode(ServiceException exception, Request request) {
|
protected void setStatusCode(ServiceException exception, Request request) {
|
||||||
if (shallSetStatus(request)) {
|
if (shallSetStatus(request)) {
|
||||||
HttpStatus status = determineStatucCode(exception);
|
HttpStatus status = determineStatusCode(exception);
|
||||||
HttpServletResponse response = request.getHttpResponse();
|
HttpServletResponse response = request.getHttpResponse();
|
||||||
response.setStatus(status.value());
|
response.setStatus(status.value());
|
||||||
}
|
}
|
||||||
@ -83,22 +83,31 @@ public class StatusCodeWmsExceptionHandler extends WMSServiceExceptionHandler {
|
|||||||
return propertyResolver.getProperty(ENABLED_PROPERTY, Boolean.class, Boolean.FALSE);
|
return propertyResolver.getProperty(ENABLED_PROPERTY, Boolean.class, Boolean.FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private HttpStatus determineStatucCode(ServiceException exception) {
|
private HttpStatus determineStatusCode(ServiceException exception) {
|
||||||
// RenderedImageMapOutputFormat does not set a ServiceException code in case of
|
final String code = exception.getCode();
|
||||||
// rendering timeout, so check the message:
|
final String message = exception.getMessage();
|
||||||
if (exception.getMessage() != null
|
if (code == null && message != null) {
|
||||||
&& exception.getMessage().startsWith("This request used more time than allowed")) {
|
// Some ServiceException do not have code, so check the message instead
|
||||||
/*
|
if (message.startsWith("This request used more time than allowed")) {
|
||||||
* The 503 (Service Unavailable) status code indicates that the server is
|
/*
|
||||||
* currently unable to handle the request due to a temporary overload or
|
* RenderedImageMapOutputFormat (rendering timeout)
|
||||||
* scheduled maintenance, which will likely be alleviated after some delay.
|
* The 503 (Service Unavailable) status code indicates that the server is
|
||||||
*/
|
* currently unable to handle the request due to a temporary overload or
|
||||||
return HttpStatus.SERVICE_UNAVAILABLE;
|
* scheduled maintenance, which will likely be alleviated after some delay.
|
||||||
|
*/
|
||||||
|
return HttpStatus.SERVICE_UNAVAILABLE;
|
||||||
|
} else if (message.contains("Content has been requested in one of the following languages:")) {
|
||||||
|
// Capabilities_1_3_0_Response (the language requested with the query param ACCEPTLANGUAGES is not
|
||||||
|
// supported)
|
||||||
|
return HttpStatus.BAD_REQUEST;
|
||||||
|
}
|
||||||
|
} else if (code != null) {
|
||||||
|
return switch (code) {
|
||||||
|
case MISSING_PARAMETER_VALUE, INVALID_PARAMETER_VALUE, "InvalidCRS" -> HttpStatus.BAD_REQUEST;
|
||||||
|
case SERVICE_UNAVAILABLE, MAX_MEMORY_EXCEEDED -> HttpStatus.SERVICE_UNAVAILABLE;
|
||||||
|
default -> HttpStatus.INTERNAL_SERVER_ERROR;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
return switch (exception.getCode()) {
|
return HttpStatus.INTERNAL_SERVER_ERROR;
|
||||||
case MISSING_PARAMETER_VALUE, INVALID_PARAMETER_VALUE, "InvalidCRS" -> HttpStatus.BAD_REQUEST;
|
|
||||||
case SERVICE_UNAVAILABLE, MAX_MEMORY_EXCEEDED -> HttpStatus.SERVICE_UNAVAILABLE;
|
|
||||||
default -> HttpStatus.INTERNAL_SERVER_ERROR;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,83 @@
|
|||||||
|
/* (c) 2025 Open Source Geospatial Foundation - all rights reserved
|
||||||
|
* This code is licensed under the GPL 2.0 license, available at the root
|
||||||
|
* application directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geoserver.cloud.wms.app;
|
||||||
|
|
||||||
|
import static org.geoserver.platform.ServiceException.INVALID_PARAMETER_VALUE;
|
||||||
|
import static org.geoserver.platform.ServiceException.MAX_MEMORY_EXCEEDED;
|
||||||
|
import static org.geoserver.platform.ServiceException.MISSING_PARAMETER_VALUE;
|
||||||
|
import static org.geoserver.platform.ServiceException.SERVICE_UNAVAILABLE;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import org.geoserver.config.GeoServer;
|
||||||
|
import org.geoserver.ows.Request;
|
||||||
|
import org.geoserver.platform.ServiceException;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.Arguments;
|
||||||
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
import org.springframework.core.env.PropertyResolver;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
|
public class StatusCodeWmsExceptionHandlerTest {
|
||||||
|
private StatusCodeWmsExceptionHandler handler;
|
||||||
|
private PropertyResolver propertyResolver = mock(PropertyResolver.class);
|
||||||
|
private GeoServer geoServer = mock(GeoServer.class);
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
when(propertyResolver.getProperty("geoserver.wms.exceptions.w3cstatus", Boolean.class, Boolean.FALSE))
|
||||||
|
.thenReturn(true);
|
||||||
|
handler = new StatusCodeWmsExceptionHandler(List.of(), geoServer, propertyResolver);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@MethodSource("exceptionCodeToHttpStatus")
|
||||||
|
void setStatusCodeWithExceptionCodeTest(String exceptionCode, HttpStatus expectedStatus) {
|
||||||
|
ServiceException serviceException = new ServiceException("Some message", exceptionCode);
|
||||||
|
Request request = mock(Request.class);
|
||||||
|
HttpServletResponse response = mock(HttpServletResponse.class);
|
||||||
|
when(request.getHttpResponse()).thenReturn(response);
|
||||||
|
|
||||||
|
handler.setStatusCode(serviceException, request);
|
||||||
|
|
||||||
|
verify(response).setStatus(expectedStatus.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Stream<Arguments> exceptionCodeToHttpStatus() {
|
||||||
|
return Stream.of(
|
||||||
|
Arguments.of(MISSING_PARAMETER_VALUE, HttpStatus.BAD_REQUEST),
|
||||||
|
Arguments.of(INVALID_PARAMETER_VALUE, HttpStatus.BAD_REQUEST),
|
||||||
|
Arguments.of("InvalidCRS", HttpStatus.BAD_REQUEST),
|
||||||
|
Arguments.of(SERVICE_UNAVAILABLE, HttpStatus.SERVICE_UNAVAILABLE),
|
||||||
|
Arguments.of(MAX_MEMORY_EXCEEDED, HttpStatus.SERVICE_UNAVAILABLE),
|
||||||
|
Arguments.of("SomeUnknownCode", HttpStatus.INTERNAL_SERVER_ERROR));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@MethodSource("exceptionMessageToHttpStatus")
|
||||||
|
void setStatusCodeWithExceptionMessageTest(String message, HttpStatus expectedStatus) {
|
||||||
|
ServiceException exception = new ServiceException(message);
|
||||||
|
Request request = mock(Request.class);
|
||||||
|
HttpServletResponse response = mock(HttpServletResponse.class);
|
||||||
|
when(request.getHttpResponse()).thenReturn(response);
|
||||||
|
|
||||||
|
handler.setStatusCode(exception, request);
|
||||||
|
|
||||||
|
verify(response).setStatus(expectedStatus.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Stream<Arguments> exceptionMessageToHttpStatus() {
|
||||||
|
return Stream.of(
|
||||||
|
Arguments.of("This request used more time than allowed", HttpStatus.SERVICE_UNAVAILABLE),
|
||||||
|
Arguments.of("Content has been requested in one of the following languages:", HttpStatus.BAD_REQUEST),
|
||||||
|
Arguments.of("Unknown message", HttpStatus.INTERNAL_SERVER_ERROR));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user