Issue #295 Ensure Jetty Client use of Deflater calls .end() to avoid memory leak (#986)

* Issue #295 Ensure Jetty Client use of Inflater calls .end() to avoid memory leak

Signed-off-by: Sergiu Prodan <p.sergiu92@gmail.com>
This commit is contained in:
Sergiu Prodan 2016-10-06 17:10:37 +03:00 committed by Simone Bordet
parent fc447fe2a3
commit f8b2979a8f
2 changed files with 19 additions and 1 deletions

View File

@ -25,11 +25,12 @@ import java.util.zip.Inflater;
import java.util.zip.ZipException;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.component.Destroyable;
/**
* {@link ContentDecoder} for the "gzip" encoding.
*/
public class GZIPContentDecoder implements ContentDecoder
public class GZIPContentDecoder implements ContentDecoder, Destroyable
{
private final Inflater inflater = new Inflater(true);
private final byte[] bytes;
@ -322,6 +323,12 @@ public class GZIPContentDecoder implements ContentDecoder
flags = 0;
}
@Override
public void destroy()
{
inflater.end();
}
protected boolean isFinished()
{
return state == State.INITIAL;

View File

@ -37,6 +37,7 @@ import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.CountingCallback;
import org.eclipse.jetty.util.component.Destroyable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -465,6 +466,7 @@ public abstract class HttpReceiver
*/
protected void reset()
{
destroyDecoder(decoder);
decoder = null;
}
@ -477,9 +479,18 @@ public abstract class HttpReceiver
*/
protected void dispose()
{
destroyDecoder(decoder);
decoder = null;
}
private static void destroyDecoder(ContentDecoder decoder)
{
if (decoder instanceof Destroyable)
{
((Destroyable)decoder).destroy();
}
}
public boolean abort(HttpExchange exchange, Throwable failure)
{
// Update the state to avoid more response processing.