WebSocketServerExtensionHandler Class — netty Architecture
Architecture documentation for the WebSocketServerExtensionHandler class in WebSocketServerExtensionHandler.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD 6784d673_612f_ff75_025d_f5a9bf196079["WebSocketServerExtensionHandler"] 10dea8ae_fcf7_50c6_9656_ba2b3ca180a9["WebSocketServerExtensionHandler.java"] 6784d673_612f_ff75_025d_f5a9bf196079 -->|defined in| 10dea8ae_fcf7_50c6_9656_ba2b3ca180a9 76062812_2285_05df_102e_f575b2fc7896["WebSocketServerExtensionHandler()"] 6784d673_612f_ff75_025d_f5a9bf196079 -->|method| 76062812_2285_05df_102e_f575b2fc7896 d87ca89c_b75d_4af9_10fe_7c79100ed770["channelRead()"] 6784d673_612f_ff75_025d_f5a9bf196079 -->|method| d87ca89c_b75d_4af9_10fe_7c79100ed770 ab797153_cccc_b452_0bd5_51510aadbadf["onHttpRequestChannelRead()"] 6784d673_612f_ff75_025d_f5a9bf196079 -->|method| ab797153_cccc_b452_0bd5_51510aadbadf fa643633_a6ea_3b06_cb15_36cecd3fa364["write()"] 6784d673_612f_ff75_025d_f5a9bf196079 -->|method| fa643633_a6ea_3b06_cb15_36cecd3fa364 96bb3d12_072a_e0a4_aff1_8ed0a900a632["onHttpResponseWrite()"] 6784d673_612f_ff75_025d_f5a9bf196079 -->|method| 96bb3d12_072a_e0a4_aff1_8ed0a900a632 9086a7ff_2993_4d2a_e3f4_c633a73db191["handlePotentialUpgrade()"] 6784d673_612f_ff75_025d_f5a9bf196079 -->|method| 9086a7ff_2993_4d2a_e3f4_c633a73db191
Relationship Graph
Source Code
codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/WebSocketServerExtensionHandler.java lines 52–247
public class WebSocketServerExtensionHandler extends ChannelDuplexHandler {
private final List<WebSocketServerExtensionHandshaker> extensionHandshakers;
private final Queue<List<WebSocketServerExtension>> validExtensions = new ArrayDeque<>(4);
/**
* Constructor
*
* @param extensionHandshakers
* The extension handshaker in priority order. A handshaker could be repeated many times
* with fallback configuration.
*/
public WebSocketServerExtensionHandler(WebSocketServerExtensionHandshaker... extensionHandshakers) {
this.extensionHandshakers = Arrays.asList(checkNonEmpty(extensionHandshakers, "extensionHandshakers"));
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// JDK type checks vs non-implemented interfaces costs O(N), where
// N is the number of interfaces already implemented by the concrete type that's being tested.
// The only requirement for this call is to make HttpRequest(s) implementors to call onHttpRequestChannelRead
// and super.channelRead the others, but due to the O(n) cost we perform few fast-path for commonly met
// singleton and/or concrete types, to save performing such slow type checks.
if (msg != LastHttpContent.EMPTY_LAST_CONTENT) {
if (msg instanceof DefaultHttpRequest) {
// fast-path
onHttpRequestChannelRead(ctx, (DefaultHttpRequest) msg);
} else if (msg instanceof HttpRequest) {
// slow path
onHttpRequestChannelRead(ctx, (HttpRequest) msg);
} else {
super.channelRead(ctx, msg);
}
} else {
super.channelRead(ctx, msg);
}
}
/**
* This is a method exposed to perform fail-fast checks of user-defined http types.<p>
* eg:<br>
* If the user has defined a specific {@link HttpRequest} type i.e.{@code CustomHttpRequest} and
* {@link #channelRead} can receive {@link LastHttpContent#EMPTY_LAST_CONTENT} {@code msg}
* types too, can override it like this:
* <pre>
* public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
* if (msg != LastHttpContent.EMPTY_LAST_CONTENT) {
* if (msg instanceof CustomHttpRequest) {
* onHttpRequestChannelRead(ctx, (CustomHttpRequest) msg);
* } else {
* // if it's handling other HttpRequest types it MUST use onHttpRequestChannelRead again
* // or have to delegate it to super.channelRead (that can perform redundant checks).
* // If msg is not implementing HttpRequest, it can call ctx.fireChannelRead(msg) on it
* // ...
* super.channelRead(ctx, msg);
* }
* } else {
* // given that msg isn't a HttpRequest type we can just skip calling super.channelRead
* ctx.fireChannelRead(msg);
* }
* }
* </pre>
* <strong>IMPORTANT:</strong>
* It already call {@code super.channelRead(ctx, request)} before returning.
*/
protected void onHttpRequestChannelRead(ChannelHandlerContext ctx, HttpRequest request) throws Exception {
List<WebSocketServerExtension> validExtensionsList = null;
if (WebSocketExtensionUtil.isWebsocketUpgrade(request.headers())) {
String extensionsHeader = request.headers().getAsString(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS);
if (extensionsHeader != null) {
List<WebSocketExtensionData> extensions =
WebSocketExtensionUtil.extractExtensions(extensionsHeader);
int rsv = 0;
for (WebSocketExtensionData extensionData : extensions) {
Iterator<WebSocketServerExtensionHandshaker> extensionHandshakersIterator =
extensionHandshakers.iterator();
WebSocketServerExtension validExtension = null;
Source
Frequently Asked Questions
What is the WebSocketServerExtensionHandler class?
WebSocketServerExtensionHandler is a class in the netty codebase, defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/WebSocketServerExtensionHandler.java.
Where is WebSocketServerExtensionHandler defined?
WebSocketServerExtensionHandler is defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/WebSocketServerExtensionHandler.java at line 52.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free