|
19 | 19 | import javax.servlet.http.HttpServletResponse; |
20 | 20 | import javax.ws.rs.core.MediaType; |
21 | 21 |
|
| 22 | +import com.fasterxml.jackson.databind.ObjectMapper; |
22 | 23 | import org.orcid.core.manager.impl.OrcidUrlManager; |
| 24 | +import org.orcid.jaxb.model.v3.release.error.OrcidError; |
| 25 | +import org.slf4j.Logger; |
| 26 | +import org.slf4j.LoggerFactory; |
| 27 | +import org.springframework.http.HttpStatus; |
| 28 | +import org.springframework.http.ResponseEntity; |
| 29 | +import org.springframework.security.web.firewall.RequestRejectedException; |
| 30 | +import org.springframework.web.context.request.ServletWebRequest; |
23 | 31 | import org.springframework.web.filter.OncePerRequestFilter; |
24 | 32 |
|
25 | 33 | /** |
|
29 | 37 | */ |
30 | 38 |
|
31 | 39 | public class AcceptFilter extends OncePerRequestFilter { |
32 | | - |
| 40 | + private static final Logger LOGGER = LoggerFactory.getLogger(AcceptFilter.class); |
33 | 41 | private static String[] accpetTypesArray = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML, VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON, TEXT_TURTLE, |
34 | 42 | TEXT_N3, N_TRIPLES, JSON_LD, APPLICATION_RDFXML }; |
35 | 43 |
|
36 | 44 | @Override |
37 | 45 | protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { |
38 | | - String accept = request.getHeader("accept"); |
39 | | - String path = ((HttpServletRequest) request).getRequestURI(); |
40 | | - String contentType = request.getHeader("Content-Type"); |
| 46 | + try { |
| 47 | + String accept = request.getHeader("accept"); |
| 48 | + String contentType = request.getHeader("Content-Type"); |
41 | 49 |
|
42 | | - if (accept == null || accept.equals("*/*")) { |
43 | | - HttpServletRequestWrapper requestWrapper = null; |
44 | | - if (isValidAcceptType(contentType)) |
45 | | - requestWrapper = new AcceptHeaderRequestWrapper(request, contentType); |
46 | | - else |
47 | | - if (isStandardJsonRequest(request)) |
| 50 | + if (accept == null || accept.equals("*/*")) { |
| 51 | + HttpServletRequestWrapper requestWrapper = null; |
| 52 | + if (isValidAcceptType(contentType)) |
| 53 | + requestWrapper = new AcceptHeaderRequestWrapper(request, contentType); |
| 54 | + else if (isStandardJsonRequest(request)) |
48 | 55 | requestWrapper = new AcceptHeaderRequestWrapper(request, MediaType.APPLICATION_JSON); |
49 | 56 | else |
50 | 57 | requestWrapper = new AcceptHeaderRequestWrapper(request, VND_ORCID_XML); |
51 | | - filterChain.doFilter(requestWrapper, response); |
52 | | - } else { |
53 | | - filterChain.doFilter(request, response); |
| 58 | + filterChain.doFilter(requestWrapper, response); |
| 59 | + } else { |
| 60 | + filterChain.doFilter(request, response); |
| 61 | + } |
| 62 | + } catch (RequestRejectedException e) { |
| 63 | + if(request.getRequestURI() != null) { |
| 64 | + logger.warn(request.getRequestURI() + ":" + e.getMessage()); |
| 65 | + } else { |
| 66 | + logger.warn(e.getMessage()); |
| 67 | + } |
| 68 | + ResponseEntity<OrcidError> errorResponseEntity = buildErrorResponseEntity(HttpStatus.BAD_REQUEST, e.getMessage()); |
| 69 | + new ObjectMapper().writeValue(response.getWriter(), errorResponseEntity); |
| 70 | + response.flushBuffer(); |
| 71 | + } catch (IllegalArgumentException e) { |
| 72 | + logger.warn(e.getMessage()); |
| 73 | + ResponseEntity<OrcidError> errorResponseEntity = buildErrorResponseEntity(HttpStatus.BAD_REQUEST, e.getMessage()); |
| 74 | + new ObjectMapper().writeValue(response.getWriter(), errorResponseEntity); |
| 75 | + response.flushBuffer(); |
54 | 76 | } |
55 | 77 | } |
56 | 78 |
|
| 79 | + private ResponseEntity<OrcidError> buildErrorResponseEntity(HttpStatus status, String message) { |
| 80 | + OrcidError orcidError = new OrcidError(); |
| 81 | + orcidError.setResponseCode(status.value()); |
| 82 | + orcidError.setDeveloperMessage(message); |
| 83 | + orcidError.setUserMessage(message); |
| 84 | + ResponseEntity<OrcidError> errorResponseEntity = new ResponseEntity<>(orcidError, status); |
| 85 | + return errorResponseEntity; |
| 86 | + } |
| 87 | + |
57 | 88 | private boolean isStandardJsonRequest(HttpServletRequest request) { |
58 | 89 | String path = OrcidUrlManager.getPathWithoutContextPath(request); |
59 | 90 | return path.startsWith("/oauth/") || path.endsWith("/pubStatus") || path.endsWith("/apiStatus"); |
|
0 commit comments