1 package com.atlassian.plugins.rest.module.json;
2
3 import com.sun.jersey.spi.container.ContainerRequest;
4 import com.sun.jersey.spi.container.ContainerResponse;
5 import com.sun.jersey.spi.container.ContainerResponseFilter;
6 import org.apache.commons.lang.StringUtils;
7 import org.apache.commons.lang.Validate;
8
9 import static javax.ws.rs.core.HttpHeaders.*;
10
11 import javax.ws.rs.core.MediaType;
12 import javax.ws.rs.core.MultivaluedMap;
13 import javax.ws.rs.ext.Provider;
14
15 @Provider
16 public class JsonWithPaddingResponseFilter implements ContainerResponseFilter {
17 public static final String ATLASSIAN_ALLOW_JSONP = "atlassian.allow.jsonp";
18
19 private final String callbackFunctionParameterName;
20
21 public JsonWithPaddingResponseFilter() {
22 this("jsonp-callback");
23 }
24
25 public JsonWithPaddingResponseFilter(String callbackFunctionParameterName) {
26 Validate.notEmpty(callbackFunctionParameterName);
27 this.callbackFunctionParameterName = callbackFunctionParameterName;
28 }
29
30 public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
31 if (isJsonWithPadding(request, response)) {
32 response.setContainerResponseWriter(new JsonWithPaddingResponseAdapter(getCallbackFunction(request), response.getContainerResponseWriter()));
33 }
34 return response;
35 }
36
37 private boolean isJsonWithPadding(ContainerRequest request, ContainerResponse response) {
38 return isJsonResponse(response) && isCallbackRequest(request);
39 }
40
41 private boolean isCallbackRequest(ContainerRequest request) {
42 return StringUtils.isNotBlank(getCallbackFunction(request));
43 }
44
45 private String getCallbackFunction(ContainerRequest request) {
46 return request.getQueryParameters().getFirst(callbackFunctionParameterName);
47 }
48
49 private boolean isJsonResponse(ContainerResponse response) {
50 final MultivaluedMap<String, Object> httpHeaders = response.getHttpHeaders();
51 return httpHeaders.containsKey(CONTENT_TYPE) && httpHeaders.getFirst(CONTENT_TYPE).equals(MediaType.APPLICATION_JSON_TYPE);
52 }
53 }