public void SetBuffer(int receiveBufferSize, int sendBufferSize) { ThrowIfReadOnly(); WebSocketHelpers.ValidateBufferSizes(receiveBufferSize, sendBufferSize); this.buffer = null; this.receiveBufferSize = receiveBufferSize; this.sendBufferSize = sendBufferSize; }
public void SetBuffer(int receiveBufferSize, int sendBufferSize, ArraySegment <byte> buffer) { ThrowIfReadOnly(); WebSocketHelpers.ValidateBufferSizes(receiveBufferSize, sendBufferSize); WebSocketHelpers.ValidateArraySegment(buffer, "buffer"); WebSocketBuffer.Validate(buffer.Count, receiveBufferSize, sendBufferSize, false); this.receiveBufferSize = receiveBufferSize; this.sendBufferSize = sendBufferSize; this.buffer = buffer; }
public void AddSubProtocol(string subProtocol) { ThrowIfReadOnly(); WebSocketHelpers.ValidateSubprotocol(subProtocol); // Duplicates not allowed. foreach (string item in requestedSubProtocols) { if (string.Equals(item, subProtocol, StringComparison.OrdinalIgnoreCase)) { throw new ArgumentException(SR.GetString(SR.net_WebSockets_NoDuplicateProtocol, subProtocol), "subProtocol"); } } requestedSubProtocols.Add(subProtocol); }
public ClientWebSocket() { if (Logging.On) { Logging.Enter(Logging.WebSockets, this, ".ctor", null); } if (!WebSocketProtocolComponent.IsSupported) { WebSocketHelpers.ThrowPlatformNotSupportedException_WSPC(); } state = created; options = new ClientWebSocketOptions(); cts = new CancellationTokenSource(); if (Logging.On) { Logging.Exit(Logging.WebSockets, this, ".ctor", null); } }
// Validate the response headers and return the sub-protocol. private string ValidateResponse(HttpWebRequest request, HttpWebResponse response) { // 101 if (response.StatusCode != HttpStatusCode.SwitchingProtocols) { throw new WebSocketException(SR.GetString(SR.net_WebSockets_Connect101Expected, (int)response.StatusCode)); } // Upgrade: websocket string upgradeHeader = response.Headers[HttpKnownHeaderNames.Upgrade]; if (!string.Equals(upgradeHeader, WebSocketHelpers.WebSocketUpgradeToken, StringComparison.OrdinalIgnoreCase)) { throw new WebSocketException(SR.GetString(SR.net_WebSockets_InvalidResponseHeader, HttpKnownHeaderNames.Upgrade, upgradeHeader)); } // Connection: Upgrade string connectionHeader = response.Headers[HttpKnownHeaderNames.Connection]; if (!string.Equals(connectionHeader, HttpKnownHeaderNames.Upgrade, StringComparison.OrdinalIgnoreCase)) { throw new WebSocketException(SR.GetString(SR.net_WebSockets_InvalidResponseHeader, HttpKnownHeaderNames.Connection, connectionHeader)); } // Sec-WebSocket-Accept derived from request Sec-WebSocket-Key string websocketAcceptHeader = response.Headers[HttpKnownHeaderNames.SecWebSocketAccept]; string expectedAcceptHeader = WebSocketHelpers.GetSecWebSocketAcceptString( request.Headers[HttpKnownHeaderNames.SecWebSocketKey]); if (!string.Equals(websocketAcceptHeader, expectedAcceptHeader, StringComparison.OrdinalIgnoreCase)) { throw new WebSocketException(SR.GetString(SR.net_WebSockets_InvalidResponseHeader, HttpKnownHeaderNames.SecWebSocketAccept, websocketAcceptHeader)); } // Sec-WebSocket-Protocol matches one from request // A missing header is ok. It's also ok if the client didn't specify any. string subProtocol = response.Headers[HttpKnownHeaderNames.SecWebSocketProtocol]; if (!string.IsNullOrWhiteSpace(subProtocol) && options.RequestedSubProtocols.Count > 0) { bool foundMatch = false; foreach (string requestedSubProtocol in options.RequestedSubProtocols) { if (string.Equals(requestedSubProtocol, subProtocol, StringComparison.OrdinalIgnoreCase)) { foundMatch = true; break; } } if (!foundMatch) { throw new WebSocketException(SR.GetString(SR.net_WebSockets_AcceptUnsupportedProtocol, string.Join(", ", options.RequestedSubProtocols), subProtocol)); } } return(string.IsNullOrWhiteSpace(subProtocol) ? null : subProtocol); // May be null or valid. }