mirror of
https://github.com/jetty/jetty.project.git
synced 2025-03-04 12:59:30 +00:00
474068 - Update WebSocket Extension for permessage-deflate draft-22
+ Copying inflated byte buffers + Simplifying Accumulator of buffer/chunks + Removing references to frame compression extensions
This commit is contained in:
parent
2a4095590d
commit
bf81ac9d50
@ -27,7 +27,7 @@ import org.eclipse.jetty.websocket.api.MessageTooLargeException;
|
|||||||
|
|
||||||
public class ByteAccumulator
|
public class ByteAccumulator
|
||||||
{
|
{
|
||||||
private final List<Chunk> chunks = new ArrayList<>();
|
private final List<byte[]> chunks = new ArrayList<>();
|
||||||
private final int maxSize;
|
private final int maxSize;
|
||||||
private int length = 0;
|
private int length = 0;
|
||||||
|
|
||||||
@ -36,13 +36,17 @@ public class ByteAccumulator
|
|||||||
this.maxSize = maxOverallBufferSize;
|
this.maxSize = maxOverallBufferSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addChunk(byte buf[], int offset, int length)
|
public void copyChunk(byte buf[], int offset, int length)
|
||||||
{
|
{
|
||||||
if (this.length + length > maxSize)
|
if (this.length + length > maxSize)
|
||||||
{
|
{
|
||||||
throw new MessageTooLargeException("Frame is too large");
|
throw new MessageTooLargeException("Frame is too large");
|
||||||
}
|
}
|
||||||
chunks.add(new Chunk(buf, offset, length));
|
|
||||||
|
byte copy[] = new byte[length - offset];
|
||||||
|
System.arraycopy(buf,offset,copy,0,length);
|
||||||
|
|
||||||
|
chunks.add(copy);
|
||||||
this.length += length;
|
this.length += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,26 +58,16 @@ public class ByteAccumulator
|
|||||||
public void transferTo(ByteBuffer buffer)
|
public void transferTo(ByteBuffer buffer)
|
||||||
{
|
{
|
||||||
if (buffer.remaining() < length)
|
if (buffer.remaining() < length)
|
||||||
throw new IllegalArgumentException();
|
{
|
||||||
|
throw new IllegalArgumentException(String.format("Not enough space in ByteBuffer remaining [%d] for accumulated buffers length [%d]",
|
||||||
|
buffer.remaining(),length));
|
||||||
|
}
|
||||||
|
|
||||||
int position = buffer.position();
|
int position = buffer.position();
|
||||||
for (Chunk chunk : chunks)
|
for (byte[] chunk : chunks)
|
||||||
{
|
{
|
||||||
buffer.put(chunk.buffer, chunk.offset, chunk.length);
|
buffer.put(chunk,0,chunk.length);
|
||||||
}
|
|
||||||
BufferUtil.flipToFlush(buffer, position);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class Chunk
|
|
||||||
{
|
|
||||||
private final byte[] buffer;
|
|
||||||
private final int offset;
|
|
||||||
private final int length;
|
|
||||||
|
|
||||||
private Chunk(byte[] buffer, int offset, int length)
|
|
||||||
{
|
|
||||||
this.buffer = buffer;
|
|
||||||
this.offset = offset;
|
|
||||||
this.length = length;
|
|
||||||
}
|
}
|
||||||
|
BufferUtil.flipToFlush(buffer,position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ public abstract class CompressExtension extends AbstractExtension
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
byte[] output = new byte[1024];
|
byte[] output = new byte[1024]; // TODO: make configurable size
|
||||||
|
|
||||||
if (inflater.needsInput() && !supplyInput(inflater, buf))
|
if (inflater.needsInput() && !supplyInput(inflater, buf))
|
||||||
{
|
{
|
||||||
@ -163,23 +163,8 @@ public abstract class CompressExtension extends AbstractExtension
|
|||||||
if (read == 0)
|
if (read == 0)
|
||||||
{
|
{
|
||||||
LOG.debug("Decompress: read 0 {}",toDetail(inflater));
|
LOG.debug("Decompress: read 0 {}",toDetail(inflater));
|
||||||
if (inflater.finished() || inflater.needsDictionary())
|
|
||||||
{
|
|
||||||
if (LOG.isDebugEnabled())
|
|
||||||
{
|
|
||||||
LOG.debug("Decompress: finished? {}",toDetail(inflater));
|
|
||||||
}
|
|
||||||
// We are finished ?
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (inflater.needsInput())
|
|
||||||
{
|
|
||||||
if (!supplyInput(inflater, buf))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// do something with output
|
// do something with output
|
||||||
@ -187,7 +172,8 @@ public abstract class CompressExtension extends AbstractExtension
|
|||||||
{
|
{
|
||||||
LOG.debug("Decompressed {} bytes: {}",read,toDetail(inflater));
|
LOG.debug("Decompressed {} bytes: {}",read,toDetail(inflater));
|
||||||
}
|
}
|
||||||
accumulator.addChunk(output,0,read);
|
|
||||||
|
accumulator.copyChunk(output,0,read);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Jetty WebSocket Common : Frame & Message Compression Extension Implementations
|
* Jetty WebSocket Common : Message Compression Extension Implementations
|
||||||
*/
|
*/
|
||||||
package org.eclipse.jetty.websocket.common.extensions.compress;
|
package org.eclipse.jetty.websocket.common.extensions.compress;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user