diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2014-08-13 12:12:43 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2014-08-13 12:12:43 +0000 |
| commit | f405780fb9e553e31004777513574a6375687eeb (patch) | |
| tree | 8a550b06b1e1924f6b0387579d8283618a0aea86 /qpid/java | |
| parent | 5e959ad4be1c85891a270488040efb07903c265d (diff) | |
| download | qpid-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')
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"); + } + } + + +} |
