+ Improved test case handling of frame reading (to prevent future
false failures)
+ Improved AbstractWebSocketConnection handling of close -> disconnect
to only trigger on successful write (or failure) of close frame flush
attempt.
+ Flusher close on all forms of disconnect, even half-closed.
+ Fixing bad assumptions in unit tests where the client would send a few
frames to test the protocol behavior followed by the close frame.
But the test expected the server to initiate the close, but this setup
of the tests would mean that the client initiated the close.
+ Adding testcase for Decoder.TextStream and lots of short messages with
order indicator (for the order in which they were sent)
Test case validates that all of the messages were received, not that
they were in any particular order (as the use of Streaming prevents
reliable ordering)
+ Adding defensive copy of callable array in order to prevent any
possibility of concurrency issues with streams and dispatched
calls.
+ Default SslContextFactory initialized
+ Setting for trustAll configurable via System property
"org.eclipse.jetty.websocket.jsr356.ssl-trust-all"={bool}
Introduced the automatic batch mode, akin to Jetty 8's WebSocket
implementation.
Now, if there are no more frames to process, and the previous frames
have been aggregated, FrameFlusher auto-flushes the aggregated frames.
This simplifies applications because they don't need to call flush()
explicitly.
Refactored FrameFlusher to handle aggregation of frames to support
JSR 356's batch mode.
Now FrameFlusher can aggregate frames as long as the FlushMode they
were sent is AUTO. When a frame that has FlushMode SEND arrives,
it will trigger the flush of the aggregate buffer (and eventually
also other queued frames).
A special BINARY frame is used to implement explicit flush()
invocations.
Refactored OutgoingFrames.outgoingFrame() to take an additional
parameter, FlushMode. This is in preparation for handling this new
parameter in FrameFlusher.
them in order and atomically.
Modified FragmentExtension to use a Queue and IteratingCallback to
make sure that frames are iteratively fragmented.
The creation of the next fragment only happens when there is a callback
from the next outgoing layer.
them in order and atomically.
Refactored PerMessageDeflateExtension and DeflateFrameExtension
introducing superclass CompressExtension that factors in common
functionalities.