Skip to content
Snippets Groups Projects
Commit 4351f351 authored by Daniel Gerhardt's avatar Daniel Gerhardt
Browse files

Override JSON Content-Type sent by client for /v2

Fixes regression introduced by commit
7eec95ae.
parent f814ca43
Branches
No related merge requests found
......@@ -100,8 +100,10 @@ import java.util.List;
encoding = "UTF-8"
)
public class AppConfig implements WebMvcConfigurer {
public static final MediaType API_V2_MEDIA_TYPE = new MediaType("application", "vnd.de.thm.arsnova.v2+json");
public static final MediaType API_V3_MEDIA_TYPE = new MediaType("application", "vnd.de.thm.arsnova.v3+json");
public static final String API_V2_MEDIA_TYPE_VALUE = "application/vnd.de.thm.arsnova.v2+json";
public static final String API_V3_MEDIA_TYPE_VALUE = "application/vnd.de.thm.arsnova.v3+json";
public static final MediaType API_V2_MEDIA_TYPE = MediaType.valueOf(API_V2_MEDIA_TYPE_VALUE);
public static final MediaType API_V3_MEDIA_TYPE = MediaType.valueOf(API_V3_MEDIA_TYPE_VALUE);
@Autowired
private Environment env;
......
......@@ -159,7 +159,7 @@ public class LegacyController extends AbstractController {
}
@DeprecatedApi
@RequestMapping(value = "/whoami")
@RequestMapping(value = { "/whoami", "/whoami.json" })
public String redirectWhoami() {
return "forward:/v2/auth/whoami";
}
......
package de.thm.arsnova.web;
import de.thm.arsnova.config.AppConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
/**
* This {@link javax.servlet.Filter} overrides the Content-Type for JSON data sent by the client with the ARSnova API v2
* JSON Content-Type.
*
* @author Daniel Gerhardt
*/
@Component
public class V2ContentTypeOverrideFilter extends OncePerRequestFilter {
private static final Logger logger = LoggerFactory.getLogger(V2ContentTypeOverrideFilter.class);
private final List<String> contentTypeHeaders;
{
contentTypeHeaders = new ArrayList<>();
contentTypeHeaders.add(AppConfig.API_V2_MEDIA_TYPE_VALUE);
}
@Override
protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response,
final FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest requestWrapper = new HttpServletRequestWrapper(request) {
@Override
public String getHeader(final String name) {
String header = super.getHeader(name);
if (header != null && HttpHeaders.CONTENT_TYPE.equals(name)
&& MediaType.APPLICATION_JSON.includes(MediaType.valueOf(header))) {
logger.debug("Overriding {} header: {}", HttpHeaders.CONTENT_TYPE, AppConfig.API_V2_MEDIA_TYPE_VALUE);
return AppConfig.API_V2_MEDIA_TYPE_VALUE;
}
return header;
}
@Override
public String getContentType() {
return getHeader(HttpHeaders.CONTENT_TYPE);
}
@Override
public Enumeration<String> getHeaders(final String name) {
String firstHeader = super.getHeaders(name).nextElement();
if (firstHeader != null && HttpHeaders.CONTENT_TYPE.equals(name)
&& MediaType.APPLICATION_JSON.includes(MediaType.valueOf(firstHeader))) {
logger.debug("Overriding {} header: {}", HttpHeaders.CONTENT_TYPE, AppConfig.API_V2_MEDIA_TYPE_VALUE);
return Collections.enumeration(contentTypeHeaders);
}
return super.getHeaders(name);
}
};
filterChain.doFilter(requestWrapper, response);
}
}
......@@ -86,6 +86,16 @@
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>v2ContentTypeOverrideFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>v2ContentTypeOverrideFilter</filter-name>
<url-pattern>/v2/*</url-pattern>
</filter-mapping>
<session-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment