public override void ChannelRead(IChannelHandlerContext ctx, object msg) { if (msg is IHttpResponse response && WebSocketExtensionUtil.IsWebsocketUpgrade(response.Headers)) { string extensionsHeader = null; if (response.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value)) { extensionsHeader = value.ToString(); } var pipeline = ctx.Pipeline; if (extensionsHeader is object) { List <WebSocketExtensionData> extensions = WebSocketExtensionUtil.ExtractExtensions(extensionsHeader); var validExtensions = new List <IWebSocketClientExtension>(extensions.Count); int rsv = 0; foreach (WebSocketExtensionData extensionData in extensions) { IWebSocketClientExtension validExtension = null; foreach (IWebSocketClientExtensionHandshaker extensionHandshaker in this.extensionHandshakers) { validExtension = extensionHandshaker.HandshakeExtension(extensionData); if (validExtension is object) { break; } } if (validExtension is object && 0u >= (uint)(validExtension.Rsv & rsv)) { rsv = rsv | validExtension.Rsv; validExtensions.Add(validExtension); } else { ThrowHelper.ThrowCodecException_InvalidWSExHandshake(extensionsHeader); } } foreach (IWebSocketClientExtension validExtension in validExtensions) { WebSocketExtensionDecoder decoder = validExtension.NewExtensionDecoder(); WebSocketExtensionEncoder encoder = validExtension.NewExtensionEncoder(); _ = pipeline.AddAfter(ctx.Name, decoder.GetType().Name, decoder); _ = pipeline.AddAfter(ctx.Name, encoder.GetType().Name, encoder); } } _ = pipeline.Remove(ctx.Name); } base.ChannelRead(ctx, msg); }
public void NormalHandshake() { var handshaker = new PerMessageDeflateClientExtensionHandshaker(); IWebSocketClientExtension extension = handshaker.HandshakeExtension( new WebSocketExtensionData(PerMessageDeflateExtension, new Dictionary <string, string>())); Assert.NotNull(extension); Assert.Equal(WebSocketRsv.Rsv1, extension.Rsv); Assert.IsType <PerMessageDeflateDecoder>(extension.NewExtensionDecoder()); Assert.IsType <PerMessageDeflateEncoder>(extension.NewExtensionEncoder()); }
public void CustomHandshake() { var handshaker = new PerMessageDeflateClientExtensionHandshaker(6, true, 10, true, true); var parameters = new Dictionary <string, string> { { ClientMaxWindow, "12" }, { ServerMaxWindow, "10" }, { ClientNoContext, null }, { ServerNoContext, null } }; IWebSocketClientExtension extension = handshaker.HandshakeExtension( new WebSocketExtensionData(PerMessageDeflateExtension, parameters)); Assert.NotNull(extension); Assert.Equal(WebSocketRsv.Rsv1, extension.Rsv); Assert.IsType <PerMessageDeflateDecoder>(extension.NewExtensionDecoder()); Assert.IsType <PerMessageDeflateEncoder>(extension.NewExtensionEncoder()); parameters = new Dictionary <string, string> { { ServerMaxWindow, "10" }, { ServerNoContext, null } }; extension = handshaker.HandshakeExtension( new WebSocketExtensionData(PerMessageDeflateExtension, parameters)); Assert.NotNull(extension); Assert.Equal(WebSocketRsv.Rsv1, extension.Rsv); Assert.IsType <PerMessageDeflateDecoder>(extension.NewExtensionDecoder()); Assert.IsType <PerMessageDeflateEncoder>(extension.NewExtensionEncoder()); parameters = new Dictionary <string, string>(); extension = handshaker.HandshakeExtension( new WebSocketExtensionData(PerMessageDeflateExtension, parameters)); Assert.Null(extension); }