diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/RequestSizeFilter.java b/guacamole/src/main/java/org/apache/guacamole/rest/RequestSizeFilter.java index cce8a2970..f638224ad 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/RequestSizeFilter.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/RequestSizeFilter.java @@ -21,10 +21,16 @@ package org.apache.guacamole.rest; import java.io.IOException; import java.io.InputStream; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import javax.inject.Inject; import javax.inject.Singleton; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ResourceInfo; +import javax.ws.rs.core.Context; import javax.ws.rs.ext.Provider; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.environment.Environment; @@ -37,6 +43,14 @@ import org.apache.guacamole.properties.LongGuacamoleProperty; @Provider public class RequestSizeFilter implements ContainerRequestFilter { + /** + * Informs the RequestSizeFilter to NOT enforce its request size limits on + * requests serviced by the annotated method. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public static @interface DoNotLimit {} + /** * The default maximum number of bytes to accept within the entity body of * any particular REST request. @@ -61,6 +75,12 @@ public class RequestSizeFilter implements ContainerRequestFilter { @Inject private Environment environment; + /** + * Information describing the resource that was requested. + */ + @Context + private ResourceInfo resourceInfo; + @Override public void filter(ContainerRequestContext context) throws IOException { @@ -74,7 +94,7 @@ public class RequestSizeFilter implements ContainerRequestFilter { } // Ignore request size if limit is disabled - if (maxRequestSize == 0) + if (maxRequestSize == 0 || resourceInfo.getResourceMethod().isAnnotationPresent(DoNotLimit.class)) return; // Restrict maximum size of requests which have an input stream diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/StreamResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/StreamResource.java index 70b2ff026..c33255e3e 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/StreamResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/tunnel/StreamResource.java @@ -31,6 +31,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.StreamingOutput; import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.rest.RequestSizeFilter; import org.apache.guacamole.tunnel.StreamInterceptingTunnel; /** @@ -127,6 +128,7 @@ public class StreamResource { */ @POST @Consumes(MediaType.WILDCARD) + @RequestSizeFilter.DoNotLimit public void setStreamContents(InputStream data) throws GuacamoleException { // Send input over stream