summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2014-08-13 12:12:43 +0000
committerRobert Godfrey <rgodfrey@apache.org>2014-08-13 12:12:43 +0000
commitf405780fb9e553e31004777513574a6375687eeb (patch)
tree8a550b06b1e1924f6b0387579d8283618a0aea86 /qpid/java
parent5e959ad4be1c85891a270488040efb07903c265d (diff)
downloadqpid-python-f405780fb9e553e31004777513574a6375687eeb.tar.gz
QPID-5992 : [Java Broker] Allow HTTP management responses to be compressed
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1617707 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java8
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java48
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java6
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java6
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java29
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java8
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java2
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java6
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java3
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java3
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java8
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java4
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java13
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js12
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html4
-rw-r--r--qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/CompressedResponsesRestTest.java141
20 files changed, 291 insertions, 46 deletions
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
index 613218f2fc..d29144f09b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
@@ -111,6 +111,9 @@ public class HttpManagement extends AbstractPluginAdapter<HttpManagement> implem
@ManagedAttributeField
private int _sessionTimeout;
+ @ManagedAttributeField
+ private boolean _compressResponses;
+
private boolean _allowPortActivation;
@ManagedObjectFactoryConstructor
@@ -477,6 +480,12 @@ public class HttpManagement extends AbstractPluginAdapter<HttpManagement> implem
}
@Override
+ public boolean isCompressResponses()
+ {
+ return _compressResponses;
+ }
+
+ @Override
public AuthenticationProvider getAuthenticationProvider(SocketAddress localAddress)
{
return getBroker().getAuthenticationProvider(localAddress);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java
index aff9f3a7e2..9eef1a6e5c 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java
@@ -29,6 +29,7 @@ import org.apache.qpid.server.model.Plugin;
public interface HttpManagementConfiguration<X extends HttpManagementConfiguration<X>> extends Plugin<X>
{
+
@ManagedAttribute( defaultValue = "true" )
boolean isHttpsSaslAuthenticationEnabled();
@@ -44,6 +45,13 @@ public interface HttpManagementConfiguration<X extends HttpManagementConfigurati
@ManagedAttribute( defaultValue = "600" )
public int getSessionTimeout();
+ String HTTP_MANAGEMENT_COMPRESS_RESPONSES = "httpManagement.compressResponses";
+ @ManagedContextDefault(name = HTTP_MANAGEMENT_COMPRESS_RESPONSES)
+ boolean DEFAULT_COMPRESS_RESPONSES = false;
+
+ @ManagedAttribute( defaultValue = "${"+HTTP_MANAGEMENT_COMPRESS_RESPONSES+"}" )
+ public boolean isCompressResponses();
+
String MAX_HTTP_FILE_UPLOAD_SIZE_CONTEXT_NAME = "maxHttpFileUploadSize";
@ManagedContextDefault( name = MAX_HTTP_FILE_UPLOAD_SIZE_CONTEXT_NAME)
static final long DEFAULT_MAX_UPLOAD_SIZE = 100 * 1024;
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java
index ef0a68a42b..847ada3407 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java
@@ -20,17 +20,24 @@
*/
package org.apache.qpid.server.management.plugin;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.security.Principal;
import java.security.PrivilegedAction;
import java.security.cert.X509Certificate;
import java.util.Collections;
+import java.util.zip.GZIPOutputStream;
import javax.security.auth.Subject;
import javax.security.auth.x500.X500Principal;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.codec.binary.Base64;
@@ -71,6 +78,10 @@ public class HttpManagementUtil
private static final String ATTR_SUBJECT = "Qpid.subject";
private static final String ATTR_LOG_ACTOR = "Qpid.logActor";
+ private static final String ACCEPT_ENCODING_HEADER = "Accept-Encoding";
+ private static final String CONTENT_ENCODING_HEADER = "Content-Encoding";
+ private static final String GZIP_CONTENT_ENCODING = "gzip";
+
public static Broker<?> getBroker(ServletContext servletContext)
{
return (Broker<?>) servletContext.getAttribute(ATTR_BROKER);
@@ -219,5 +230,42 @@ public class HttpManagementUtil
return null;
}
+ public static Writer getOutputWriter(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return getOutputWriter(request, response, getManagementConfiguration(request.getServletContext()));
+ }
+
+ public static Writer getOutputWriter(final HttpServletRequest request, final HttpServletResponse response, HttpManagementConfiguration managementConfiguration)
+ throws IOException
+ {
+ Writer writer;
+ writer = new BufferedWriter(new OutputStreamWriter(getOutputStream(request,response, managementConfiguration)));
+ return writer;
+ }
+
+ public static OutputStream getOutputStream(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return getOutputStream(request, response, getManagementConfiguration(request.getServletContext()));
+ }
+
+ public static OutputStream getOutputStream(final HttpServletRequest request, final HttpServletResponse response, HttpManagementConfiguration managementConfiguration)
+ throws IOException
+ {
+ OutputStream outputStream;
+ if(managementConfiguration.isCompressResponses()
+ && Collections.list(request.getHeaderNames()).contains(ACCEPT_ENCODING_HEADER)
+ && request.getHeader(ACCEPT_ENCODING_HEADER).contains(GZIP_CONTENT_ENCODING))
+ {
+ outputStream = new GZIPOutputStream(response.getOutputStream());
+ response.setHeader(CONTENT_ENCODING_HEADER, GZIP_CONTENT_ENCODING);
+ }
+ else
+ {
+ outputStream = response.getOutputStream();
+ }
+ return outputStream;
+ }
}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java
index e6ae47dcff..c45f0c3baa 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java
@@ -18,14 +18,16 @@ package org.apache.qpid.server.management.plugin.servlet;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.qpid.server.management.plugin.HttpManagementUtil;
+
public class DefinedFileServlet extends HttpServlet
{
@@ -57,7 +59,7 @@ public class DefinedFileServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
- final ServletOutputStream output = response.getOutputStream();
+ final OutputStream output = HttpManagementUtil.getOutputStream(request, response);
InputStream fileInput = getClass().getResourceAsStream("/resources/"+_filename);
if(fileInput != null)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
index 618aaed319..3eab80dbd8 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
@@ -22,17 +22,19 @@ package org.apache.qpid.server.management.plugin.servlet;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.qpid.server.management.plugin.HttpManagementUtil;
+
public class FileServlet extends HttpServlet
{
private static final String RESOURCES_PREFIX = "/resources";
@@ -97,7 +99,7 @@ public class FileServlet extends HttpServlet
{
byte[] buffer = new byte[1024];
int read = 0;
- ServletOutputStream output = response.getOutputStream();
+ OutputStream output = HttpManagementUtil.getOutputStream(request, response);
try
{
while((read = fileInput.read(buffer)) != -1)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
index a9e80db3bf..c05814bb9c 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
@@ -21,7 +21,8 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.OutputStream;
+import java.io.Writer;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
@@ -32,16 +33,18 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+
import org.apache.log4j.Logger;
-import org.apache.qpid.server.management.plugin.HttpManagementConfiguration;
-import org.apache.qpid.server.management.plugin.HttpManagementUtil;
-import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
+import org.apache.qpid.server.management.plugin.HttpManagementConfiguration;
+import org.apache.qpid.server.management.plugin.HttpManagementUtil;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
+
public abstract class AbstractServlet extends HttpServlet
{
private static final Logger LOGGER = Logger.getLogger(AbstractServlet.class);
@@ -137,6 +140,18 @@ public abstract class AbstractServlet extends HttpServlet
);
}
+ public Writer getOutputWriter(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return HttpManagementUtil.getOutputWriter(request, response, _managementConfiguration);
+ }
+
+ public OutputStream getOutputStream(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return HttpManagementUtil.getOutputStream(request, response, _managementConfiguration);
+ }
+
/**
* Performs the PUT action as the logged-in {@link Subject}.
* Subclasses commonly override this method
@@ -247,7 +262,7 @@ public abstract class AbstractServlet extends HttpServlet
}
}
- protected void sendJsonResponse(Object object, HttpServletResponse response) throws IOException,
+ protected void sendJsonResponse(Object object, HttpServletRequest request, HttpServletResponse response) throws IOException,
JsonGenerationException, JsonMappingException
{
response.setStatus(HttpServletResponse.SC_OK);
@@ -257,7 +272,7 @@ public abstract class AbstractServlet extends HttpServlet
response.setDateHeader ("Expires", 0);
response.setContentType("application/json");
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, object);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
index 367ed5a2a9..cb41fd9203 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.management.plugin.servlet.rest;
-import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Enumeration;
@@ -31,14 +30,15 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListAccessControlProviderAttributes;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListAuthenticationProviderAttributes;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListBrokerAttribute;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListGroupProviderAttributes;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListTimeZones;
import org.apache.qpid.server.model.Broker;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
public class HelperServlet extends AbstractServlet
{
@@ -122,7 +122,7 @@ public class HelperServlet extends AbstractServlet
return;
}
response.setContentType("application/json");
- final Writer writer = new BufferedWriter(response.getWriter());
+ final Writer writer = getOutputWriter(request, response);
_mapper.writeValue(writer, output);
response.setStatus(HttpServletResponse.SC_OK);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java
index 8b88e51e9c..a7889e4890 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java
@@ -18,7 +18,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.util.Collections;
import java.util.List;
@@ -27,11 +27,12 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.LogManager;
-import org.apache.qpid.server.management.plugin.log.LogFileDetails;
-import org.apache.qpid.server.management.plugin.log.LogFileHelper;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
+import org.apache.qpid.server.management.plugin.log.LogFileDetails;
+import org.apache.qpid.server.management.plugin.log.LogFileHelper;
+
public class LogFileListingServlet extends AbstractServlet
{
private static final long serialVersionUID = 1L;
@@ -56,7 +57,7 @@ public class LogFileListingServlet extends AbstractServlet
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_OK);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, logFiles);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
index 35523ddf0f..b9d58c8868 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
@@ -17,18 +17,21 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.qpid.server.logging.LogRecorder;
+
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
+import org.apache.qpid.server.logging.LogRecorder;
+
public class LogRecordsServlet extends AbstractServlet
{
private static final long serialVersionUID = 2L;
@@ -77,7 +80,7 @@ public class LogRecordsServlet extends AbstractServlet
}
}
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request,response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, logRecords);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java
index 29cc881be7..25d109ba29 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java
@@ -33,11 +33,12 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.codehaus.jackson.map.ObjectMapper;
+
import org.apache.qpid.server.management.plugin.HttpManagementUtil;
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.PreferencesProvider;
import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
-import org.codehaus.jackson.map.ObjectMapper;
public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
@@ -59,7 +60,7 @@ public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
preferences = Collections.<String, Object>emptyMap();
}
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
/*
@@ -88,7 +89,7 @@ public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
preferences = Collections.<String, Object>emptyMap();
}
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
/*
@@ -115,7 +116,7 @@ public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
preferences = Collections.<String, Object>emptyMap();
}
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
private String getAuthenticatedUserName(HttpServletRequest request)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
index ef33a240a9..db58e49eeb 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
@@ -60,7 +60,7 @@ public class MessageContentServlet extends AbstractServlet
{
response.setContentType(finder.getMimeType());
response.setContentLength((int) finder.getSize());
- response.getOutputStream().write(finder.getContent());
+ getOutputStream(request, response).write(finder.getContent());
}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
index 8c77876e1a..8de74d189b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
@@ -18,7 +18,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -85,7 +85,7 @@ public class MessageServlet extends AbstractServlet
response.setDateHeader ("Expires", 0);
response.setContentType("application/json");
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request,response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, messageFinder.getMessageObject());
@@ -119,7 +119,7 @@ public class MessageServlet extends AbstractServlet
response.setHeader("Pragma","no-cache");
response.setDateHeader ("Expires", 0);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request,response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, messages);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
index 55c2bf6901..c84eb3200b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.management.plugin.servlet.rest;
-import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
@@ -69,7 +68,7 @@ public class MetaDataServlet extends AbstractServlet
classToDataMap.put(clazz.getSimpleName(), processCategory(clazz));
}
- final Writer writer = new BufferedWriter(response.getWriter());
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, classToDataMap);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
index 57b3df8050..d96802cc8b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
@@ -16,7 +16,6 @@
*/
package org.apache.qpid.server.management.plugin.servlet.rest;
-import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.security.AccessControlException;
@@ -327,7 +326,7 @@ public class RestServlet extends AbstractServlet
depth, actuals, includeSystemContext));
}
- final Writer writer = new BufferedWriter(response.getWriter());
+ Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, output);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
index 81d67caf96..3dcd4a3978 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
@@ -21,7 +21,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.net.SocketAddress;
import java.security.Principal;
import java.security.SecureRandom;
@@ -100,7 +100,7 @@ public class SaslServlet extends AbstractServlet
outputObject.put("mechanisms", (Object) mechanisms);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
@@ -268,7 +268,7 @@ public class SaslServlet extends AbstractServlet
Map<String, Object> outputObject = new LinkedHashMap<String, Object>();
outputObject.put("challenge", new String(Base64.encodeBase64(challenge)));
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
@@ -290,7 +290,7 @@ public class SaslServlet extends AbstractServlet
outputObject.put("id", id);
outputObject.put("challenge", new String(Base64.encodeBase64(challenge)));
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
index 907610c8d2..7508aa2d0b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
@@ -17,7 +17,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
@@ -55,7 +55,7 @@ public class StructureServlet extends AbstractServlet
Map<String,Object> structure = generateStructure(getBroker(), Broker.class);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, structure);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
index 01657b131d..b782022986 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
@@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
+
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.Broker;
import org.apache.qpid.server.model.PreferencesProvider;
@@ -53,15 +54,15 @@ public class UserPreferencesServlet extends AbstractServlet
String[] pathElements = getPathInfoElements(request);
if (pathElements != null && pathElements.length > 1)
{
- getUserPreferences(pathElements[0], pathElements[1], response);
+ getUserPreferences(pathElements[0], pathElements[1], request, response);
}
else
{
- getUserList(pathElements, response);
+ getUserList(pathElements, request, response);
}
}
- private void getUserPreferences(String authenticationProviderName, String userId, HttpServletResponse response)
+ private void getUserPreferences(String authenticationProviderName, String userId, HttpServletRequest request, HttpServletResponse response)
throws IOException
{
try
@@ -83,10 +84,10 @@ public class UserPreferencesServlet extends AbstractServlet
}
preferences = preferencesProvider.getPreferences(userId);
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
- private void getUserList(String[] pathElements, HttpServletResponse response) throws IOException
+ private void getUserList(String[] pathElements, HttpServletRequest request, HttpServletResponse response) throws IOException
{
List<Map<String, Object>> users = null;
try
@@ -98,7 +99,7 @@ public class UserPreferencesServlet extends AbstractServlet
LOGGER.debug("Bad preferences request", e);
response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
}
- sendJsonResponse(users, response);
+ sendJsonResponse(users, request, response);
}
private PreferencesProvider getPreferencesProvider(String authenticationProviderName)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js
index efe6f4eeff..07c5c25171 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js
@@ -123,7 +123,16 @@ define(["dojo/_base/xhr",
name: "sessionTimeout"
});
}
+ }, {
+ name: "compressResponses",
+ createWidget: function(plugin) {
+ return new dijit.form.CheckBox({
+ required: false,
+ checked: plugin.compressResponses,
+ label: "Compress responses:",
+ name: "compressResponses"});
}
+ }
];
var data = this.managementHttpUpdater.pluginData;
util.showSetAttributesDialog(
@@ -143,6 +152,8 @@ define(["dojo/_base/xhr",
this.sessionTimeout = query(".sessionTimeout", node)[0];
this.httpsSaslAuthenticationEnabled = query(".httpsSaslAuthenticationEnabled", node)[0];
this.httpSaslAuthenticationEnabled = query(".httpSaslAuthenticationEnabled", node)[0];
+ this.compressResponses = query(".compressResponses", node)[0];
+
}
ManagementHttpUpdater.prototype.update = function(syncRequest)
@@ -161,6 +172,7 @@ define(["dojo/_base/xhr",
that.httpsBasicAuthenticationEnabled.innerHTML = showBoolean(that.pluginData.httpsBasicAuthenticationEnabled);
that.httpsSaslAuthenticationEnabled.innerHTML = showBoolean(that.pluginData.httpsSaslAuthenticationEnabled);
that.httpSaslAuthenticationEnabled.innerHTML = showBoolean(that.pluginData.httpSaslAuthenticationEnabled);
+ that.compressResponses.innerHTML = showBoolean(that.pluginData.compressResponses);
that.sessionTimeout.innerHTML = that.pluginData.sessionTimeout;
});
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html
index e91120e43b..b12869981d 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html
@@ -40,6 +40,10 @@
<div class="formLabel-labelCell">Session timeout (s):</div>
<div class="sessionTimeout"></div>
</div>
+ <div class="clear">
+ <div class="formLabel-labelCell">Compress content:</div>
+ <div class="compressResponses"></div>
+ </div>
</div>
<br/>
<div class="dijitDialogPaneActionBar">
diff --git a/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/CompressedResponsesRestTest.java b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/CompressedResponsesRestTest.java
new file mode 100644
index 0000000000..891b44cd25
--- /dev/null
+++ b/qpid/java/systests/src/test/java/org/apache/qpid/systest/rest/CompressedResponsesRestTest.java
@@ -0,0 +1,141 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.rest;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.util.LinkedHashMap;
+import java.util.zip.GZIPInputStream;
+
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.codehaus.jackson.map.ObjectMapper;
+
+import org.apache.qpid.server.model.Plugin;
+import org.apache.qpid.test.utils.TestBrokerConfiguration;
+
+public class CompressedResponsesRestTest extends QpidRestTestCase
+{
+
+ private boolean _compress;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ }
+
+ @Override
+ protected void customizeConfiguration() throws IOException
+ {
+ super.customizeConfiguration();
+ getBrokerConfiguration().setObjectAttribute(Plugin.class,
+ TestBrokerConfiguration.ENTRY_NAME_HTTP_MANAGEMENT,
+ "compressResponses",
+ _compress);
+ }
+
+ public void testCompressionOffAcceptOff() throws Exception
+ {
+ doCompressionTest(false, false);
+ }
+
+ public void testCompressionOffAcceptOn() throws Exception
+ {
+ doCompressionTest(false, true);
+ }
+
+ public void testCompressionOnAcceptOff() throws Exception
+ {
+ doCompressionTest(true, false);
+ }
+
+ public void testCompressionOnAcceptOn() throws Exception
+ {
+ doCompressionTest(true, true);
+
+ }
+
+ private void doCompressionTest(final boolean allowCompression,
+ final boolean acceptCompressed) throws Exception
+ {
+ final boolean expectCompression = allowCompression && acceptCompressed;
+ _compress = allowCompression;
+ super.setUp();
+
+ HttpURLConnection conn = getRestTestHelper().openManagementConnection("/service/metadata", "GET");
+ if(acceptCompressed)
+ {
+ conn.setRequestProperty("Accept-Encoding", "gzip");
+ }
+
+ conn.connect();
+
+ String contentEncoding = conn.getHeaderField("Content-Encoding");
+
+ if(expectCompression)
+ {
+ assertEquals("gzip", contentEncoding);
+ }
+ else
+ {
+ if(contentEncoding != null)
+ {
+ assertEquals("identity", contentEncoding);
+ }
+ }
+
+ ByteArrayOutputStream contentBuffer = new ByteArrayOutputStream();
+
+ InputStream connectionInputStream = conn.getInputStream();
+ byte[] buf = new byte[1024];
+ int read;
+ while((read = connectionInputStream.read(buf))!= -1)
+ {
+ contentBuffer.write(buf,0,read);
+ }
+
+ InputStream jsonStream;
+
+ if(expectCompression)
+ {
+ jsonStream = new GZIPInputStream(new ByteArrayInputStream(contentBuffer.toByteArray()));
+ }
+ else
+ {
+ jsonStream = new ByteArrayInputStream(contentBuffer.toByteArray());
+ }
+
+ ObjectMapper mapper = new ObjectMapper();
+ try
+ {
+ mapper.readValue(jsonStream, LinkedHashMap.class);
+ }
+ catch (JsonParseException | JsonMappingException e)
+ {
+ fail("Message was not in correct format");
+ }
+ }
+
+
+}