+ Making WebSocketServletFactory always load a new
WebSocketServerFactory
+ Making WebSocketServerFactory need a ServletContext
to construct it, if appropriate (the WebSocketHandler
approach doesn't use a ServletContext)
+ NativeWebSocketConfiguration is now a bean of
ServerContainer
+ Removed WebSocketServletFactory.init(ServletContext) method
+ Renamed WebSocketServletFactory.init() to .start()
+ Renamed WebSocketServletFactory.cleanup() to .stop()
+ CDI & Websocket now works
+ Using a ServletContextListener now works
+ DecoderFactory and EncoderFactory now work
Improved to the toString and dump output of connections, endpoints and channel to assist with debugging
made the SSL callbacks and runnables Invocable to avoid thread starvation.
+ CompressExtension implementations are now part of the Jetty LifeCycle
+ Deflater and Inflater implementations are only instantiated when
needed.
+ CompressExtension.doStop() LifeCycle will call .end() on instantiated
Deflater and Inflater implementations
+ Removing SessionListener
+ Work in CDI layer for WebSocketContainerScope is reused for
session tracking on the parent scope of the WebSocketSession only.
no more multi-listener behavior
+ Reworked JsrSession ID behavior to not be based on AtomicLong
+ AbstractWebSocketConnection now has .hashCode and .equals
+ Reworked PerMessageDeflateExtensionTest to test with different
modes (http/ws vs https/wss), different messages sizes, and
input buffer sizes (these various configurations do trigger
the reported bug)
+ Made CompressExtension loop over the input buffer if the buffer
happens to not be entirely consumed.
+ WebSocket Connection objects no longer need to
hold a reference to the WebSocketSession object
eliminating another reference to the WebSocketSession
that could hold GC efforts to clean it up
+ Reducing looping references Session -> otherObj -> Session
+ Using Container LifeCycle bean management more consistently
+ All sessions are now child beans
+ A stopped session that hasn't been closed, will auto-close now
+ Using SessionListener more consistently
+ Client ConnectionManager no longer tracks Sessions
+ EventDriver stop cleans up its Session references
+ Moving all DummyConnection test classes to websocket-common:tests
+ Calling onSessionOpen() before App.onOpen()
This helps, as there is a race for the onSessionOpen()
in the original behavior with short lived sockets.
The short lived socket could handle onSessionClosed()
before onSessionOpen() had a chance, making the close
fail to remove the session from openSessions, and then
the slower add occurs later, adding it into the openSession
+ Minor cleanup in IOState
+ Fixed CloseStatus.trimMaxReasonLength() to perform trim correctly
+ Deprecated CloseStatus.trimMaxReasonLength() because it creates
to many objects
+ Removed use of CloseStatus.trimMaxReasonLength() in implementation
code
+ Improved CloseInfo ...
+ tracks reason via utf8 byte array (not String object)
+ trims utf8 byte array as-needed
+ All non-jsr implementations use CloseInfo logic
+ Breaking down jetty-cdi into 3 modules
* cdi-core
* cdi-servlet
* cdi-websocket
+ Creating WebSocketScope for cdi-websocket
+ Creating @Produces for jetty websocket api session
and javax.websocket.Session
+ Unit tests for new functionality
+ Making use of LeakTrackingByteBufferPool more consistent
+ Using MappedByteBufferPool.Tagged where appropriate in test cases
+ Adding leak count tracking to LeakDetector
+ Adding leak count tracking to LeakTrackingByteBufferPool
+ Renaming websocket LeakTrackingBufferPool to
LeakTrackingBufferPoolRule to reflect junit @Rule usage
+ Making websocket LeakTrackingBufferPoolRule always use
MappedByteBufferPool.Tagged
+ Fixed various grammar concerns
Added the concept of UpgradeFrom and UpgradeTo connections that support
transferring a buffer with content before opening new connection.
Aded EndPoint.update method as utility
+ test performs a client upgrade + 2 websocket frames all at once.
not waiting for the upgrade response before sending those frames.
+ currently set to @Ignore until we can address how to copy this extra
buffer information from the Http side to the WebSocket side.
exceptions
+ Making JSR onOpen close and use onError properly, as well we
unwrapping the InvocationTargetException cause as to WHY the call to
onOpen failed.
+ Sets the class loader on an incoming frame to the
class loader that loaded the web socket session
Also-by: Michael MacFadden <michael@macfadden.org>
Signed-off-by: Joakim Erdfelt <joakim.erdfelt@gmail.com>
Introduced parameter "dispatchIO" in the relevant factories so that
they can be configured by users and connections will be created
taking into account this parameter.
For less configurable connection factories, this parameter is
currently hardcoded to either true or false depending on the case.
For example, ALPN and NPN connections have it to false, since they
don't do any blocking operation in onFillable().
+ Fixing onOpen context classloader to be that of the context
that started the WebSocketUpgradeFilter (which will be the
same as the WebAppContext in most cases)
+ Fixing onOpen context classloader to be that of the context
that started the WebSocketUpgradeFilter (which will be the
same as the WebAppContext in most cases)
+ AWSC.Flusher.onFailure() now uses IOState properly.
+ IOState now tracks the final CLOSED CloseInfo atomically
+ Renamed IOState.onReadEOF() to .onReadFailure(Throwable)
+ Added IOState.onWriteFailure(Throwable)
+ 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.
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.
them in order and atomically.
Modified DeflateFrameExtension to use a Queue and IteratingCallback to
make sure that frames are iteratively compressed in chunks.
The compression of the next chunk only happen when there is a callback
from the next outgoing layer.
Fixed by having the Parser release the payload ByteBuffer.
Also reworked WebSocketFrame.reset() method, and made sure
that outgoing frames also don't leak ByteBuffers.