1 package com.atlassian.plugins.rest.module.filter;
2
3 import com.sun.jersey.spi.container.ContainerRequest;
4 import com.sun.jersey.spi.container.ContainerRequestFilter;
5 import org.apache.commons.lang.StringUtils;
6
7 import static javax.ws.rs.core.HttpHeaders.ACCEPT;
8
9 import javax.ws.rs.core.MediaType;
10
11 import static javax.ws.rs.core.MediaType.*;
12
13 import javax.ws.rs.core.MultivaluedMap;
14 import javax.ws.rs.ext.Provider;
15 import java.util.HashSet;
16 import java.util.Set;
17
18
19
20
21
22
23
24
25
26
27
28 @Provider
29 public class AcceptHeaderJerseyMvcFilter implements ContainerRequestFilter
30 {
31 final static Set<String> ACCEPTED_CONTENT_TYPES = new HashSet<String>()
32 {{
33 add(TEXT_PLAIN);
34 add(TEXT_HTML);
35 add(TEXT_HTML);
36 add(APPLICATION_JSON);
37 add(APPLICATION_XML);
38 add(APPLICATION_ATOM_XML);
39 }};
40
41
42 public ContainerRequest filter(final ContainerRequest request)
43 {
44 final MultivaluedMap<String, String> requestHeaders = request.getRequestHeaders();
45 final String acceptHeader = requestHeaders.getFirst(ACCEPT);
46
47 String fixedHeader = addAppXmlWhenWildcardOnly(acceptHeader);
48 fixedHeader = moveTextHtmlToFront(fixedHeader);
49
50 if (acceptHeader != null && !acceptHeader.equals(fixedHeader))
51 requestHeaders.putSingle(ACCEPT, fixedHeader);
52
53 return request;
54 }
55
56 private String addAppXmlWhenWildcardOnly(final String acceptHeader)
57 {
58 if (StringUtils.contains(acceptHeader, WILDCARD))
59 {
60 for (String contentType : ACCEPTED_CONTENT_TYPES)
61 {
62 if (StringUtils.contains(acceptHeader, contentType))
63 {
64 return acceptHeader;
65 }
66 }
67 return APPLICATION_XML + "," + acceptHeader;
68 }
69 return acceptHeader;
70 }
71
72 private String moveTextHtmlToFront(final String acceptHeader)
73 {
74 if ((StringUtils.contains(acceptHeader, TEXT_HTML) || StringUtils.contains(acceptHeader, WILDCARD))
75 && !StringUtils.startsWith(acceptHeader, TEXT_HTML))
76 {
77 return TEXT_HTML + "," + acceptHeader;
78 }
79 return acceptHeader;
80 }
81 }