public Boolean TryCreateSendBuffer(out WebSocketSendBuffer buffer) { lock ( m_lock ) { if (State >= WebSocketState.Closed) { buffer = default; return(false); } if (IsCompressionEnabled()) { if (m_deflater == null) { m_deflater = new ZLibDeflater(); m_deflater.AddRef(); Closed.ContinueWith(x => m_deflater.Release()); } else { m_deflater.AddRef(); } } } buffer = new WebSocketSendBuffer(m_deflater); return(true); }
private async Task ClosePrivateAsync(WebSocketCloseStatus status, String description) { try { if (State == WebSocketState.Closing) { // Close payload is two bytes containing the close status followed by a UTF8-encoding of the status description, if it exists. using (var buffer = new WebSocketSendBuffer()) { WriteCloseMessage(status, m_closeReceived ? String.Empty : description, buffer); await SendAsync(buffer.ToMessage(WebSocketMessageType.Close, this)); } var receiveCloseTask = Task.CompletedTask; lock ( m_lock ) { if (!m_closeReceived) { receiveCloseTask = ReceiveCloseAsync(); } } await receiveCloseTask; lock ( m_lock ) { if (State == WebSocketState.Closing) { ChangeState(WebSocketState.Closed); } } } } catch (Exception ex) { Abort(ex); } }
public async Task <Boolean> SendAsync(WebSocketMessageType messageType, WebSocketSendBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } try { await SendAsync(buffer.ToMessage(messageType, this)); return(true); } catch (Exception ex) { WebSocketsEventSource.Log.Error(Id, ex); OnException?.Invoke(ex); Abort(ex.Message); return(false); } }
private static unsafe void WriteCloseMessage(WebSocketCloseStatus status, String description, WebSocketSendBuffer buffer) { var span = buffer.GetSpan(2); span[0] = (Byte)(((UInt16)status) >> 8); span[1] = (Byte)(((UInt16)status) & 0xFF); buffer.Advance(2); if (!String.IsNullOrWhiteSpace(description)) { span = buffer.GetSpan(Encoding.GetMaxByteCount(description.Length)); fixed(Byte *fixedSpan = span) fixed(Char * fixedString = description) { var byteCount = Encoding.GetBytes(fixedString, description.Length, fixedSpan, span.Length); buffer.Advance(byteCount); } } }